JAVA - ooxxvv/MySAPnotes GitHub Wiki

PageOutline {{{#!comment -------------------- 以上的部份是固定的,不要變動 ----- ---------------------------------------- 在建立連結時,請標明連結的頁面類型,例如:wiki:WikiStart,而不要只用 WikiStart ----- }}}

JAVA

  • java 與 sap 相關的資料

java & transaction

在考慮 Transaction 時, 如果牽涉到 SAP 的話, 要視各個所需功能的條件而定, 一般來講是無法做到跨 Transaction 的. 所以大部分情況下您必須自己寫 java 程式去 lock SAP 中的資料, 而這就牽涉到相關 BAPI 有沒有提供 lock 的功能了. 您可先打 \nbapi 去搜尋您所需功能的 BAPI, 看看其提供的功能細節. 如果不幸沒有 transaction/lock 的話, 可能就要先找 ABAPer 幫忙寫了, 然後您再用 Java 來呼叫她. 另外, 如果只牽涉到一個 BAPI 的話, 您也可以直接看其執行的結果來決定要不要 rollback.

底下附上一個我以前寫過的修改SAP人事資料程式(節錄)給您參考, 這樣包裝好的程式再來跟其他系統作 transaction 的交流基本上應該是沒有問題的/ {{{#!java

public void change(......) {

int inEmpNum=......;
JCO.Client client=null;
try {
  client=......;

  enqueue(client, inEmpNum); // 這行是在 lock 某員工的資料, 不讓別人去動她. (enqueue 就是指德文的 lock)
  if (Global.CH_STATUS_ERR == getChStatus()) {
    // 到這裡表示該員工的資料已被別人鎖住或什麼的, 所以就作退出的相關工作.
  }

  // 在這裡開始作人事資料的修改
  Bapi_AddressEmpUs_Change bapi=new Bapi_AddressEmpUs_Change(......
    );
  // 到此作完了

  verifyReturn(bapi.getStructBapiReturn1());
  // 若是執行結果有錯誤的話, 在這裡作 rollback 的相關處理

  dequeue(client, inEmpNum); // 這行是在釋放 lock (dequeue 就是德文的 unlock)
} catch (JCO.Exception e) {
  Global.getLogGeneral().log(Level.SEVERE, "", e);
  ......
} finally {
  JCO.releaseClient(client);
}

} // end change

}}}

{{{#!comment -------------------- 以下的部份是固定的,不要變動 ----- }}}