如何从使用 RFC 从 java 发送的 abap 接收 table 数据

how to receive table data from abap that sending from java using RFC

我正在使用 RFC 函数从 sap abap 端接收从 java 发送的数据。 java 端没有错误。问题是我无法从 sap 端捕获数据。我需要将这些数据保存在 sap ztable.

这是我的 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 table。

好吧,我认为您必须提供更多信息才能回答这个问题,但无论如何我都会尝试一下。

您正在使用 createRFCFunction 方法。为什么?我建议使用这种方式来获取 ABAP 功能模块的完整签名:JCoFunction function = destination.getRepository().getFunction("ZZSL_ATEND_CRT_LOG_TBL"); 并最终 function.execute(destination); 这样您就可以获取功能模块的元信息以从连接的 SAP 系统中调用

如果这不起作用,请逐步查看下面的列表并post回复

  1. 您使用的是哪个版本的 JCO?
  2. 是否有一个名为dev_jco_rfc.trc的文件
    1. 看看这个。它提供的信息非常丰富,可以告诉您凭据和/或连接参数是否错误
  3. 在 SAP 中从未触发 RFC 调用
    1. SAP 系统是否使用 ACL 来限制 RFC 连接?然后你得到基础管理清除白名单中的连接
    2. 你在SM59自定义连接了吗。
    3. 它是您在程序中使用的那个吗?
    4. 当您的 Java 程序为 运行
    5. 时,您是否尝试过连接测试
    6. 事务 SMGW 告诉你什么?
  4. 调用在 SAP 中触发,您可以在此设置调试器
    1. 调试器对IT_LIST
    2. 的内容说了什么
    3. 您使用的是哪种交易框架?
      1. 古典?
      2. OO?

希望对您有所帮助。