2012-12-20 46 views
4

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

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

为什么使用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 2013年1月10日:我终于能够同时获得,灌装和输入返回表COMMITED。解决方案是只执行两个,没有TID的提交,获取RETURN表,然后再次使用TID提交。

非常奇怪,但也许正确使用JCo提交。 有人可以向我解释这个吗?

+0

当您使用事务时,您无法获取任何导出值或表。当你不使用交易时,你可以达到5-10分钟的前台执行时间限制。 –

回答

1

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

解决方法就是既做,没有TID提交,得到返回的表,然后再进行与TID提交。

+0

嗨,我遇到了和你一样的问题。我找不到解决这个问题的方法。所以我会按照你的解决方案提交2次...它有点奇怪的代码虽然..谢谢你的信息无论如何。 –

+0

我用这段代码找到了一个probem。如果我们呼叫执行2次,则唯一编号(如传票号码的自动计数号码)将更新2次。所以滑动号码将是1,3,5,7 –

0

你不应该调用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

相关问题