В общем-то на самом деле программа сделана для автоматизации решения создания записей оценки MBEW для материалов, в том случае если запасы приходуются и перемещаются в запасах проектов. При этом возникает ошибка при создании документов резервирования на такие запасы. Вообще-то, я в свое время гнездо не поборол, чтобы они исправили это для резервирований. Так что как обычно пришлось затыкать эту дырку самому.
Собственно подробнее об использовании и причинах написано тут: You are not allowed to view links.
Register or
LoginРаботает или при запуске из диалога, тогда просто подставляем документ материала в котором есть интересующие нас записи материалов или из фона по событию. Если запись оценки для материала есть, то такой материал пропускается. По умолчанию операция выполняется для завода из ссылочного документа материала. Но если задать завод на экране выбора, то операция пройдет для заданного завода. Для работы требуется отдельный вид движения созданный на основе стандартного 561 вида движения материала.
А собственно сам текст программы:
*&**********************************************************************
*& Comments : Создание пустой записи оценки для материалов в таблице
*& MBEW. Вызов возможне как из события так и в диалоге
*& Platform : SAP R/3 V4.6С or later
*& Autor :
*& Date create : 06.09.2007
*& Date change : 06.09.2007
*&**********************************************************************
REPORT ytov_autocreate_mbew MESSAGE-ID yy.
TABLES: mkpf, mseg.
************************************************************************
PARAMETERS: p_mblnr LIKE mkpf-mblnr,
p_mjahr LIKE mkpf-mjahr.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_bwart LIKE mseg-bwart DEFAULT 'Z61' OBLIGATORY,
p_werks LIKE mseg-werks,
p_lgort LIKE mseg-lgort.
************************************************************************
DATA: BEGIN OF t_mseg OCCURS 10,
sel(1) TYPE c,
bldat LIKE mkpf-bldat,
budat LIKE mkpf-budat,
matnr LIKE mseg-matnr,
werks LIKE mseg-werks,
lgort LIKE mseg-lgort,
charg LIKE mseg-charg,
bwtar LIKE mseg-bwtar,
meins LIKE mseg-meins,
bwkey LIKE t001w-bwkey,
END OF t_mseg.
DATA: l_error(1) TYPE c,
event_id LIKE tbtco-eventid,
eventparm LIKE tbtco-eventparm.
DATA: goodsmvt_code LIKE bapi2017_gm_code,
l_mmdoc LIKE bapi2017_gm_head_ret,
l_candoc LIKE bapi2017_gm_head_ret,
goodsmvt_header LIKE bapi2017_gm_head_01,
goodsmvt_item LIKE bapi2017_gm_item_create
OCCURS 0 WITH HEADER LINE,
l_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
************************************************************************
START-OF-SELECTION.
* Вызов программы по событию 'Y_POSTMM_EVENT'
IF sy-batch = 'X' AND ( p_mblnr = space OR p_mjahr = space ).
CALL FUNCTION 'GET_JOB_RUNTIME_INFO'
IMPORTING
eventid = event_id
eventparm = eventparm
EXCEPTIONS
no_runtime_info = 1.
IF sy-subrc = 0.
* Номер документа из параметров
p_mblnr = eventparm(10).
p_mjahr = eventparm+10(4).
ELSE.
* Ошибка получения данных параметров для события
MESSAGE e298 WITH 'Y_POSTMM_EVENT'.
ENDIF.
ENDIF.
* Проверим есть такой докмент уже в базе или нет
l_mmdoc-mat_doc = p_mblnr.
l_mmdoc-doc_year = p_mjahr.
PERFORM wait_update_process USING l_mmdoc
CHANGING l_error.
CHECK l_error = space.
* Прочитать документ материала
PERFORM read_document TABLES t_mseg
USING p_mblnr p_mjahr.
* Провести поступление запаса для создания записи в MBEW
PERFORM post_document TABLES t_mseg
CHANGING l_mmdoc.
* Если проводка успешно прошла тогда отсторнировать проведенный документ
IF l_mmdoc-mat_doc <> space.
PERFORM cancel_document USING l_mmdoc
CHANGING l_candoc.
ENDIF.
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR: p_mblnr.
DATA: flag(1) TYPE c.
flag = 'X'.
EXPORT flag TO MEMORY ID 'MB51_FLAG'.
CALL TRANSACTION 'MB51'.
GET PARAMETER ID 'MBN' FIELD p_mblnr.
GET PARAMETER ID 'MJA' FIELD p_mjahr.
************************************************************************
************************************************************************
*&---------------------------------------------------------------------*
*& Form read_document
*&---------------------------------------------------------------------*
* Прочитать документ с данными для обработки
*----------------------------------------------------------------------*
* <-- PT_MSEG - Список позиций материала для обработки
* --> P_MBLNR - Номер документа ММ
* --> P_MJAHR - Год документа ММ
*----------------------------------------------------------------------*
FORM read_document TABLES pt_mseg STRUCTURE t_mseg
USING p_mblnr
p_mjahr.
DATA l_mbew LIKE mbew.
* Позиции документа ММ
SELECT mk~bldat
mk~budat
ms~matnr
ms~werks
ms~lgort
ms~charg
ms~bwtar
ms~meins
tw~bwkey
INTO CORRESPONDING FIELDS OF TABLE pt_mseg
FROM mkpf AS mk
JOIN mseg AS ms ON ms~mblnr = mk~mblnr AND
ms~mjahr = mk~mjahr
JOIN t001w AS tw ON tw~werks = ms~werks
WHERE mk~mblnr = p_mblnr AND mk~mjahr = p_mjahr AND
ms~xauto = space.
CHECK sy-subrc = 0.
* Проверить какие виды оценки не существуют в MBEW
LOOP AT pt_mseg.
SELECT SINGLE * INTO l_mbew
FROM mbew WHERE matnr = pt_mseg-matnr AND
bwkey = pt_mseg-bwkey AND
bwtar = pt_mseg-bwtar.
IF sy-subrc <> 0. pt_mseg-sel = 'X'. ENDIF.
IF p_werks <> space AND p_lgort <> space.
pt_mseg-werks = p_werks.
pt_mseg-lgort = p_lgort.
ENDIF.
MODIFY pt_mseg.
ENDLOOP.
ENDFORM. " read_document
*&---------------------------------------------------------------------*
*& Form post_document
*&---------------------------------------------------------------------*
* Проводка документа материала начального поступления
*----------------------------------------------------------------------*
* --> PT_MSEG - Позиции для обработки
* <-- P_MMDOC - Номер и год проведенного документа
*----------------------------------------------------------------------*
FORM post_document TABLES pt_mseg STRUCTURE t_mseg
CHANGING p_mmdoc STRUCTURE bapi2017_gm_head_ret.
DATA: lp_testrun LIKE bapi2017_gm_gen-testrun.
CLEAR: p_mmdoc, goodsmvt_item, goodsmvt_header, l_return.
REFRESH: goodsmvt_item, l_return.
* Позиции документа
LOOP AT pt_mseg WHERE sel = 'X'.
goodsmvt_item-move_type = p_bwart. "Вид движения
goodsmvt_item-material = pt_mseg-matnr. "Код материала
goodsmvt_item-plant = pt_mseg-werks. "Завод
goodsmvt_item-stge_loc = pt_mseg-lgort. "Склад
goodsmvt_item-batch = pt_mseg-charg. "Партия
goodsmvt_item-val_type = pt_mseg-bwtar. "Вид оценки
goodsmvt_item-entry_qnt = '1'. "Количество = 1
goodsmvt_item-entry_uom = pt_mseg-meins. "ЕдИзм
APPEND goodsmvt_item.
ENDLOOP.
CHECK sy-subrc = 0.
* Заголовок документа
goodsmvt_header-pstng_date = pt_mseg-budat. "Дата проводки
goodsmvt_header-doc_date = pt_mseg-bldat. "Дата документа
goodsmvt_header-pr_uname = sy-uname. "Имя пользователя
CONCATENATE p_mblnr '/' p_mjahr INTO goodsmvt_header-ref_doc_no.
goodsmvt_header-header_txt = 'Create MBEW'.
goodsmvt_code = '05'.
lp_testrun = space.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = goodsmvt_header
goodsmvt_code = goodsmvt_code
testrun = lp_testrun
IMPORTING
goodsmvt_headret = p_mmdoc
TABLES
goodsmvt_item = goodsmvt_item
return = l_return
EXCEPTIONS
OTHERS = 1.
* Проверим как прошло сохранение документа
IF sy-subrc <> 0.
CLEAR: p_mmdoc.
l_return-type = 'E'.
l_return-message = 'FM internal error on BAPI_GOODSMVT_CREATE'.
ROLLBACK WORK.
ELSE.
LOOP AT l_return WHERE type = 'E' OR type = 'A'.
CLEAR: p_mmdoc.
MESSAGE ID l_return-id TYPE l_return-type NUMBER l_return-number
WITH l_return-message_v1 l_return-message_v2
l_return-message_v3 l_return-message_v4.
ENDLOOP.
IF sy-subrc = 4. COMMIT WORK AND WAIT. ELSE. ROLLBACK WORK. ENDIF.
ENDIF.
ENDFORM. " post_document
*&---------------------------------------------------------------------*
*& Form cancel_document
*&---------------------------------------------------------------------*
* Сторнировать документ
*----------------------------------------------------------------------*
* --> P_MMDOC - Номер и год проведенного документа
* <-- P_CANDOC - Номер и год сторнированного документа
*----------------------------------------------------------------------*
FORM cancel_document USING p_mmdoc STRUCTURE bapi2017_gm_head_ret
CHANGING p_candoc STRUCTURE bapi2017_gm_head_ret.
DATA: p_error(1) TYPE c.
PERFORM wait_update_process USING p_mmdoc
CHANGING p_error.
CHECK p_error = space.
CALL FUNCTION 'BAPI_GOODSMVT_CANCEL'
EXPORTING
materialdocument = p_mmdoc-mat_doc
matdocumentyear = p_mmdoc-doc_year
IMPORTING
goodsmvt_headret = p_candoc
TABLES
return = l_return.
* Проверим как прошло сохранение документа
IF sy-subrc <> 0.
CLEAR: p_candoc.
l_return-type = 'E'.
l_return-message = 'FM internal error on BAPI_GOODSMVT_CANCEL'.
ROLLBACK WORK.
ELSE.
LOOP AT l_return WHERE type = 'E' OR type = 'A'.
CLEAR: p_candoc.
MESSAGE ID l_return-id TYPE l_return-type NUMBER l_return-number
WITH l_return-message_v1 l_return-message_v2
l_return-message_v3 l_return-message_v4.
ENDLOOP.
IF sy-subrc = 4. COMMIT WORK AND WAIT. ELSE. ROLLBACK WORK. ENDIF.
ENDIF.
ENDFORM. " cancel_document
*&---------------------------------------------------------------------*
*& Form wait_update_process
*&---------------------------------------------------------------------*
* Подождать пока пройдут все процессы обновления документа
*----------------------------------------------------------------------*
* --> P_MMDOC - Номер и год проведенного документа
*----------------------------------------------------------------------*
FORM wait_update_process USING p_mmdoc STRUCTURE bapi2017_gm_head_ret
CHANGING p_error.
CALL FUNCTION 'ENQUEUE_EMMKPF'
EXPORTING
mblnr = p_mmdoc-mat_doc
mjahr = p_mmdoc-doc_year
_wait = 'X'
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
p_error = 'X'.
MESSAGE e269 WITH p_mmdoc-mat_doc p_mmdoc-doc_year.
ELSE.
p_error = space.
CALL FUNCTION 'DEQUEUE_EMMKPF'
EXPORTING
mblnr = p_mmdoc-mat_doc
mjahr = p_mmdoc-doc_year.
ENDIF.
ENDFORM. " wait_update_process
И тексты критериев выбора:
P_BWART Вид движения
P_LGORT Склад
P_MBLNR Документ материала
P_MJAHR Год документа материала
P_WERKS Завод