IM-ERP Real Connect for Accel Platform プログラミングガイド 初版 2013-02-01

トランザクション制御

ConnectionManager を使用することで、プログラム側で SAP への commit/rollback 処理を実行することができます。
これを利用することで、たとえば、複数の伝票をまとめて登録したり、伝票ヘッダと明細が別の BAPI によってと登録されるような場合にも同一トランザクション内で登録処理を行うことができます。
ただし、同一トランザクション内で実行する BAPI 内部に commit/rollback 処理が行われていないことが前提となります。
BAPI 内部の処理をご理解いただいた上で、本機能をご利用いただくことをお勧めいたします。
ConnectionManager についての詳細な情報は、API リストを参照してください。

現在、汎用向け API の BapiController に加え、以下の登録・更新系 API において、ConnectionManager を使用し、プログラム側で SAP への commit/rollback 処理を実行することができます。
使用方法についての詳細な情報は、API リストを参照してください。
BAPI名 概要
AccEmployeePayPostController 会計伝票登録 API
PurchaseOrderPayPostController 購買伝票登録 API
PurchaseOrderPostChangeController 購買伝票更新 API
PurchaseReleaseController 購買伝票承認 API (注)
PurchaseResetReleaseController 購買伝票承認取消 API (注)
MaterialSaveReplicaController 品目マスタ登録/変更/削除 API(注)
GoodsMvtCreateController 入出庫伝票登録 API
InquiryCreateFromData2Controller 引合伝票登録 API
QuotationCreateFromData2Controller 見積伝票登録 API
SalesOrderCreateFromDat2Controller 受注伝票登録 API
BillingDocCreateMultipleController 請求伝票登録 API

注意

(注)マークが付いている API で使用する標準 BAPI では、BAPI 内部でトランザクション制御(commit/rollback 処理)が行われます。
そのため、これらの API に対して ConnectionManager を使用する場合、BAPI 自体をカスタマイズする必要がございます。
標準 BAPI を使用すると、同一トランザクション内のそこまでの処理がすべて commit またはrollback されてしまいます。
以下にConnectionManager を使用した簡単なサンプルを示します。
// ------------------------------------------------------------------
// 更新系APIをトランザクション制御して実行する手順
// ------------------------------------------------------------------

function init() {
    var  objCon; 
    var errObj; 

    // コネクションマネージャーのインスタンス生成 
    var connectionManager = new ConnectionManager(); 

    while(true) { 
  
        // 引数に ConnectionManager を指定し、インスタンス生成 
        objCon = new BapiController("xxxxx", connectionManager); 

        // BAPI 実行 
        errObj =  objCon.executeBapi(); 

        if (checkErr(errObj)) { 
            // エラーの場合、ロールバック処理 
            connectionManager.rollback(); 
            break; 
        } 

        // 引数に ConnectionManager を指定し、インスタンス生成 
        objCon = new BapiController("yyyyy", connectionManager); 

        // BAPI 実行 
        errObj =  objCon.executeBapi(); 

        if (checkErr(errObj)) { 
            //  エラーの場合、ロールバック処理 
            connectionManager.rollback(); 
            break; 
        } 
        
        // すべて成功の場合、コミット処理 
        connectionManager.commit(); 
        break; 
    
    }

} 
また、更新系APIと参照系APIを同じトランザクションで複数回実行する場合は、コネクションをまず取得し、そのコネクションを使いまわしてください。
下記のサンプルの場合、commit処理が行われるまでに複数回実行されるBAPIの内のいずれかでエラーが発生した場合、これまでの処理がすべてロールバックされます。
// ------------------------------------------------------------------
// 更新系 -> 参照系 -> 更新系 をトランザクション制御して実行する手順
// ------------------------------------------------------------------

var objCon;
var errObj;

// 1. 準備:SapClientのインスタンスの取得とコネクションマネージャの作成
var sapClient = SapClientManager.getSapClient();
var connectionManager = new ConnectionManager(sapClient);

while(true) {
    // 引数にConnectionManager を指定し、インスタンス生成
    objCon = new XxxController(connectionManager); // 更新系
    // BAPI 実行
    errObj = objCon.executeBapi();
    if (checkErr(errObj)) {
        // エラーの場合、ロールバック処理
        connectionManager.rollback();
        break;
    }

    // 引数にConnectionManager を指定し、インスタンス生成
    objCon = new YyyController(sapClient); // 参照系
    // BAPI 実行
    errObj = objCon.executeBapi();
    if (checkErr(errObj)) {
        // エラーの場合、ロールバック処理
        connectionManager.rollback();
        break;
    }

    // 引数にConnectionManager を指定し、インスタンス生成
    objCon = new ZzzController(connectionManager); // 更新系
    // BAPI 実行
    errObj = objCon.executeBapi();
    if (checkErr(errObj)) {
        // エラーの場合、ロールバック処理
        connectionManager.rollback();
        break;
    }

    // すべて成功の場合、コミット処理
    connectionManager.commit();
    break;
}