Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => Тема начата: knopix от Июль 03, 2013, 07:59:53 am
-
Здравствуйте...
При проводке документа в MIGO мне необходимо создать ещё один ММ-документ. Для этого в методе "IF_EX_MB_MIGO_BADI~POST_DOCUMENT" я вызываю "BAPI_GOODSMVT_CREATE". После того как отработала БАПИ-шка sy-subrc = 0 и табличка с сообщениями тоже пустая, но в дальнейшем возникает ошибка: "Требуемая функция MB_CREATE_GOODS_MOVEMENT не выполняется № сообщения M7260". ( судя по описанию ругается на то что ФМ "MB_CREATE_GOODS_MOVEMENT" не отработал корректно и поэтому не может быть запущен ФМ "MB_POST_GOODS_MOVEMENT", что вполне логично ). Подскажите, пожалуйста, что я делаю не так и в чём тут проблема.
DATA: mm_header TYPE bapi2017_gm_head_01,
mm_code TYPE bapi2017_gm_code,
mm_item TYPE STANDARD TABLE OF bapi2017_gm_item_create WITH HEADER LINE,
mm_ret TYPE STANDARD TABLE OF bapiret2.
mm_code = '05'.
mm_header-pstng_date = is_mkpf-budat.
и т.д.
LOOP AT it_mseg ASSIGNING <fs_mseg>.
SELECT SINGLE * FROM zblnswrk
WHERE werks EQ <fs_mseg>-werks AND
bwart EQ <fs_mseg>-bwart.
mm_item-material = <fs_mseg>-matnr.
mm_item-move_type = zblnswrk-zbwart.
и т.д.
WRITE <fs_mseg>-ps_psp_pnr TO mm_item-wbs_elem.
APPEND mm_item.
ENDLOOP.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
GOODSMVT_HEADER = mm_header
GOODSMVT_CODE = mm_code
IMPORTING
GOODSMVT_HEADRET = mm_headret
TABLES
GOODSMVT_ITEM = mm_item
RETURN = mm_ret.
READ TABLE mm_ret WITH KEY type = 'E' TRANSPORTING NO FIELDS.
IF sy-subrc IS NOT INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
-
Вообще-то функции создания документа ММ не являются повторно входимыми. Это значит что в рамках сессии пока не выполните коммит первого документа, второй проводить нельзя. В свое время я использовал механизм событий, чтобы провести второй документ. Можно использовать вокрфлов и т.д. Да есть вероятность что второй документ не проведется, но она меленькая по факту. К сожалению два документа ММ одним коммитом не зафиксируешь.
-
Понятно... Спасибо большое за ответ. А расскажите, пожалуйста, поподробнее про "В свое время я использовал механизм событий" или ссылочку где почитать...
-
Понятно... Спасибо большое за ответ. А расскажите, пожалуйста, поподробнее про "В свое время я использовал механизм событий" или ссылочку где почитать...
Ну кажется тут было: http://sapforum.biz/index.php?topic=388.0
-
Добавил в реализующий класс флаг-атрибут и взвожу его в методе "IF_EX_MB_MIGO_BADI~POST_DOCUMENT". Непосредственно вызов "BAPI_GOODSMVT_CREATE" поместил в метод "IF_EX_MB_MIGO_BADI~STATUS_AND_HEADER" (с условием по флагу, естественно). Вроде, работает. Отдал тестить...
-
"IF_EX_MB_MIGO_BADI~STATUS_AND_HEADER" (с условием по флагу, естественно). Вроде, работает. Отдал тестить...
А что за флаг атрибут?
-
Ну, просто в атрибуты реализующего класса добавил свой... attr_post TYPE abap_bool. В методе "IF_EX_MB_MIGO_BADI~POST_DOCUMENT" делаю attr_post = 'X' и далее в "IF_EX_MB_MIGO_BADI~STATUS_AND_HEADER" если attr_post = 'X', то запускаю BAPI (в отладчике посмотрел этот метод запускается в том числе и после метода "POST_DOCUMENT"). Только как-то кривовато получается... сейчас ещё попробую задержку поставить на пару секунд.
-
Только как-то кривовато получается... сейчас ещё попробую задержку поставить на пару секунд.
Ну если что-то выкрутишь интересное пиши, так как задачка такая у многих возникает, с паровозом из более чем одного документа ММ.
-
Удавалось создать несколько документов материала в одном коммите, если перед каждым вызовом BAPI_GOODSMVT_CREATE очищать переменную '(SAPLMBWL)XCOMMIT' :
field-symbols: <_xcommit> type any.
if <_xcommit> is not assigned.
assign ('(SAPLMBWL)XCOMMIT') to <_xcommit>.
endif.
if <_xcommit> is assigned.
clear <_xcommit>.
endif.
-
Удавалось создать несколько документов материала в одном коммите, если перед каждым вызовом BAPI_GOODSMVT_CREATE очищать переменную '(SAPLMBWL)XCOMMIT' :
field-symbols: <_xcommit> type any.
if <_xcommit> is not assigned.
assign ('(SAPLMBWL)XCOMMIT') to <_xcommit>.
endif.
if <_xcommit> is assigned.
clear <_xcommit>.
endif.
А ты где этот код использовал, после вызова BAPI или где-то внутри? Кстати последствий никаких пока не обнаржилсоь?
-
Здравствуйте...
При проводке документа в MIGO мне необходимо создать ещё один ММ-документ. Для этого в методе "IF_EX_MB_MIGO_BADI~POST_DOCUMENT" я вызываю "BAPI_GOODSMVT_CREATE". После того как отработала БАПИ-шка sy-subrc = 0 и табличка с сообщениями тоже пустая, но в дальнейшем возникает ошибка: "Требуемая функция MB_CREATE_GOODS_MOVEMENT не выполняется № сообщения M7260". ( судя по описанию ругается на то что ФМ "MB_CREATE_GOODS_MOVEMENT" не отработал корректно и поэтому не может быть запущен ФМ "MB_POST_GOODS_MOVEMENT", что вполне логично ). Подскажите, пожалуйста, что я делаю не так и в чём тут проблема.
skip
Что то не пойму а почему не написать обертку в виде модуля обновления и вызывать ее в экзите,
в таком случае по комиту либо создастся все либо ничего.
Если так не сработает можно попробовать in background task запустить BAPI.
-
А ты где этот код использовал, после вызова BAPI или где-то внутри? Кстати последствий никаких пока не обнаржилсоь?
Использовал данный способ при обработке входящего IDOC.
Был написан свой ФМ-обработчик айдок, в котором требовалось создавать несколько документов материала в 1 коммите.
Перед каждым вызовом BAPI_GOODSMVT_CREATE очищал глобальную переменную (SAPLMBWL)XCOMMIT.
Проблем не обнаружилось. ;)
-
Если так не сработает можно попробовать in background task запустить BAPI.
Да с этим MB_CREATE_GOODS_MOVEMENT, такие танцы не выходят. Это вообще-то какой-то винегрет из кода старых и новых модулей, поэтому и работает через одно место.