2016-10-31 3 views
2

Я столкнулся с проблемой сегодня: как обновить таблицу мара с полями custo и non custo?Какое лучшее решение для обновления таблицы MARA?

Я нашел некоторые решения, но я хотел бы знать, что является лучшим решением?

Я пришел из модуля HCM. На этом модуле есть изменения. Поэтому я хотел бы обновить мара-таблицу с изменениями журнала, если это возможно.

Контекст:

  1. Выберите одну запись Mara из таблицы (OK)
  2. Редактирование полей (OK)
  3. Проверка для каждого полей, если новое значение уже на значения Доступные
  4. Обновление таблицы

Логика:

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. 

Если вы заинтересованы все рекомендации, учебник или советы :)

+1

Я бы для решения 2. Решение 3 не рекомендуется, если вы не знаете, что никакие другие связанные таблицы не должны быть обновлены тоже. – Christian

+0

Привет. Благодарю. Действительно, никакие другие таблицы не будут задействованы. У меня нет другой информации, кроме таблицы MARA. Способ: массовая загрузка данных мары. Для другого будет использоваться другой программный или ручной процесс. Я не нашел хорошей документации о Sol 2. У вас есть? –

+3

Решение 2 было бы лучшим из трех. BAPI является официальным интерфейсом от SAP, поэтому у вас есть надежное соединение, которое, скорее всего, не изменится после обновлений или обновлений, а внутренние функциональные модули могут измениться. Имена полей в BAPI различаются, но если вы посмотрите на объявление функционального модуля, вы увидите, что они используют одни и те же типы данных. В большинстве случаев этого достаточно, чтобы сопоставить внутреннее имя поля с именем поля BAPI. Обычно BAPI используют стандартные имена полей английского языка, в то время как таблицы часто используют имена полей длиной 5 или 6 символов, часто на немецком языке. –

ответ

0

Наконец, это решение выбрано. Мы использовали BAPI_MATERIAL_SAVEDATA с расширением. я прокомментировал код, чтобы помочь вам, если вы хотите использовать его :)

FORM update_mara 
    USING 
    us_result TYPE mara. "Input entry of mara with masterdata to update in the system 

    DATA : ls_mara   TYPE bapi_te_mara, 
      ls_head   TYPE bapimathead, 
      lt_extensionin TYPE TABLE OF bapiparex, 
      ls_extensionin TYPE bapiparex, 
      lt_extensioninx TYPE TABLE OF bapiparexx, 
      ls_extensioninx TYPE bapiparexx, 
      ls_return   TYPE bapiret2, 
      lv_x    TYPE char41, 
      lv_mara   TYPE string. "Container for all data of ls_mara 

    " MASTERDATA PART 
    MOVE-CORRESPONDING us_result TO ls_mara. 
    ls_mara-material = ls_head-material = us_result-matnr. 
    "At least the mendatory key field: 'material' 

    " DATA PART 
    " Use extension BAPI_TE_MARA 
    ls_extensionin-structure = 'BAPI_TE_MARA'. 
    lv_mara = ls_mara. 
    " Fill data into the extension 
    ls_extensionin+30(960) = lv_mara. 
    APPEND ls_extensionin TO lt_extensionin. 

    " FLAG PART 
    CLEAR lv_x. 
    DO 41 TIMES. "Don't forget to change 'lv_x TYPE char41' if needed 
    CONCATENATE lv_x 'X' INTO lv_x. 
    "Add an 'X' where you want to activate the update 
    "Here, it's for all fields 
    ENDDO. " End of the do loop for all fields of the mara 

    " Use extension BAPI_TE_MARAX 
    ls_extensioninx-structure = 'BAPI_TE_MARAX'. 
    ls_extensioninx-valuepart1(18) = us_result-matnr. 
    ls_extensioninx-valuepart1+19 = lv_x. 
    " The first part (18) of the extensioninx is the matnr and the next ones some 'X' flags to activate the update or not. 
    APPEND ls_extensioninx TO lt_extensioninx. 

    " PROCESS PART 
    CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA' 
    EXPORTING 
     headdata  = ls_head 
    IMPORTING 
     return  = ls_return 
    TABLES 
     extensionin = lt_extensionin 
     extensioninx = lt_extensioninx 
    . 

    IF ls_return-type = 'E'. 
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. 
    ELSE. 
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' 
     EXPORTING 
     wait = 'X'. 
    ENDIF. " End if of check of BAPI result 

ENDFORM.     " UPDATE_MARA 
1

Используйте раствор 1, НО эти пользовательские поля должны назначить группу заранее! Это должно быть сделано в настройке по пути:

Logistic Общие-> Материал Master-> Поле выбора-> Назначение полей в группе выбора полей

Вы должны создать новую группу, если нет групп еще , Эта группа определяет, когда поля будут включать/отключать/активный/неактивный и т.д. Код должен выглядеть следующим образом:

CALL FUNCTION 'MATERIAL_MAINTAIN_DARK' 
EXPORTING 
    sperrmodus = ' ' 
    kz_prf = 'W' 
    max_errors = ' ' 
    p_kz_no_warn = 'X' 
    kz_verw = 'X' 
    kz_aend = 'X' 
    kz_dispo = 'X' 
    kz_test = ' ' 
    flag_muss_pruefen = ' ' 
    call_mode = 'ACT' 
IMPORTING 
    matnr_last = w_matnr_last 
    number_errors_transaction = w_nb_errors 
TABLES 
    amara_ueb = t_amara_ueb 
    amarm_ueb = t_amarm_ueb 
EXCEPTIONS 
    kstatus_empty = 1 
    tkstatus_empty = 2 
    t130m_error = 3 
    internal_error = 4 
    too_many_errors = 5 
    update_error = 6 
OTHERS = 7. 

IF sy-subrc <> 0. 
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO. 
ELSE. 
    COMMIT WORK. 
ENDIF. 
4

Решение 2. Период. Подробности см. В комментариях от @chrisian и @ dirk-trilsbeek.

В отношении вашего последующего вопроса о сопоставлении полей. Более удобные для пользователей имена удобны для людей, использующих BAPI извне SAP, но им трудно сопоставлять поля, которые мы знаем внутри SAP. К счастью, SAP использовал одни и те же элементы данных большую часть времени в этих случаях, так что это один из способов их соответствия. В противном случае разные BAPI часто имеют модули функций преобразования для перевода из полей BAPI в поля базы данных. Для материала BAPI вы упоминаете вы можете проверить Подпрограммы <TABLE> _UEBERGEBEN (это приводит к <TABLE> _TRANSFER), где < Таблица > является MARA, МАРК и т.д. Обратите внимание, что, например, процедура MARA_UEBERGEBEN вызывает FM MAP2I_BAPI_MARA_TO_MARA_UEB и это имеет FM перевод из структуры BAPI в MARA, например NET_WEIGHT соответствует NTGEW.

0

Оба решения 1 и 2 являются хорошими. Вы можете напрямую заполнить поля custo, как вы это делали в решении 3, после того, как вы изменили стандартные поля с одним из FM.

Смежные вопросы