2017-11-21 13 views
1

I ASP.net 웹 사이트의 기능 중 하나에서 여러 BAPI 및 저장 프로 시저를 호출하는 C# 웹 응용 프로그램이 있습니다. 함수 안에있는 메소드 중 하나가 실패하면 웹에서 호출 된 함수에서 실행 된 모든 bapi를 롤백해야합니다.asp.net 웹 페이지의 BAPI 기능 롤백

SQL에서

전이라고 할

SqlTransaction 트랜잭션 connectionsql.BeginTransaction =();

및 전화

transaction.Rollback();

중 하나가 실패한 경우 C# 코드에. (이것은 SQL 롤백을 위해 수행 될 수 있습니다)

그러나 SAP BAPI의 경우 C# catch 문에서 BAPI_TRANSACTION_ROLLBACK을 호출하더라도 변경 사항은 여전히 ​​존재합니다. (롤백 성공하지 못했습니다)

FYI, 내 BAPI 함수에서 CSAP_MAT_BOM_MAINTAIN을 사용하여 BOM 정보를 업데이트합니다.

SAP BAPI 기능의 C# 코드에서 SQL 트랜잭션과 같은 롤백을 수행하는 방법이 있으며 웹에서 예외를 catch하는 경우 C#에서 실행되는 모든 BAPI를 롤백 할 수 있습니까?

+0

이 게시물은 SAP와 BAPI에 관한 것입니다. 중도에서 실패한 것이 있으면 BAPI는 SAP 자체에서 처리하는 롤백을 수행합니다. – Mike

답변

1

귀하의 생각은 맞습니다. 오류 경우 1.

  • 전화 BAPI 2.
  • 성공, BAPI_TRANSACTION_COMMIT를 호출 할 경우

    1. 전화 BAPI : 이상적으로, 당신은 당신의 ASP.net 코드에서 다음을 수행 할 수 있어야한다 , BAPI_TRANSACTION_ROLLBACK으로 전화하십시오. 데이터가 이미 커밋 된 것 - BAPI를가 COMMIT 자신 (많은 오래된 것들과 비 BAPI 함수 모듈 할)를 포함하는 경우

    불행하게도, 당신의 ROLLBACK 너무 늦게 될 것입니다.

    함수 모듈 CSAP_MAT_BOM_MAINTAINFL_COMMIT_AND_WAIT 매개 변수가 포함되어 있지만이 경우에만 COMMIT 대기 여부에 영향을줍니다 (커미트가 여전히 발생 함). 그러나 해결 방법이있을 수 있습니다 : 내 시스템에서 서브 루틴 CSAP_MAIN_INIT (LCSAPF01를 포함한다)에, 코드 줄이 있습니다 :

    이 플래그 (flg_no_commit_work는) 나중에라는 모듈 CS_DI_BOM_VB를 (함수에 대한 호출에 전달
    import flg_no_commit_work from memory id 'CS_CSAP'. 
    

    CSAP_MAT_BOM_MAINTAIN에서) 설정되어 있으면 COMMIT이 수행되지 않습니다. 아마도 해당 플래그를 EXPORT TO MEMORY을 통해 설정해보고 도움이되는지 확인하십시오. 물론 이것은 서류 미비로 SAP에서 지원하지는 않지만 제대로 작동 할 수 있습니다 ...

  • +0

    고맙습니다. 이제 왜 BAPI가 롤백에 실패했는지 정확히 알 수 있습니다. CSAP_MAT_BOM_MAINTAIN에 FL_COMMIT_AND_WAIT 매개 변수가 포함되어 있으면 나중에 처리되고 플래그 (flg_no_commit_work)가 설정되지 않은 경우 변경 사항을 커밋합니다. 다음 코드는 문제를 해결합니다. (출처 : https://archive.sap.com/discussions/thread/182580) 데이터 : flg_no_commit_work 유형 c. flg_no_commit_work = 'X'. flg_no_commit_work를 메모리 ID 'CS_CSAP'로 내 보냅니다. – mdsuffian

    +0

    SE37을 순서대로 사용하여 Commit 및 Rollback이 작동하고있었습니다. 하지만 웹에서도 동일한 연결에서 여러 bapi를 공유하더라도 커밋은 실패합니다. 나는 현재 SAP 커넥터를 사용하고 있는데 C# asp.net 웹 응용 프로그램에서이 롤백을 사용할 수있는 샘플이 있습니까? – mdsuffian

    +0

    그래서'CSAP_MAT_BOM_MAINTAIN'에 대한 호출이 성공적이었습니다 (즉, BOM이 업데이트되었음을 ​​나타내는 값을 반환합니다). 그러나 데이터가 커밋되지 않았습니까? 호출의 SAP 측을 디버깅하여 왜 작동하지 않는지 알아낼 수 있습니다. 내가 만약 repository.CreateFunction ("BAPI_TRANSACTION_COMMIT")을 넣으면 webservice에 – mjturner

    2

    먼저 BAPI에 COMMIT WORK 문이 포함되어 있는지 확인해야합니다. 물론 이것은 거래 처리를 방해합니다.

    다음으로 올바른 세션 처리를 처리해야합니다. BAPI 호출에 다음 함수 호출을 넣었습니다.

    RfcSessionManager.BeginContext() 
    

    RfcSessionManager.EndContext() 
    

    이러한 맥락 브라켓없이 모든 BAPI 호출은 다른 컨텍스트에서 실행됩니다.