Ну где-то должно быть так, я не делал чтения данных инструкции техкарты, т.е. если рисовать полный функционал то надо прочитать данные позиций операций, это будет первый цикл. затем прочитать данные по материалам для всех позиций операций, это будет второй цикл по позициям материала. Теперь весь прикол в том что всегда удаляем все материалы для операции и затем вносим их по новой точно так же, за исключением той позиции которую надо изменить... и переходим к следующей операции. Для оптимизации само собой наверное не стоит удалять все материалы для позиций в которых не надо ничего менять, ну да это просто нужно тогда жать кнопку перехода к следующей операции, ну и в конце для последней позиции надо вызывать сохранение документа а не переход к следующему компоненту. У себя на вот это инструкции вроде как все корректно работает, т.е написать пакетник реально!
*PLAS - Позиции техкарты
*---
*PLNTY = A - Инструкция ТОРО
*PLNNR = Номер техкарты
*PLNAL = Счетчик группы технологических карт
*PLNFL = Последовательность (Порядок следовани7
*PLPO - Техкарта список операций
DATA: f_run(1) TYPE c,
l_count_m TYPE i,
l_count_o TYPE i,
l_matnr LIKE mara-matnr.
REFRESH: bdcdata, itab.
PERFORM dynpro USING:
'X' 'SAPLCPDI' '3001',
' ' 'BDC_CURSOR' 'RC271-PLNNR',
' ' 'BDC_OKCODE' '=VOUE',
' ' 'RC271-PLNNR' '1', "Номер инструкции техкарты
'X' 'SAPLCPDI' '3400',
' ' 'BDC_CURSOR' 'PLPOD-VORNR(01)',
' ' 'BDC_OKCODE' '=MAAL', "Выделить все позиции
'X' 'SAPLCPDI' '3400',
' ' 'BDC_CURSOR' 'PLPOD-VORNR(01)',
' ' 'BDC_OKCODE' '=MAPM'. "Перейти к изменению компонентов
* Идем по списку операций, само собой надо прочитать их для начала, чтобы знать сколько
* У меня в заказе из было всего 6 позиций так что я поставил как константу.
l_count_o = 0.
DO 6 TIMES.
PERFORM dynpro USING:
'X' 'SAPLCMDI' '3500',
' ' 'BDC_CURSOR' 'RIHSTPX-IDNRK(01)',
' ' 'BDC_OKCODE' '=PMB5', "Выделить все позиции материала
'X' 'SAPLCMDI' '3500',
' ' 'BDC_CURSOR' 'RIHSTPX-IDNRK(01)',
' ' 'BDC_OKCODE' '=PMB3'. "Удалить все позиции материалов
* Записать новые позиции материала, я как констатна ставлю всегда 2 позиции,
* чтобы показать как вводить материалы при позиционировании всегда на первую
* строку позиции!!!
l_count_m = 0.
DO 2 TIMES.
l_count_m = l_count_m + 1.
IF l_count_m = 1.
l_matnr = 'MB-1000'. "Первая строка
ELSE.
l_matnr = 'M1'. "Вторая строка
ENDIF.
PERFORM dynpro USING:
'X' 'SAPLCMDI' '3500',
' ' 'BDC_CURSOR' 'RIHSTPX-IDNRK(01)',
' ' 'BDC_OKCODE' '/00', "Материал + количество и нажать ENTER
' ' 'RIHSTPX-IDNRK(01)' l_matnr,
' ' 'RIHSTPX-MENGE(01)' '1',
'X' 'SAPLCMDI' '3500',
' ' 'BDC_CURSOR' 'RIHSTPX-IDNRK(01)',
' ' 'BDC_OKCODE' '=P++'. "Сместить записи таблицы PgDn
ENDDO.
l_count_o = l_count_o + 1.
IF l_count_o < 6.
PERFORM dynpro USING:
'X' 'SAPLCMDI' '3500',
' ' 'BDC_OKCODE' '=NEPM'. "Перейти к следующей операции
ELSE.
PERFORM dynpro USING:
'X' 'SAPLCMDI' '3500',
' ' 'BDC_OKCODE' '=BU'. "Сохранить данные техкарты
ENDIF.
ENDDO.
* Вызвать транзакцию
BREAK-POINT.
f_run = 'A'.
CALL TRANSACTION 'IA06' USING bdcdata MODE f_run UPDATE 'S'
MESSAGES INTO itab.
BREAK-POINT.
*&---------------------------------------------------------------------*
*& Form DYNPRO
*&---------------------------------------------------------------------*
* Генерация полей для BATCH-INPUT
*----------------------------------------------------------------------*
FORM dynpro USING dynbegin name value.
IF dynbegin = 'X'.
CLEAR bdcdata.
MOVE: name TO bdcdata-program,
value TO bdcdata-dynpro,
'X' TO bdcdata-dynbegin.
APPEND bdcdata.
ELSE.
CLEAR bdcdata.
MOVE: name TO bdcdata-fnam,
value TO bdcdata-fval.
APPEND bdcdata.
ENDIF.
ENDFORM.