пятница, 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". Изменять стандарт можно по традиции, запросив ключ на объект, или менее заморочено - через создание неявного внедрения. Код простейший:
    2. Для позиции нужно использовать form USEREXIT_MOVE_FIELD_TO_VBAPKOM, расположенный в include MV45AFZB.  Код такой же простейший:
  4. В месте вызова BAPI_SALESORDER_CREATEFROMDAT2 нужно во входящий параметр EXTENSIONIN подать таблицу, сформированную примерно так (для позиции LV_POSNR): Для заголовка вместо BAPE_VBAP и BAPE_VBAPX необходимо использовать BAPE_VBAK и BAPE_VBAKX, соответственно


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

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