Я столкнулся с проблемой сегодня: как обновить таблицу мара с полями custo и non custo?Какое лучшее решение для обновления таблицы MARA?
Я нашел некоторые решения, но я хотел бы знать, что является лучшим решением?
Я пришел из модуля HCM. На этом модуле есть изменения. Поэтому я хотел бы обновить мара-таблицу с изменениями журнала, если это возможно.
Контекст:
- Выберите одну запись Mara из таблицы (OK)
- Редактирование полей (OK)
- Проверка для каждого полей, если новое значение уже на значения Доступные
- Обновление таблицы
Логика:
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
" [...]
Для информации у меня есть только информация о маре. Нет данных о связанных таблицах.
Решение 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, модификация будет выполнена через T_CODE (то есть: MM01/02/03). Но, я не знаю, что было начальным T_CODE для каждой строки, и у меня есть функциональные проблемы (например, категория статьи не правильная, ...) в зависимости от используемого T_CODE.
Вы знаете, как я могу пропустить эти проверки? Или известен начальный T_CODE?
Решение 2 - Функциональный модуль BAPI_MATERIAL_SAVEDATA
Использование BAPI_MATERIAL_SAVEDATA
. Это FM позволяет обновлять МАРА таблицу со стандартными полями + Custo (через РАСШИРЕНИЕ (X))
Для получения дополнительной информации, мой BAPI_TE_MARA
& BAPI_TE_MARAX
выглядит следующим образом:
- МАТЕРИАЛ (MATNR, голец, 18)
- .append (ZBAPI_TE_MARAX)
- NoChange (BAPIUPDATE, голец, 1)
Я предполагаю, что я должен добавить каждый Z * поля на нем, прежде чем использовать этот FM? Кроме того, я не нашел решения для обновления полей таблицы. Если я проверю FM, у меня есть несколько объектов, но имена столбцов не совпадают. Как я могу найти сопоставление между полями этого FM и полями на таблице MARA?
Решение 3
Имеет я делаю свои чеки на целостность в моем коде, я думаю, я могу использовать простой INSERT/UPDATE (ИЗМЕНИТЬ)? Это должно быть самое простое решение.
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.
Если вы заинтересованы все рекомендации, учебник или советы :)
Я бы для решения 2. Решение 3 не рекомендуется, если вы не знаете, что никакие другие связанные таблицы не должны быть обновлены тоже. – Christian
Привет. Благодарю. Действительно, никакие другие таблицы не будут задействованы. У меня нет другой информации, кроме таблицы MARA. Способ: массовая загрузка данных мары. Для другого будет использоваться другой программный или ручной процесс. Я не нашел хорошей документации о Sol 2. У вас есть? –
Решение 2 было бы лучшим из трех. BAPI является официальным интерфейсом от SAP, поэтому у вас есть надежное соединение, которое, скорее всего, не изменится после обновлений или обновлений, а внутренние функциональные модули могут измениться. Имена полей в BAPI различаются, но если вы посмотрите на объявление функционального модуля, вы увидите, что они используют одни и те же типы данных. В большинстве случаев этого достаточно, чтобы сопоставить внутреннее имя поля с именем поля BAPI. Обычно BAPI используют стандартные имена полей английского языка, в то время как таблицы часто используют имена полей длиной 5 или 6 символов, часто на немецком языке. –