5

JCoライブラリを使用してSAP標準BAPIにアクセスしています。TID(TransactionID)を使用すると、RETURNテーブルが常に空になることを除いて、すべてが機能しています。

TIDを削除すると、RETURNテーブルに警告などが表示されます。ただし、残念ながら、トランザクションBAPIにTIDを使用する必要があります。そうしないと、変更がコミットされません。

TIDを使用しているときにRETURNTABLEが空になるのはなぜですか?

または、トランザクションBAPIに変更をコミットするにはどうすればよいですか?

ここにBAPIアクセスのspeudo-codeがあります:

import com.sap.conn.jco.*;
import org.apache.commons.logging.*;

public class BapiSample {

    private static final Log logger = LogFactory.getLog(BapiSample.class);
    private static final String CLIENT = "400";
    private static final String INSTITUTION = "1000";
    protected JCoDestination destination;

    public BapiSample() {
        this.destination = getDestination("mySAPConfig.properties");
    }

    public void execute() {
        String tid = null;
        try {
            tid = destination.createTID();
            JCoFunction function = destination.getRepository().getFunction("BAPI_PATCASE_CHANGEOUTPATVISIT");

            function.getImportParameterList().setValue("CLIENT", CLIENT);
            function.getImportParameterList().setValue("INSTITUTION", INSTITUTION);
            function.getImportParameterList().setValue("MOVEMNT_SEQNO", "0001");
            // Here we will then all parameters of the BAPI....
            // ...
            // Now the execute
            function.execute(destination, tid);
            // And getting the RETURN Table. !!! THIS IS ALWAYS EMPTY!
            JCoTable returnTable = function.getTableParameterList().getTable("RETURN");
            int numRows = returnTable.getNumRows();
            for (int i = 0; i < numRows; i++) {
                returnTable.setRow(i);
                logger.info("RETURN VALUE: " + returnTable.getString("MESSAGE"));
            }
            JCoFunction commit = destination.getRepository().getFunction("BAPI_TRANSACTION_COMMIT");
            commit.execute(destination, tid);
            destination.confirmTID(tid);
        } catch (Throwable ex) {
            try {
                if (destination != null) {
                    JCoFunction rollback = destination.getRepository().getFunction("BAPI_TRANSACTION_ROLLBACK");
                    rollback.execute(destination, tid);
                }

            } catch (Throwable t1) {
            }
        }
    }

    protected static JCoDestination getDestination(String fileName) {
        JCoDestination result = null;
        try {
            result = JCoDestinationManager.getDestination(fileName);
        } catch (Exception ex) {
            logger.error("Error during destination resolution", ex);
        }
        return result;
    }
}

UPDATE 10.01.2013:ついに、RETURNテーブルがいっぱいになり、入力がコミットされるようになりました。解決策は、TIDなしでコミットし、RETURNテーブルを取得してから、TIDを使用して再度コミットするという両方を実行することです。

非常に奇妙ですが、JCoコミットの正しい使用法かもしれません。誰かが私にこれを説明できますか?

4

2 に答える 2

2

RETURNテーブルがいっぱいになり、入力がコミットされた両方を取得できました。

解決策は、 TIDなしでコミットし、RETURNテーブルを取得してから、TIDを使用して再度コミットするという両方を実行することです。

于 2015-05-13T09:12:25.827 に答える
1

executeメソッドを2回呼び出さないでください。シーケンス番号が増加します。JCoContextクラスでbeginメソッドとendメソッドを使用する必要があります。

プロセスの開始時にbeginメソッドを呼び出すと、データが更新され、メッセージが返されます。これがサンプルコードです。

  JCoDestination destination = JCoDestinationManager.getDestination("");
  try
  {
      JCoContext.begin(destination);
      function.execute(destination)
      function.execute(destination)
  } 
  catch (AbapException ex)
  {
         ...
  } 
  catch (JCoException ex)
  {
         ...
  }  
  catch (Exception ex)
  {
         ...
  }
  finally
  {
      JCoContext.end(destination);
  }

このURLから詳細情報を参照できます。 http://www.finereporthelp.com/download/SAP/sapjco3_linux_32bit/javadoc/com/sap/conn/jco/JCoContext.html

于 2015-10-14T09:56:30.153 に答える