2016-09-17 7 views
0

RFC 함수를 사용하여 SAP에서 보낸 데이터를 SAP로부터 받는다. 자바 쪽에서 오류가 없습니다. 문제는 내가 수액 측면에서 데이터를 캡처 할 수 없습니다. 그 데이터를 수액 테이블에 저장해야합니다.abap에서 테이블 데이터를 수신하는 방법 rfc를 사용하여 java에서 보내는 것

이것은 내 자바 코드입니다.

public class CreateAttendence extends TimerTask { 

    RFCHandler handler; 
    DBPool_SF pooler; 
    DataSource dataSource; 
    DataSource dataSource1; 
    int rcount = 0; 
    private Object[][] itemData; 

    public CreateAttendence() { 
     handler = new RFCHandler(); 
    } 

    @Override 
    public void run() { 
     try { 
      getItem(); 
      sendValuesToSap(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    private void getItem() { 
     // TODO Auto-generated method stub 
     Connection con3 = null; 
     DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     Date date = new Date(); 
     System.out.println(dateFormat.format(date)); 

     String sbQuery3 = "SELECT * FROM attendance_log "; 
     try { 
      pooler = DBPool_SF.getInstance(); 
      dataSource1 = pooler.getDataSource(); 
     } catch (Exception e1) { 
      e1.printStackTrace(); 
     } 

     try { 

      con3 = dataSource1.getConnection(); 
      con3.setAutoCommit(false); 

      Statement st = con3.createStatement(); 
      ResultSet rs = st.executeQuery(sbQuery3); 

      int lineitem = 0; 

      try { 
       rs.last(); 
       rcount = rs.getRow(); 
       rs.beforeFirst(); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 

      itemData = new Object[6][rcount]; 

      while (rs.next()) { 
       itemData[0][lineitem] = rs.getString("device_id"); 
       itemData[1][lineitem] = rs.getString("user_id"); 
       itemData[2][lineitem] = rs.getDate("check_in"); // in date 
       itemData[3][lineitem] = rs.getDate("check_out"); // out date 
       itemData[4][lineitem] = rs.getTime("check_in"); // in time 
       itemData[5][lineitem] = rs.getTime("check_out"); // out time 
       lineitem = lineitem + 1; 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

     try { 
      con3.close(); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

    private void sendValuesToSap() { 

     JCO.Table IT_LIST = null; 

     try { 

      if (rcount > 0) { 

       handler.createRFCFunction("ZZSL_ATEND_CRT_LOG_TBL"); 
       IT_LIST = handler.getTablePara("IT_LIST"); 

       for (int x = 0; x < rcount; x++) { 

        IT_LIST.appendRow(); 

        System.out.print(itemData[1][x] + " "); 
        System.out.print(itemData[2][x] + " "); 
        System.out.print(itemData[3][x] + " "); 
        System.out.print(itemData[4][x] + " "); 
        System.out.print(itemData[5][x] + " "); 
        System.out.println(); 


        IT_LIST.setValue("110", "MANDT"); 
        IT_LIST.setValue(itemData[1][x], "PERNR"); 
        IT_LIST.setValue(itemData[2][x], "DATE1"); 
        IT_LIST.setValue(itemData[3][x], "DATE2"); 
        IT_LIST.setValue(itemData[4][x], "TIN1"); 
        IT_LIST.setValue(itemData[5][x], "TOUT1"); 

       } 

       System.out.println(IT_LIST); 

       handler.excFunction(); 
       handler.releaseClient(); 

      } 

     } catch (Exception e) { 
      // TODO: handle exception 
      handler.releaseClient(); 
      e.printStackTrace(); 
     } 

     finally { 
      rcount = 0; 
     } 

    } 

} 

이것은 내 ABAP 코드입니다.

FUNCTION ZZSL_ATEND_CRT_LOG_TBL. 
*"---------------------------------------------------------------------- 
*"*"Local Interface: 
*" TABLES 
*"  IT_LIST STRUCTURE ZSLATENLOG 
*"  IT_LIST_T STRUCTURE ZSLATENLOG 
*"---------------------------------------------------------------------- 

DATA : wa_list LIKE LINE OF IT_LIST, 
     wa_list_t LIKE LINE OF IT_LIST. 


    INSERT ZSLATENLOG FROM IT_LIST. 


ENDFUNCTION. 

ZSLATENLOG는 내 z 테이블입니다.

+1

언제 COMMIT 문을 발행합니까? INSERT 문 다음에 SY-SUBRC를 검사하지 않는 이유는 무엇입니까? 그렇다면 어떤 가치가 있습니까? – vwegert

+0

sholud 내가 commit 문을 사용할 때? 이 수액의 rfc가 내게 새것임 –

+3

당신이 그 질문에 답하는 법을 모른다면 (혼자서 또는 문서를 읽음으로써) 나는 위험한 상황 (보통 미션 크리티컬 한 ERP)에 앞서 적절한 훈련을받을 것을 강력히 권한다. 체계. – vwegert

답변

1

음,이 질문에 대답하기 위해 좀 더 많은 정보를 제공해야한다고 생각합니다.하지만 어쨌든 시도해 보겠습니다.

createRFCFunction을 사용하고 있습니다. 왜? 이 방법을 사용하여 ABAP 함수 모듈의 전체 서명을 얻는 것이 좋습니다. JCoFunction function = destination.getRepository().getFunction("ZZSL_ATEND_CRT_LOG_TBL"); 그리고 결국 function.execute(destination);이 방법을 사용하면 연결된 SAP 시스템에서 호출 할 함수 모듈의 메타 정보를 얻을 수 있습니다.

이것이 작동하지 않으면 아래 목록을 살펴보고 응답을 보내주십시오.

  1. 어떤 버전의 JCO를 사용하고 있습니까?
    1. dev_jco_rfc.trc라는 이름의 파일이로 봐있다. 그것은 매우 유익하고 자격 증명 및 또는 연결 매개 변수가 잘못된 경우를 말할 수
    2. RFC 호출이 SAP
      1. 에 RFC 연결을 제한하는 ACL을 사용하여 SAP-시스템을가 트리거되지 않습니다
    3. ? 그런 다음 화이트리스트에서 연결을 지우는 기본 관리 권한을 얻으십시오.
    4. SM59에서 연결을 사용자 정의 했습니까?
    5. 프로그램과 함께 사용하고 있습니까?
    6. Java 프로그램이 실행 중일 때 연결 테스트를 시도 했습니까?
    7. 트랜잭션 SMGW에서 무엇을 말합니까?
  2. 통화가 SAP에 트리거되고 당신은 당신이 사용하는 트랜잭션 프레임 워크의 어떤 종류의 디버거가 IT_LIST
  3. 의 내용에 대해 할 말이 무엇을이
    1. 에 디버거를 설정할 수 있습니까?
      1. 클래식?
      2. OO?

은 내가 당신을 도울 바랍니다.

+0

감사합니다.이 도움이되었습니다. 그래서 나는 이것을 받아 들인다. –

+0

내가 너를 도울 수있어서 기뻐. – lichtbringer