使用TransactionID时SAP JCo RETURN表为空

时间:2012-12-20 14:23:47

标签: sap bapi jco

我正在使用JCo Library访问SAP标准BAPI。好吧一切都工作,除了当我使用TID(TransactionID)时RETURN表总是空的。

当我删除TID时,我得到RETURN表填充了警告等。但不幸的是,我需要将TID用于事务BAPI,否则不会提交更改。

为什么使用TID时RETURN TABLE为空?

或者我如何提交对事务BAPI的更改?

这里是BAPI访问的speudo代码:

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 Commits。 有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:1)

我能够同时获得两个,RETURN表填充和输入提交。

解决方案是同时执行两者,没有TID的提交,获取RETURN表,然后再次使用TID提交

答案 1 :(得分:0)

你不应该调用执行方法2次,它会增加序列号 您应该在JCoContext类中使用begin和end方法。

如果在流程开始时调用begin方法,则会更新数据并返回消息。 这是示例代码。

$update = $bdd->prepare($qry)

您可以通过此网址获取更多信息。 http://www.finereporthelp.com/download/SAP/sapjco3_linux_32bit/javadoc/com/sap/conn/jco/JCoContext.html