2012-12-20 41 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

相關問題