Hilfe zum FB MATERIAL_MAINTAIN_DARK

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

SAP R/3 Materialwirtschaft: Einkauf, Bestandsführung, Rechnungsprüfung, Inventur, Bewertung, Leistungsabwicklung, Materialstamm...
8 Beiträge • Seite 1 von 1
8 Beiträge Seite 1 von 1

Hilfe zum FB MATERIAL_MAINTAIN_DARK

Beitrag von horst1959 (ForumUser / 20 / 0 / 0 ) »
Hallo,
ich weiß dass ist alles schon 100mal gefragt worden und es gibt auch 100 Antworten.
Die helfen mir alle nicht weiter. Meist nur irgendwo abgeschrieben ohne jeden Test ob der Inhalt auch als Code funktioniert.
Ich suche ein Beispiel für material_maintain_dark in welchem Felder Initial gemacht werden und wo das auch funktioniert.
Buchen klappt. Z_Felder klappen auch nach dem Customizing. Nur leer machen mag der Baustein nicht. Das Beispiel aus dem Netz mit MARC-EISBE habe ich schon getestet -> es geht nicht.

ERP Stand 7.40

Für ein funktionierendes Beispiel wäre ich sehr dankbar.

Gruß
HK

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Hilfe zum FB MATERIAL_MAINTAIN_DARK

Beitrag von black_adept (Top Expert / 4117 / 129 / 952 ) »

Code: Alles auswählen.

REPORT.


DATA: lt_amara_ueb  TYPE STANDARD TABLE OF mara_ueb  WITH NON-UNIQUE DEFAULT KEY,
      lt_amvke_ueb  TYPE STANDARD TABLE OF mvke_ueb  WITH NON-UNIQUE DEFAULT KEY,
      lt_amfieldres TYPE STANDARD TABLE OF mfieldres WITH NON-UNIQUE DEFAULT KEY,
      lt_amerrdat   TYPE STANDARD TABLE OF merrdat   WITH NON-UNIQUE DEFAULT KEY.


PARAMETERS: p_matnr TYPE matnr OBLIGATORY,
            p_vkorg TYPE vkorg OBLIGATORY,
            p_vtweg TYPE vtweg OBLIGATORY.


*--------------------------------------------------------------------*
*Clear MVKE-PRAT1
*--------------------------------------------------------------------*


lt_amara_ueb = VALUE #( ( mandt = sy-mandt
                          matnr = p_matnr
                          pstat = 'V'
                          tcode = 'MM02'
                          tranc = 1
                          d_ind = 1 ) ).

lt_amvke_ueb = VALUE #( ( mandt = sy-mandt
                          matnr = p_matnr
                          vkorg = p_vkorg
                          vtweg = p_vtweg
                          tranc = 1
                          d_ind = 1 ) ).

*--------------------------------------------------------------------*
*Field to reset
*--------------------------------------------------------------------*
lt_amfieldres = VALUE #( ( fname = 'MVKE-PRAT1'
                           tranc = 1
                           d_ind = 1 ) ).

CALL FUNCTION 'MATERIAL_MAINTAIN_DARK'
  EXPORTING
    p_kz_no_warn           = 'X'
    kz_prf                 = 'W'
  TABLES
    amara_ueb              = lt_amara_ueb
    amvke_ueb              = lt_amvke_ueb
    amfieldres             = lt_amfieldres
    amerrdat               = lt_amerrdat
  EXCEPTIONS
    kstatus_empty          = 1
    tkstatus_empty         = 2
    t130m_error            = 3
    internal_error         = 4
    too_many_errors        = 5
    update_error           = 6
    error_propagate_header = 7
    OTHERS                 = 8.
IF sy-subrc <> 0.
  DATA(ls_syst) = syst.
  MESSAGE ID ls_syst-msgid TYPE 'I' NUMBER ls_syst-msgno
      WITH ls_syst-msgv1 ls_syst-msgv2 ls_syst-msgv3 ls_syst-msgv4 DISPLAY LIKE 'E'.
ELSE.
 break-point.  " See errormessage in lt_amerrdat or use utilitfunction to display errortable
ENDIF.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ByteMeBaby

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Hilfe zum FB MATERIAL_MAINTAIN_DARK

Beitrag von horst1959 (ForumUser / 20 / 0 / 0 ) »
Der geht! Ich danke Dir.

Gruß
HK

Re: Hilfe zum FB MATERIAL_MAINTAIN_DARK

Beitrag von ByteMeBaby (ForumUser / 6 / 6 / 1 ) »
Sehr gut formuliert, das hat uns sehr geholfen. Vielen Dank!

Wir wussten nur nicht, wie wir das Feld D_INC einrichten sollten, wenn wir für ein Material mehrere Status initialisieren würden. Das müsste man für jedes zu initialisierende Feld inkrementiell erhöhen.

Fehlerbehandlung sieht schrecklich aus 😁 Das wissen wir. Der Report gilt momentan nur als Vorlage und kümmern uns später um besser Schreiben für die Produktivsetzung.

Vielen Dank wieder Herr Schmöcker

Code: Alles auswählen.

REPORT ZTEST_MATERIAL_UPDATE.

DATA lt_mara_ueb        TYPE STANDARD TABLE OF mara_ueb.
DATA lt_return_messages TYPE STANDARD TABLE OF merrdat.
" fields to reset
DATA lt_mfieldres       TYPE STANDARD TABLE OF mfieldres.

" Fill MARA
lt_mara_ueb = VALUE #( ( mandt = sy-mandt
                         matnr = '000000000010600023'
                         tcode = 'MM02'
                         tranc = 1
                         d_ind = 1 ) ). " Löschindikator, auch inkrementiell zu erhöhen je nach Anzahl der Beiträge

" Fill Fields to reset
lt_mfieldres = VALUE #( tranc = 1 " tranc ist für jede Zeile (jedes neue Material) inkrementiell zu erhöhen
                        ( fname = 'MARA-MSTAE' d_ind = 1 ) " d_ind für jedes zu initialisierende Feld einmal erhöhen
                        ( fname = 'MARA-MSTDE' d_ind = 2 )
                        ( fname = 'MARA-MSTAV' d_ind = 3 )
                        ( fname = 'MARA-MSTDV' d_ind = 4 ) ).

CALL FUNCTION 'MATERIAL_MAINTAIN_DARK'
  EXPORTING  p_kz_no_warn           = 'N'
             kz_prf                 = 'W'
             max_errors             = 0
  TABLES     amara_ueb              = lt_mara_ueb
             amfieldres             = lt_mfieldres
             amerrdat               = lt_return_messages
  EXCEPTIONS kstatus_empty          = 1
             tkstatus_empty         = 2
             t130m_error            = 3
             internal_error         = 4
             too_many_errors        = 5
             update_error           = 6
             error_propagate_header = 7.

IF sy-subrc <> 0.

  CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
  WRITE 'Error occurred -> rollbacked.'.

ELSE.

  LOOP AT lt_return_messages TRANSPORTING NO FIELDS WHERE msgty CA 'EAX'.
  ENDLOOP.

  IF sy-subrc = 0.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
    WRITE 'Error occurred -> rollbacked.'.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
    WRITE 'Delete Done -> committed.'.
  ENDIF.

ENDIF.

Re: Hilfe zum FB MATERIAL_MAINTAIN_DARK

Beitrag von black_adept (Top Expert / 4117 / 129 / 952 ) »
Noch ein paar Hinweise zum FuBa MM_..DARK:
1. Manchmal gibt es in der Verarbeitung "echte" Fehlermeldungen ( z.B. wenn der Kunde in einem der Userexits etwas verprobt und dann eine E-Meldung absetzt ). Damit dumpt der FuBa leider dann und deine Verarbeitung bricht ab. Es ist also immer sinnvoll hier noch eine weitere Exception error_message und sowieso immer die others, falls SAP den mal erweitert, abzufangen
2. Der FuBa sperrt das Material und (Häufig? Immer? ) löst er die Sperren nicht sauber, bis das Programm beendet ist. Dein Programm sollte du nach dem Aufruf diese explizit lösen ( z.b. mit FuBa "DEQUEUE_ALL", wenn du selber keine Sperren setzt, da das dann nur die Relikte aus dem MM_DARK sein können )

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ByteMeBaby

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Hilfe zum FB MATERIAL_MAINTAIN_DARK

Beitrag von ByteMeBaby (ForumUser / 6 / 6 / 1 ) »
black_adept hat geschrieben:
12.02.2025 22:51
Noch ein paar Hinweise zum FuBa MM_..DARK:
1. Manchmal gibt es in der Verarbeitung "echte" Fehlermeldungen ( z.B. wenn der Kunde in einem der Userexits etwas verprobt und dann eine E-Meldung absetzt ). Damit dumpt der FuBa leider dann und deine Verarbeitung bricht ab. Es ist also immer sinnvoll hier noch eine weitere Exception error_message und sowieso immer die others, falls SAP den mal erweitert, abzufangen
2. Der FuBa sperrt das Material und (Häufig? Immer? ) löst er die Sperren nicht sauber, bis das Programm beendet ist. Dein Programm sollte du nach dem Aufruf diese explizit lösen ( z.b. mit FuBa "DEQUEUE_ALL", wenn du selber keine Sperren setzt, da das dann nur die Relikte aus dem MM_DARK sein können )
danke sehr für Feedback. Basierend darauf werden wir unser Code modifizieren.

VG

Re: Hilfe zum FB MATERIAL_MAINTAIN_DARK

Beitrag von ByteMeBaby (ForumUser / 6 / 6 / 1 ) »
black_adept hat geschrieben:
12.02.2025 22:51
Noch ein paar Hinweise zum FuBa MM_..DARK:
1. Manchmal gibt es in der Verarbeitung "echte" Fehlermeldungen ( z.B. wenn der Kunde in einem der Userexits etwas verprobt und dann eine E-Meldung absetzt ). Damit dumpt der FuBa leider dann und deine Verarbeitung bricht ab. Es ist also immer sinnvoll hier noch eine weitere Exception error_message und sowieso immer die others, falls SAP den mal erweitert, abzufangen
2. Der FuBa sperrt das Material und (Häufig? Immer? ) löst er die Sperren nicht sauber, bis das Programm beendet ist. Dein Programm sollte du nach dem Aufruf diese explizit lösen ( z.b. mit FuBa "DEQUEUE_ALL", wenn du selber keine Sperren setzt, da das dann nur die Relikte aus dem MM_DARK sein können )
Hallo wieder,

Wir haben die Updatemethode wie folgt implementiert mit Achtung ihrer Vorschläge. Finden Sie ihn gut oder wäre noch etwas zu verbessern? :)

Code: Alles auswählen.

  METHOD update_material_statuses.
    DATA lv_tranc           TYPE i VALUE 0. " Initialize manual transaction counter
    DATA lt_mara_ueb        TYPE STANDARD TABLE OF mara_ueb.
    DATA lt_marc_ueb        TYPE STANDARD TABLE OF marc_ueb.
    DATA lt_mvke_ueb        TYPE STANDARD TABLE OF mvke_ueb.
    DATA lt_return_messages TYPE STANDARD TABLE OF merrdat.

    find_distrubition_channels( EXPORTING it_matnr               = it_matnr
                                          iv_sales_org           = iv_sales_org
                                IMPORTING it_found_dist_channels = DATA(lt_found_dist_channels) ).

    DATA(lv_first_header_matnr) = VALUE matnr( it_matnr[ 1 ] OPTIONAL ).

    IF lines( lt_found_dist_channels ) = 0.
      " EXIT if no distribution channels found
      lt_return_messages = VALUE #( ( msgid = 'ZCS12H'
                                      msgty = 'E'
                                      msgno = '002' ) ).
      et_return_messages = lt_return_messages.
      RETURN.
    ELSEIF NOT line_exists( lt_found_dist_channels[ matnr = lv_first_header_matnr ] ).
      " EXIT if no distribution channels found for header material
      lt_return_messages = VALUE #( ( msgid = 'ZCS12H'
                                      msgty = 'E'
                                      msgno = '003'
                                      msgv1 = lv_first_header_matnr ) ).
      et_return_messages = lt_return_messages.
      RETURN.
    ENDIF.

    LOOP AT it_matnr INTO DATA(lv_matnr).
      lv_tranc += 1. " Ensuring each MATNR has a unique TRANC

      " Fill MARA
      lt_mara_ueb = VALUE #( BASE lt_mara_ueb
                             ( mandt = sy-mandt
                               matnr = lv_matnr
                               mstae = is_mat_statuses-werkubergr_status
                               mstde = is_mat_statuses-werkubergr_status_gultig_ab
                               mstav = is_mat_statuses-vtl_ubergr_status
                               mstdv = is_mat_statuses-vtl_ubergr_status_gultig_ab
                               tcode = 'MM02'
                               tranc = lv_tranc ) ).

      " Fill MARC
      lt_marc_ueb = VALUE #( BASE lt_marc_ueb
                             ( mandt = sy-mandt
                               matnr = lv_matnr
                               werks = iv_werks
                               mmsta = is_mat_statuses-mat_status
                               mmstd = is_mat_statuses-mat_status_gultig_ab
                               tranc = lv_tranc ) ).

      " Fill MVKE
      lt_mvke_ueb = VALUE #( BASE lt_mvke_ueb
                             FOR s_found_dist_channels IN lt_found_dist_channels
                             WHERE ( matnr = lv_matnr )
                             ( mandt = sy-mandt
                               matnr = lv_matnr
                               vkorg = iv_sales_org
                               vtweg = s_found_dist_channels-dist_channel
                               vmsta = is_mat_statuses-vtl_spez_status
                               vmstd = is_mat_statuses-vtl_spez_status_gultig_ab
                               tranc = lv_tranc ) ).

    ENDLOOP.

    " Update material statuses
    CALL FUNCTION 'MATERIAL_MAINTAIN_DARK'
      EXPORTING  p_kz_no_warn           = 'N'
                 kz_prf                 = 'W'
                 max_errors             = 0
      TABLES     amara_ueb              = lt_mara_ueb
                 amarc_ueb              = lt_marc_ueb
                 amvke_ueb              = lt_mvke_ueb
                 amerrdat               = lt_return_messages
      EXCEPTIONS kstatus_empty          = 1
                 tkstatus_empty         = 2
                 t130m_error            = 3
                 internal_error         = 4
                 too_many_errors        = 5
                 update_error           = 6
                 error_propagate_header = 7
                 OTHERS                 = 99.

    DATA(lv_subrc_func)  = sy-subrc.
    DATA(lv_error_found) = abap_false.

    LOOP AT lt_return_messages TRANSPORTING NO FIELDS WHERE msgty CA 'EAX'.
      lv_error_found = abap_true.
      EXIT.
    ENDLOOP.

    IF lv_error_found = abap_true.
      rollback( ).

      IF lv_subrc_func <> 0.
        lt_return_messages = VALUE #( BASE lt_return_messages
                                      ( msgid = 'ZCS12H'
                                        msgty = 'E'
                                        msgno = '001'
                                        msgv1 = lv_subrc_func ) ).
      ENDIF.

    ELSE.
      commit( ).
      gv_mat_statuses_updated = abap_true.
    ENDIF.

    release_all_locks( ).
    et_return_messages = lt_return_messages.
  ENDMETHOD.

Re: Hilfe zum FB MATERIAL_MAINTAIN_DARK

Beitrag von black_adept (Top Expert / 4117 / 129 / 952 ) »
Ich würd noch die Sonderexception ERROR_MESSAGE hinzufügen.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ByteMeBaby

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Seite 1 von 1

Vergleichbare Themen

4
Antw.
5584
Views
Material Maintain Dark
von queen » 09.06.2008 16:10 • Verfasst in ABAP® für Anfänger
4
Antw.
7200
Views
cl_md_bp_maintain=>maintain / Update BP
von littleJohn » 02.05.2023 10:31 • Verfasst in SAP HANA für Anfänger
1
Antw.
2639
Views
fetch material group,material account 3010 and Plant(WERKS)
von dragospirnut1 » 05.07.2017 12:27 • Verfasst in ABAP Objects®
1
Antw.
1401
Views
ADT + "Darkest Dark Theme" => ObjectSearch findet nichts
von whaslbeck » 30.01.2024 10:19 • Verfasst in ABAP® Core

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Feldwerte vergleichen
vor 3 Stunden von wreichelt 2 / 26
Workflow-Datenfluss mit Multi-Line-Container
vor 6 Stunden von ewx gelöst 2 / 74
Mahnung erstellen
vor 9 Stunden von Sebastian82 4 / 111
Absprung VA02 Position
vor 2 Tagen von gs3rr4 gelöst 3 / 104

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Feldwerte vergleichen
vor 3 Stunden von wreichelt 2 / 26
Workflow-Datenfluss mit Multi-Line-Container
vor 6 Stunden von ewx gelöst 2 / 74
Mahnung erstellen
vor 9 Stunden von Sebastian82 4 / 111
Absprung VA02 Position
vor 2 Tagen von gs3rr4 gelöst 3 / 104

Unbeantwortete Forenbeiträge

OPD Druck im SPOOL
vor 2 Tagen von Manfred K. 1 / 65
Export von Spools in XLSX
vor einer Woche von abapamateur 1 / 729
Feldberechnung ME32K
vor einer Woche von ZF_SAPler 1 / 1322