Всем доброго времени суток!
Уважаемые эксперты, помогите разобраться с поведением программы. Имеется некий многопозиционный Z документ (каждая позиция содержит отпускающую и принимающую партию, № произв. заказа, значения признаков партии и т.д. ), нужно в цикле пройтись по всем позициям и:
а) обновить классификацию партии указаной в позиции
б) создать подтверждение для произв. заказа. (в данном случае для 2 позиций один и тот же № заказа)
Если все это было успешно сделано - сохранить сам Z документ, иначе вывалить окошко c возникшими ошибками.
Кусок кода:
LOOP AT mt_pcaitm ASSIGNING FIELD-SYMBOL(<fs_item>).
"Проверка блокировки партии
DO 300 TIMES.
CALL FUNCTION 'ENQUEUE_EMMCH1E'
EXPORTING
mode_mch1 = 'V'
matnr = <fs_item>-mantr
charg = <fs_item>-charg
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc = 0.
EXIT.
ELSE.
WAIT UP TO 1 SECONDS.
ENDIF.
ENDDO.
SET UPDATE TASK LOCAL.
".... Читаем классификацию, присваиваем значения признаков и т.д.
"Обновляем
CALL FUNCTION 'BAPI_OBJCL_CHANGE'
EXPORTING
objectkey = l_objectkey
objecttable = l_objecttable
classnum = l_classnum
classtype = l_classtype
TABLES
allocvaluesnumnew = lt_allocvaluesnum
allocvaluescharnew = lt_allocvalueschar
allocvaluescurrnew = lt_allocvaluescurr
return = lt_ret.
IF bapiret_has_errors( lt_ret ) IS NOT INITIAL.
ycx_static=>raise_bapiret2( it_ret = lt_ret ).
ENDIF.
"Далее работаем с заказом
CALL FUNCTION 'Z_CREATE_HDR'
EXPORTING
i_aunfr = <fs_item>-manuf_aufnr
i_date = get_pstng_date( ms_pca )
i_lmnga = l_lmnga
i_tplnr = <fs_item>-tplnr
i_schgrup = get_brig_line( <fs_item>-brig_l )-schgrup
i_kaptprog = get_brig_line( <fs_item>-brig_l )-kaptprog
i_batch_in = <fs_item>-charg_pp
i_lgort_in = ms_pca-lgort
i_batch_out = <fs_item>-charg
i_lgort_out = ms_pca-lgort
i_commit = ' '
i_testrun = ' '
IMPORTING
et_return = lt_return1.
LOOP AT lt_return1 TRANSPORTING NO FIELDS WHERE type CA 'EAX'.
EXIT.
ENDLOOP.
IF sy-subrc = 0.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
MESSAGE e076 WITH |{ <fs_item>-confir }/{ <fs_item>-confco }| INTO dummy.
ycx_static=>raise_sy( ).
ENDIF.
zcl_doc_stc=>change(
EXPORTING
i_send_int = 'X'
i_no_commit = 'X'
is_header = ms_header
it_item = mt_pcaitm ).
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
DO 300 TIMES.
CALL FUNCTION 'ENQUEUE_ESORDER'
EXPORTING
mode_aufk = 'V'
aufnr = <fs_item>-manuf_aufnr
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc = 0.
EXIT.
ELSE.
WAIT UP TO 1 SECONDS.
ENDIF.
ENDDO.
SELECT SINGLE rsnum FROM rkpf INTO @DATA(l_rsnum)
WHERE aufnr = @<fs_item>-manuf_aufnr.
IF sy-subrc = 0.
DO 300 TIMES.
CALL FUNCTION 'ENQUEUE_EMRKPF'
EXPORTING
mode_rkpf = 'V'
rsnum = l_rsnum
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc = 0.
EXIT.
ELSE.
WAIT UP TO 1 SECONDS.
ENDIF.
ENDDO.
ENDIF.
ENDLOOP.
Внутри FM Z_CREATE_HDR следующий код (сам FM обычный - не RFC и не модуль обновления) :
SET UPDATE TASK LOCAL.
"....Промежуточные разные вычисления, специфичные для позиции Z документа
CALL FUNCTION 'BAPI_PRODORDCONF_CREATE_HDR'
EXPORTING
testrun = i_testrun
IMPORTING
return = ls_return
TABLES
detail_return = lt_detailreturn
athdrlevels = lt_athdrlevels
goodsmovements = lt_goodsmovements
link_conf_goodsmov = lt_link_conf_goodsmov.
LOOP AT et_return TRANSPORTING NO FIELDS WHERE type CA 'EAX'.
EXIT.
ENDLOOP.
IF sy-subrc NE 0.
IF i_commit EQ abap_true.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ENDIF.
Странность поведения в том, что на второй итерации LOOP вылетает ошибка блокировки заказа ( объект ESORDER ) , хотя цикл проверки рассчитан аж на 5 минут, по времени выполнения видно что блокировки снимаются гораздо быстрее. Почему так может быть и как правильно дождаться окончания работы BAPI_PRODORDCONF_CREATE_HDR?