질문드립니다.
가정하여 아래와 같이 5개의 BAPI 펑션이 있습니다.
BAPI_001
BAPI_002
BAPI_003
BAPI_004
BAPI_005
위의 BAPI를 이용한 프로세스의 흐름은.....
1. BAPI_001 이 성공적으로 끝나서 문서번호를 리턴 받습니다.
2. 1의 문서번호를 참조하여 BAPI_002를 수행하고 성공적으로 끝나서 문서번호를 리턴 받습니다.
3. 2의 문서번호를 참조하여 BAPI_003를 수행하고 성공적으로 끝나서 문서번호를 리턴 받습니다.
4. 3의 문서번호를 참조하여 BAPI_004를 수행하고 성공적으로 끝나서 문서번호를 리턴 받습니다.
5. 4의 문서번호를 참조하여 BAPI_005를 수행하고 성공적으로 끝나서 문서번호를 리턴 받습니다.
위와 같을 경우 만약 5번에서 에러가 발생하면 1 ~ 4의 문서는 모두 취소해 주어야 합니다.
아마 여러분들도 이런 프로그램 많이 개발해 보셨을 거라 생각됩니다.
문제는 취소까지 잘 끝나면 괜찮은데 취소하다 오류가 나서 종료되는 경우가 생기니 아주 난감합니다.
가장 최상의 방법은 모두 다 정상일때 한번만 BAPI COMMIT을 해주면 될것 같은데 앞단의
문서가 없으면 뒤의 프로세스가 돌지 않는 구조이니....
고수님들 무슨 방법이 없을까요?
댓글 3
-
낭랑18세
2009.12.10 23:37
-
마이크타이슨
2009.12.11 01:07
로그테이블 만들어서 기록했다가 실패하면 전부 리버스 다시 태웠습니다. -
요요
2009.12.11 01:18
5번 끝에만 BAPI_TRANSACTION_COMMIT 이 적용되게만 하시면 될 거예요.
예를 들면
FORM MAIN_BAPI.
PERFORM BAPI_1 CHANGING ERROR.
IF ERROR OCCURS.
BAPI_TRANSACTION_ROLLBACK.
RETURN.
ENDIF.
....
PERFORM BAPI_5 CHANGING ERROR.
IF ERROR OCCURS.
BAPI_TRANSACTION_ROLLBACK.
RETURN.
ENDIF.
BAPI_TRANSACTION_COMMIT.
ENDFORM.
처럼 BAPI 수행시 오류여부를 체크하시고 오류가 있을 때에 ROLLBACK 하고 종료하시면 되구요.
전부 OK 되면 COMMIT 해주시면 됩니다.
BAPI 는 대부분 COMMIT 이 되지 않으면 STD. 에 데이터를 저장하지 않기 때문에
위에처럼 오류시 ROLLBACK 하고 다음 작업을 수행하시면 될 거예요.
행여 완료처리된 후에 후속처리로 해야 되는 BAPI가 있다면 취소하는 로직이 따로
들어가야 할 거구요. 좋은 결과 있으시길 바랍니다.
앞단의 문서가 없단 예기는 db상에 문서번호가 없단 예기 인지..
db 상에 데이터가 필요 하다면 단순히 commit 으로만 해결이 되지 않을 듯 싶네요.. 5번이 에러 나면 취소 bapi 를 실행 하셔야 할듯..