Тут по случаю надо было быстро накидать пример программки, которая по документу ММ, для поступившего материала делает перемещение всего поступившего запаса на другой завод/склад. В общем за склетик можно использовать, запас поступивший по документу ММ вроде как перемещает куда скажешь. Можно допиливать и даже нужно, например проверку на получение серийных номеров и документа ММ (там может быть не SER03, а другая табличка, зависит от профиля серийных номеров), потом опять же можно добить если это особые запасы и т.д, да и много чего другого...
REPORT yuuk_move_materials .
TABLES: mseg.
SELECT-OPTIONS: p_mblnr FOR mseg-mblnr OBLIGATORY MEMORY ID mbn.
PARAMETERS p_mjahr LIKE mseg-mjahr OBLIGATORY MEMORY ID mja.
SELECTION-SCREEN BEGIN OF BLOCK block001 WITH FRAME TITLE text-001.
PARAMETERS: p_bwart LIKE mseg-bwart DEFAULT '301' OBLIGATORY,
p_umwrk LIKE mseg-umwrk OBLIGATORY MEMORY ID wrk,
p_umlgo LIKE mseg-umlgo OBLIGATORY MEMORY ID lag.
SELECTION-SCREEN END OF BLOCK block001.
************************************************************************
DATA: l_goodsmvt_header LIKE bapi2017_gm_head_01,
l_goodsmvt_headret LIKE bapi2017_gm_head_ret,
lt_goodsmvt_item LIKE bapi2017_gm_item_create
OCCURS 0 WITH HEADER LINE,
lt_goodsmvt_serialnumber LIKE bapi2017_gm_serialnumber
OCCURS 0 WITH HEADER LINE,
lt_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
DATA: l_count LIKE sy-tabix,
sy_tabix LIKE sy-tabix,
l_marc LIKE marc,
l_testrun LIKE bapi2017_gm_gen-testrun,
lt_mkpf LIKE mkpf OCCURS 1 WITH HEADER LINE,
lt_mseg LIKE mseg OCCURS 1 WITH HEADER LINE,
lt_sernr LIKE objk OCCURS 1 WITH HEADER LINE.
************************************************************************
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_mkpf
FROM mkpf WHERE mblnr IN p_mblnr AND
mjahr = p_mjahr.
IF sy-subrc <> 0. EXIT. ENDIF.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_mseg
FROM mseg WHERE mblnr IN p_mblnr AND
mjahr = p_mjahr AND
xauto <> 'X'.
CLEAR: l_goodsmvt_header,
lt_goodsmvt_item[], lt_goodsmvt_serialnumber[], lt_return[].
SORT lt_mkpf BY budat DESCENDING.
READ TABLE lt_mkpf INDEX 1.
DESCRIBE TABLE lt_mkpf LINES l_count.
* Заполнить заголовок документа
l_goodsmvt_header-pstng_date = lt_mkpf-budat. "Дата проводки
l_goodsmvt_header-doc_date = lt_mkpf-budat. "Дата документа
l_goodsmvt_header-pr_uname = sy-uname. "Имя пользователя
IF l_count = 1.
CONCATENATE lt_mkpf-mblnr lt_mkpf-mjahr
INTO l_goodsmvt_header-ref_doc_no SEPARATED BY '/'.
ELSE.
l_goodsmvt_header-ref_doc_no = 'no referens'.
ENDIF.
l_goodsmvt_header-gr_gi_slip_no = space.
l_goodsmvt_header-ver_gr_gi_slip = '3'. "Версия печати
l_goodsmvt_header-header_txt = 'EXTMOVE'.
LOOP AT lt_mseg.
sy_tabix = sy-tabix.
CLEAR: lt_goodsmvt_item.
lt_goodsmvt_item-move_type = p_bwart. "Вид движения
lt_goodsmvt_item-spec_stock = lt_mseg-sobkz. "Код особого запаса
lt_goodsmvt_item-material = lt_mseg-matnr. "Код материала
lt_goodsmvt_item-plant = lt_mseg-werks. "Завод отпуска
lt_goodsmvt_item-stge_loc = lt_mseg-lgort. "Склад отпуска
lt_goodsmvt_item-batch = lt_mseg-charg. "Партия отпуска
lt_goodsmvt_item-move_plant = p_umwrk. "Принимающий завод
lt_goodsmvt_item-move_stloc = p_umlgo. "Принимающий склад
lt_goodsmvt_item-move_batch = lt_mseg-charg. "принимающая партия
lt_goodsmvt_item-entry_qnt = lt_mseg-menge. "Количество
lt_goodsmvt_item-entry_uom = lt_mseg-meins. "ЕдИзм
CONCATENATE lt_mseg-mblnr lt_mseg-mjahr lt_mseg-zeile
INTO lt_goodsmvt_item-item_text SEPARATED BY '/'.
* Определиться с серийными номерами для позиции материала
SELECT SINGLE * INTO l_marc
FROM marc WHERE matnr = lt_mseg-matnr AND
werks = lt_mseg-werks.
IF l_marc-sernp <> space.
SELECT * INTO CORRESPONDING FIELDS OF TABLE lt_sernr
FROM ser03 AS sr
JOIN objk AS ob ON sr~obknr = ob~obknr
WHERE sr~mblnr = lt_mseg-mblnr AND
sr~mjahr = lt_mseg-mjahr AND
sr~zeile = lt_mseg-zeile.
lt_goodsmvt_serialnumber-matdoc_itm = sy_tabix.
LOOP AT lt_sernr.
lt_goodsmvt_serialnumber-serialno = lt_sernr-sernr.
APPEND lt_goodsmvt_serialnumber.
ENDLOOP.
ENDIF.
APPEND lt_goodsmvt_item.
ENDLOOP.
l_testrun = space.
CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
EXPORTING
goodsmvt_header = l_goodsmvt_header
goodsmvt_code = '04'
testrun = l_testrun
IMPORTING
goodsmvt_headret = l_goodsmvt_headret
TABLES
goodsmvt_item = lt_goodsmvt_item
goodsmvt_serialnumber = lt_goodsmvt_serialnumber
return = lt_return
EXCEPTIONS
OTHERS = 1.
* Проверим как прошло сохранение документа
IF sy-subrc <> 0.
ROLLBACK WORK. "Неизвестная ошибка
EXIT.
ENDIF.
LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
ROLLBACK WORK.
MESSAGE ID lt_return-id TYPE lt_return-type NUMBER lt_return-number
WITH lt_return-message_v1 lt_return-message_v2
lt_return-message_v3 lt_return-message_v4.
EXIT.
ENDLOOP.
IF l_testrun = space.
COMMIT WORK AND WAIT.
* Номер проведенного документа в l_goodsmvt_headret
ENDIF.