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
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.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ByteMeBaby
danke sehr für Feedback. Basierend darauf werden wir unser Code modifizieren.black_adept hat geschrieben: ↑12.02.2025 22:51Noch 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,black_adept hat geschrieben: ↑12.02.2025 22:51Noch 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 )
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.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
ByteMeBaby