Идея следующая (можно пропустить):Есть транзакция, в которой делается проводка (MIRO). И для
каждой позиции документа необходимо создать подтверждение с помощью BAPI (BAPI_NETWORK_CONF_ADD - на вход нужен номер сетевого графика, а он у позиций может быть разный). Мы создали реализацию BADI метод CHANGE_AT_SAVE, где и пытаемся вызвать BAPI несколько раз. И нужно сделать так, чтобы проводка и все запуски BAPI проводились в БД либо вместе, либо вместе откатывались.
1) Соответственно вставить 'BAPI_TRANSACTION_COMMIT' нельзя, т.к. нарушится целостность данных и при COMMIT WORK в самой транзакции - получаем DUMP. Кроме того мы не сможем в таком случае сохранять и откатывать все данные вместе.
2) Если 'BAPI_TRANSACTION_COMMIT' - не вставлять вообще, чтобы все сохранения выполнились по COMMIT WORK в самой транзакции - то все работает, если BAPI запускается только один раз. Но позиции могут принадлежать разным сетевым графикам, поэтому запускать BAPI нужно несколько раз. А при повторном запуске BAPI в ней возникает неконсистентность и она выдает ошибку - из-за того, что два запуска BAPI делаются в рамках одного LUW
ПроблемаПолучается, что мы имеем примерно следующее
* наше расширение
Code:
LOOP
CALL BAPI " BAPI_NETWORK_CONF_ADD - но не важно какую BAPI запускать
" при втором проходе цикла BAPI - выдает ошибку из-за того, что LUW остался прежним.
" вставить BAPI_TRANSACTION_COMMIT в цикл нельзя т.к. будет дамп (расш. в момент сохранения - нарушается целостность данных самой ТА)
" и кроме того не будет возможности все откатить в случае, если стандарт выйдет на ROLLBACK или же откатить предыдущие BAPI в случае
" ошибки в одной из них
ENDLOOP.
* далее где-то в стандарте
Code:
COMMIT WORK.
И как сделать, чтобы такая логика работала и все сохранялось или откатывалось вместе вопрос?????? На данный момент реализовал так - но это не правильно* наше расширение
Code:
LOOP
CALL FUNCTION 'BAPI*' DESTINATION 'NONE' .
* если ошибок нет
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' DESTINATION 'NONE' .
CALL FUNCTION 'RFC_CONNECTION_CLOSE' EXPORTING DESTINATION 'NONE' .
* если ошибки есть
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK' DESTINATION 'NONE' .
CALL FUNCTION 'RFC_CONNECTION_CLOSE' EXPORTING DESTINATION 'NONE' .
" соответственно сохраняем все запуски BAPI независимо друг от друга в отдельных режимах - чтобы не нарушать целостность LUW
самой транзакции, но сделать так, чтобы СОХРАНИТЬ ВСЕ ИЛИ НИЧЕГО не удается
ENDLOOP.
* далее где-то в стандарте
Code:
COMMIT WORK.