2012-12-20 2 views
4

저는 JCo 라이브러리를 사용하여 SAP 표준 BAPI에 액세스하고 있습니다. TID (TransactionID)를 사용할 때 RETURN 테이블이 항상 비어 있다는 점을 제외하고는 모든 것이 또한 작동합니다.SAP JCo RETURN TransactionID를 사용할 때 테이블이 비어 있습니다.

TID를 제거하면 Warnings 등으로 채워진 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; 
    } 
} 

업데이트 2013년 1월 10일 :가 마침내 모두를 얻을 수 있었다, RETURN 테이블 작성 및 입력은 최선을 다하고. 해결책은 TID가없는 커밋과 RETURN 테이블을 얻은 다음 TID를 사용하여 다시 커밋하는 것뿐입니다.

아주 이상하지만 JCo 커밋의 올바른 사용법 일 수 있습니다. 누군가이 설명을 해줄 수 있습니까?

+0

거래를 사용할 때 수출 값이나 표를 가져올 수 없습니다. 트랜잭션을 사용하지 않으면 5-10 분 전경 실행 시간 제한에 도달 할 수 있습니다. –

답변

1

RETURN 테이블을 채우고 입력을 커밋 할 수있었습니다.

솔루션, TID없이 확약, 단지 두 을 얻을 RETURN 테이블을 다음은 TID와 커밋 다시 을하는 것입니다.

+0

안녕하세요, 귀하와 정확히 같은 문제가 발생했습니다. 이 문제를 해결할 방법을 찾지 못했습니다. 그래서 2 번 저지른 당신의 해결책을 따를 것입니다 ... 조금 이상한 코드입니다. 어쨌든 당신의 정보에 감사드립니다. –

+0

이 코드가있는 probem을 찾았습니다. execute를 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

관련 문제