Ошибочное сторнирование движения материала к поставке через MIGO. В общем-то если используется входящая/исходящая поставка, то сторнировать движение материала через транзакцию MIGO очень не рекомендуется, так как при такой операции не обновляются данные статуса поставки. Для такой операции существует специальная транзакция VL09 - сторно движения материала к поставке. Однако, как это бывает, SAP почему-то не сделал проверки в MIGO на операцию сторно к поставке, поэтому пользователи иногда забывает о такой особенности сторнирования движения поступления и сторнируют документы, что приводит к переклиниванию данных поставки и невозможности последующих операций с ней.
На третьем случае, я как-то чуток подустал от такой проблемы, поэтому набросал программку, которая корректирует проблему рихтовкой таблиц SAP. На вход подаем номер неправильного документа сторно, а остальное типа программа сделает сама, опять же никаких гарантий не даю, перед тем как использовать проверьте это на тестовых данных. В общем виде нужно удалить ссылочные данные в таблице потока документов VBFA и откорректировать статус поступления материала к поставке в таблице VBUP. У меня, по крайней мере, после работы программы поставка не видит что было поступление запаса и дает выполнить операцию поступления еще раз. А то что был приход/сторно/приход видно по истории документа заказа ММ (ну если речь идет о входящей поставке, а у меня была именно эта проблема).
В общем по коду типа должно быть ясно что и как делается, если будут какие проблемы у кого, велкам с комментариями.
*&---------------------------------------------------------------------*
*& Report YUUK_CORRECT_BADMBST
*&
*&---------------------------------------------------------------------*
*& Однако корретировка поставок при сторнировании движения
*& через транзакцию MIGO, а надо бы делать было через VL09
*&---------------------------------------------------------------------*
REPORT yuuk_correct_badmbst.
TABLES: mkpf.
PARAMETERS: p_mblnr LIKE mkpf-mblnr, "Документ ММ
p_mjahr LIKE mkpf-mjahr. "Год документа ММ
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_commit AS CHECKBOX. "X - COMMIT WORK
************************************************************************
DATA: lt_mseg LIKE mseg OCCURS 1 WITH HEADER LINE,
lt_ekes LIKE ekes OCCURS 1 WITH HEADER LINE,
lt_vbfa LIKE vbfa OCCURS 1 WITH HEADER LINE,
ls_lips LIKE lips,
l_wbsta LIKE vbup-wbsta.
************************************************************************
SELECT * INTO TABLE lt_mseg
FROM mseg WHERE mblnr = p_mblnr AND
mjahr = p_mjahr.
IF sy-subrc = 0.
* Позиции должны быть документы сторно к заказу на закупку ММ
LOOP AT lt_mseg WHERE shkzg = 'H' AND ebeln <> space.
WRITE: / 'Позиция документа ММ:', 40 lt_mseg-mblnr, lt_mseg-mjahr, lt_mseg-zeile.
SELECT * INTO TABLE lt_ekes
FROM ekes WHERE ebeln = lt_mseg-ebeln AND
ebelp = lt_mseg-ebelp.
WRITE: / 'Список поставок к заказу ММ:', 40 lt_mseg-ebeln, lt_mseg-ebelp.
LOOP AT lt_ekes.
SELECT * INTO TABLE lt_vbfa
FROM vbfa WHERE vbelv = lt_ekes-vbeln AND
posnv = lt_ekes-vbelp AND
vbtyp_n = 'R'.
LOOP AT lt_vbfa.
WRITE: / 'Удаление данных потока документов:', 40 lt_vbfa-vbelv, lt_vbfa-posnv.
WRITE: / 'Удалены данные для документа ММ:', 40 lt_vbfa-vbeln, lt_vbfa-posnn, lt_vbfa-mjahr.
DELETE FROM vbfa WHERE vbelv = lt_vbfa-vbelv AND
posnv = lt_vbfa-posnv AND
vbeln = lt_vbfa-vbeln AND
posnn = lt_vbfa-posnn.
SELECT SINGLE * INTO ls_lips
FROM lips WHERE vbeln = lt_vbfa-vbelv AND
posnr = lt_vbfa-posnv.
WRITE: / 'Обновление статуса поставки:'.
IF lt_mseg-erfmg = ls_lips-lfimg.
l_wbsta = 'A'.
WRITE: AT 40 'A - полное сторно'.
ELSE.
l_wbsta = 'B'.
WRITE: AT 40 'B - частичное сторно'.
ENDIF.
UPDATE vbup SET wbsta = l_wbsta
WHERE vbeln = lt_vbfa-vbelv AND
posnr = lt_vbfa-posnv.
ENDLOOP.
ENDLOOP.
ENDLOOP.
IF p_commit = 'X'.
COMMIT WORK.
WRITE: / 'Продуктивный прогон программы' COLOR COL_POSITIVE.
ELSE.
ROLLBACK WORK.
WRITE: / 'Тестовый прогон программы' COLOR COL_NEGATIVE.
ENDIF.
ELSE.
WRITE: / 'Документ материала:', p_mblnr, p_mjahr, 'не найден!'.
ENDIF.