我今天面临一个问题:如何使用自定义和非自定义字段更新 MARA 表?
我找到了一些解决方案,但我想知道什么是最好的解决方案。
我来自 HCM 模块。在这个模块上,我们有变更日志。因此,如果可能的话,我想用日志更改来更新 MARA 表。
语境:
- 从表中选择一个 MARA 条目(确定)
- 编辑字段(确定)
- 检查每个字段,如果新值已经在可用值上
- 更新表格
逻辑:
DATA:
lt_mara TYPE TABLE OF mara,
ls_mara TYPE mara.
lv_matnr = '000000000024856';
* Seelct data
"" matnr from CONVERSION_EXIT_MATN1_INPUT
SELECT SINGLE * INTO ls_mara FROM mara WHERE matnr = lv_matnr.
* Modification
ls_mara-vlumn = '999.9'.
"ls_mara-z* = '...'.
* Checks : volumn is numeric, ...
" [...]
* Update
" [...]
我只有关于 MARA 的信息,没有关于相关表格的数据。
解决方案 1 -MATERIAL_MAINTAIN_DARK
使用功能模块MATERIAL_MAINTAIN_DARK
。
CALL FUNCTION 'MATERIAL_MAINTAIN_DARK'
EXPORTING
kz_activ_cad = blank
flag_muss_pruefen = fest_x
sperrmodus = fest_e
max_errors = 0
p_kz_no_warn = fest_x " 'N' ?
kz_prf = blank " 's' ?
kz_verw = fest_x
kz_aend = fest_x
kz_dispo = fest_x
kz_test = blank
kz_mdip = blank
kz_mprp = blank
kz_ale = blank
kz_actv = blank
TABLES
AMARA_UEB = TMARA_UEB
AMERRDAT = lt_amerrdat
EXCEPTIONS
OTHERS = 7.
" Loop lt_amerrdat.
" CALL FUNCTION 'RPY_MESSAGE_COMPOSE' [...]
" WRITE:/ lv_errmsg.
" ROLLBACK WORK.
" or
" CALL FUNCTION 'DB_COMMIT'.
(我使用了这种代码逻辑https://archive.sap.com/discussions/thread/169786)
问题:我成功执行了代码,但现在我发现了一些功能错误。如果我正确理解了这个FM的功能,修改将通过一个tcode(即:MM01/02/03)来执行。但是,我不知道每一行的初始 tcode 是什么,并且我遇到了功能问题(即:文章类别不正确,...),具体取决于所使用的 tcode。
你知道我怎样才能跳过这些检查吗?或者知道最初的 tcode?
解决方案 2 -BAPI_MATERIAL_SAVEDATA
使用功能模块BAPI_MATERIAL_SAVEDATA
。此 FM 允许使用标准字段 + 自定义更新 MARA 表(通过 EXTENSION(X))
有关信息,我的BAPI_TE_MARA
&BAPI_TE_MARAX
看起来像:
- 材料(MATNR,字符,18)
- .APPEND (ZBAPI_TE_MARAX)
- NOCHANGE(BAPIUPDATE,字符,1)
我想我必须在它上面添加每个 Z* 字段,然后才能使用这个 FM ?此外,我没有找到更新表字段的解决方案。如果我正在检查 FM,我有一些对象,但列名不一样。如何找到此 FM 上的字段与 MARA 表上的字段之间的映射?
解决方案 3
我是否对代码的完整性进行了检查,我想我可以使用简单的 INSERT/UPDATE (MODIFY) 吗?这应该是最简单的解决方案。
CONCATENATE sy-mandt lv_matnr INTO lv_mara_key.
" Lock object
CALL FUNCTION 'ENQUEUE_E_TABLE'
EXPORTING
MODE_RSTABLE = 'E'
tabname = 'MARA'
varkey = lv_mara_key
EXCEPTIONS
foreign_lock = 1 system_failure = 2 OTHERS = 3.
ls_mara-ernam = sy-uname.
" ...
" std & custo
MODIFY mara FROM ls_mara.
" Unlock object
CALL FUNCTION 'DEQUEUE_E_TABLE'
EXPORTING
MODE_RSTABLE = 'E'
tabname = 'MARA'
varkey = lv_mara_key
EXCEPTIONS
foreign_lock = 1 system_failure = 2 OTHERS = 3.
我对所有建议、教程或建议感兴趣 :)