пятница, 8 ноября 2019 г.

Запись VBKD-TRATY при использовании BAPI_SALESORDER_CREATEFROMDAT2

BAPI  BAPI_SALESORDER_CREATEFROMDAT2  не содержит входящих параметров чтобы сохранять в создаваемом заказе VBKD-TRATY. В иторнетах встречается предложение вместо этого использовать ФМ SD_SALESDOCUMENT_CREATE (который внутри BAPI и вызывается), передавая TRATY в BUSINESS_EX. Это бред, поскольку BUSINESS_EX это исходящий параметр. Еще есть вариант обновлять VBKD-TRATY прямым update после вызова BAPI и сохранения по полученному номеру заказа. Это в принципе вариант, но все можно сделать прямо через BAPI описанным ниже способом.

VBKD может хранить данные как на уровне позиции, так и на уровне заголовка - в последнем случае в VBKD-POSNR  будут 0. От того куда нужно записать TRATY зависит, что нужно расширять и что передавать в параметрах. В примерах будет про позиции, но для заголовка тоже указано что и как.


Рассмотрим по шагам

  1. Нужно расширить структуры на поле ZZTRATY  типа TRATY
    1. Для заголовка расширить структуру VBAKKOM (но не саму, а вложенную в нее структуру VBAKKOZ)
    2. Для позиции - структуру VBAPKOM. Опять же не саму, а вложенную VBAPKOZ.
  2. Также нужно расширить структуры для BAPI-extension на поле ZZTRATY (*X-структуры для создания заказа можно не расширять, но потом пригодится для обновления):
    1. Для заголовка расширяем структуры BAPE_VBAK и BAPE_VBAKX 
    2. Для позиции расширяем структуры BAPE_VBAP и BAPE_VBAPX :

  3. Нужно написать код перемещения значения поля из *KOM-структур в VBKD.
    1. Для заголовка нужно использовать form USEREXIT_MOVE_FIELD_TO_VBAKKOM, расположенный в include MV45AFZB. Несмотря на то, что написано "TO_VBAKKOM", по сути это "FROM_VBAKKOM". Изменять стандарт можно по традиции, запросив ключ на объект, или менее заморочено - через создание неявного внедрения. Код простейший:
      VBKD-TRATY = VBAKKOM-ZZTRATY.
    2. Для позиции нужно использовать form USEREXIT_MOVE_FIELD_TO_VBAPKOM, расположенный в include MV45AFZB.  Код такой же простейший:
      VBKD-TRATY = VBAPKOM-ZZTRATY.
  4. В месте вызова BAPI_SALESORDER_CREATEFROMDAT2 нужно во входящий параметр EXTENSIONIN подать таблицу, сформированную примерно так (для позиции LV_POSNR):
    DATA lt_extension TYPE STANDARD TABLE OF bapiparex WITH DEFAULT KEY.
    DATA ls_bape_vbap TYPE bape_vbap.
    DATA ls_bape_vbapx TYPE bape_vbapx.
    "...
    ls_bape_vbap-posnr = lv_posnr.
    ls_bape_vbap-zztraty = 'ZZZZ'.
    APPEND VALUE #( structure = 'BAPE_VBAP' ) TO lt_extension ASSIGNING FIELD-SYMBOL(<s_ext>).
    CALL METHOD cl_abap_container_utilities=>fill_container_c
    EXPORTING
    im_value = ls_bape_vbap
    IMPORTING
    ex_container = <s_ext>+30.
    ls_bape_vbapx-posnr = lv_posnr.
    ls_bape_vbapx-zztraty = 'X'.
    APPEND VALUE #( structure = 'BAPE_VBAPX' ) TO lt_extension ASSIGNING <s_ext>.
    CALL METHOD cl_abap_container_utilities=>fill_container_c
    EXPORTING
    im_value = ls_bape_vbapx
    IMPORTING
    ex_container = <s_ext>+30.
    "...
    CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2'
    "...
    TABLES
    "...
    extensionin = lt_extension " Customer Enhancement for VBAK, VBAP, VBEP
    .
    Для заголовка вместо BAPE_VBAP и BAPE_VBAPX необходимо использовать BAPE_VBAK и BAPE_VBAKX, соответственно


Комментариев нет:

Отправить комментарий