Сегодня я столкнулся с проблемой: как обновить таблицу 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, char, 18)
- .APPEND (ZBAPI_TE_MARAX)
- НОЧАНЖ (BAPIUPDATE; символьный; 1)
Я думаю, мне нужно добавить к нему все поля Z *, прежде чем использовать этот FM? Более того, я не нашел решения обновить поля таблицы. Если я проверяю FM, у меня есть некоторые объекты, но имена столбцов не совпадают. Как мне найти соответствие между полями этого FM и полями в таблице MARA?
Решение 3
Проверяю ли я целостность своего кода? Думаю, я могу использовать простую ВСТАВКУ / ОБНОВЛЕНИЕ (ИЗМЕНИТЬ)? Это должно быть самое простое решение.
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.
Меня интересуют все рекомендации, уроки или советы :)