2023 Jan 12 9:22 AM
I am using BAPI_MATERIAL_SAVEDATA to update the value of custom Z field in MARA table .
after executing the program the existing value of the Z field was erased but the new value is not updating.
REPORT zr_mara_zdcon_update.
TYPES : BEGIN OF ts_input,
matnr TYPE matnr,
END OF ts_input.
DATA : lt_input TYPE TABLE OF ts_input WITH HEADER LINE.
SELECT SINGLE matnr FROM mara INTO lt_input
WHERE zzcust = '30'.
PERFORM update_mara USING lt_input-matnr.
*ENDLOOP.
*&---------------------------------------------------------------------*
*& Form update_mara
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM update_mara USING lv_matnr TYPE matnr.
TABLES:
bapimathead, "Headerdata
bapi_mara, "Clientdata
bapi_marax, "Clientdatax
bapi_marc, "Plantdata
bapi_marcx, "Plantdatax
bapi_makt, "Material description
bapiparex, "Extensionstruktur
bapiparexx,
bapiret2. "Return messages
DATA:
bapi_te_mara TYPE bapi_te_mara,
bapi_te_marax TYPE bapi_te_marax,
v_file TYPE string.
*to store the output data
DATA:BEGIN OF lt_material_number OCCURS 0.
INCLUDE STRUCTURE bapimatinr.
DATA:END OF lt_material_number.
DATA:BEGIN OF lt_bapiparex OCCURS 0.
INCLUDE STRUCTURE bapiparex.
DATA:END OF lt_bapiparex.
DATA:BEGIN OF lt_bapiparexx OCCURS 0.
INCLUDE STRUCTURE bapiparexx.
DATA:END OF lt_bapiparexx.
DATA:BEGIN OF lt_return2 OCCURS 0.
INCLUDE STRUCTURE bapiret2.
DATA:END OF lt_return2.
DATA:BEGIN OF lt_return OCCURS 0.
INCLUDE STRUCTURE bapiret1.
DATA:END OF lt_return.
lt_material_number-material = lv_matnr.
bapimathead-basic_view = 'X'.
* bapimathead-sales_view = 'X'.
bapimathead-material = lt_material_number-material.
bapi_te_mara-material = lt_material_number-material.
bapi_te_mara-zzcust = '25'.
bapi_te_marax-material = lt_material_number-material.
bapi_te_marax-zzcust = 'X'.
lt_bapiparex-structure = 'BAPI_TE_MARA'.
lt_bapiparex-valuepart1 = bapi_te_mara.
lt_bapiparex-valuepart2 = bapi_te_mara.
APPEND lt_bapiparex.
lt_bapiparexx-structure = 'BAPI_TE_MARAX'.
lt_bapiparexx-valuepart1 = bapi_te_marax.
* lt_bapiparexx-valuepart2 = bapi_te_marax.
APPEND lt_bapiparexx.
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
headdata = bapimathead
clientdata = bapi_mara
clientdatax = bapi_marax
IMPORTING
return = lt_return2
TABLES
extensionin = lt_bapiparex
extensioninx = lt_bapiparexx.
IF lt_return2-type CA 'EA'.
*--Roll Back changes
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
*--Commit
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = abap_true
IMPORTING
return = lt_return2.
ENDIF.
WRITE :'DONE'.
ENDFORM. "update_mara
2023 Jan 12 9:24 AM
2023 Jan 12 10:28 AM
Hello
The only problem I could spot in your code is double assignment of BAPI_TE_MARA:
lt_bapiparex-structure = 'BAPI_TE_MARA'.
lt_bapiparex-valuepart1 = bapi_te_mara.
lt_bapiparex-valuepart2 = bapi_te_mara.
APPEND lt_bapiparex.
As you have only one, short custom field in BAPI_TE_MARA, which is ZZCUST of 2 chars, BAPI_TE_MARA fits VALUEPART1. So replace that piece of code with:
lt_bapiparex-structure = 'BAPI_TE_MARA'.
lt_bapiparex-valuepart1 = bapi_te_mara.
APPEND lt_bapiparex.
If that doesn't help, debug the form routines EXTENSIONIN_UBERGEBEN and KUNDENFELDER_X_AUSWERTEN that analyze and process EXTENSIONIN and EXTENSIONINX tables.
Best regards
Dominik Tylczynski