You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java通过RFC_READ_TABLE读取SAP ECC E070表无输出的解决求助

SAP JCo调用RFC_READ_TABLE读取E070无输出问题修复

想要打印所有传输请求的详情,尝试通过SAP JCo调用RFC_READ_TABLE函数读取SAP ECC中E070表的数据,但运行代码后没有任何输出,调试也没解决问题,以下是问题代码及修复方案:

原问题代码

import com.sap.conn.jco.*;
import java.util.logging.*;

public class Transport {
    private static final Logger logger = Logger.getLogger(Transport.class.getName());

    public static void main(String[] args) {
        // Configure logger
        LogManager.getLogManager().reset();
        logger.setLevel(Level.ALL);
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(Level.ALL);
        logger.addHandler(consoleHandler);

        // Establish connection
        JCoDestination destination;
        try {
            destination = JCoDestinationManager.getDestination("SAP-ECC-Dest");
            destination.ping();
        } catch (JCoException e) {
            logger.log(Level.SEVERE, "Connection error", e);
            return;
        }

        // Create function module call
        JCoFunction function;
        try {
            function = destination.getRepository().getFunction("RFC_READ_TABLE");
        } catch (JCoException e) {
            logger.log(Level.SEVERE, "Function module error", e);
            return;
        }

        // Set up function module parameters
        JCoParameterList imports = function.getImportParameterList();
        imports.setValue("QUERY_TABLE", "E070"); // Table name for transport requests
        imports.setValue("DELIMITER", "|"); // Set delimiter for the result

        JCoParameterList tableOptions = function.getTableParameterList();
        JCoTable data = tableOptions.getTable("DATA");
        // System.out.println(data);
        // Add filters if required
        // imports.setValue("OPTIONS", ...);

        // Execute the function module call
        try {
            function.execute(destination);
        } catch (JCoException e) {
            logger.log(Level.SEVERE, "Function module execution error", e);
            return;
        }

        // Process the results
        String[] rows = data.getString().split("\\|");
        for (String row : rows) {
            String[] columns = row.split("\\|");
            if (columns.length >= 3) {
                String transportRequestId = columns[0]; // Request ID column
                String description = columns[2]; // Description column

                logger.info("Transport Request ID: " + transportRequestId);
                logger.info("Description: " + description);
                logger.info("-----------------------------------");
            }
        }
    }
}

问题分析与修复步骤

1. 结果表获取时机错误

原代码在执行function.execute(destination)之前就获取了DATA表对象,此时表中还没有数据。必须在函数执行完成后,重新从函数的Table参数列表中获取DATA表。

2. 数据遍历逻辑错误

原代码直接调用data.getString()并拆分,这不是正确的JCoTable遍历方式。正确做法是遍历DATA表的每一行,每行的WA字段才是分隔后的字符串内容。

3. 未指定查询字段(可选但推荐)

RFC_READ_TABLE如果不指定FIELDS参数,会返回表的所有字段,不仅数据量大,还可能导致分隔后的列索引混乱。建议明确指定需要的字段(比如传输请求IDTRKORR、描述AS4TEXT等)。

4. 可选:添加过滤条件

如果E070表数据量很大,建议通过OPTIONS参数添加过滤条件(比如只读取特定客户端、特定状态的传输请求),避免返回过多数据。

修复后的完整代码

import com.sap.conn.jco.*;
import java.util.logging.*;

public class Transport {
    private static final Logger logger = Logger.getLogger(Transport.class.getName());

    public static void main(String[] args) {
        // 配置日志
        LogManager.getLogManager().reset();
        logger.setLevel(Level.ALL);
        ConsoleHandler consoleHandler = new ConsoleHandler();
        consoleHandler.setLevel(Level.ALL);
        logger.addHandler(consoleHandler);

        // 建立SAP连接
        JCoDestination destination;
        try {
            destination = JCoDestinationManager.getDestination("SAP-ECC-Dest");
            destination.ping();
            logger.info("SAP连接成功");
        } catch (JCoException e) {
            logger.log(Level.SEVERE, "连接SAP失败", e);
            return;
        }

        // 获取RFC_READ_TABLE函数
        JCoFunction function;
        try {
            function = destination.getRepository().getFunction("RFC_READ_TABLE");
            if (function == null) {
                logger.severe("无法获取RFC_READ_TABLE函数,请检查SAP系统是否启用该函数");
                return;
            }
        } catch (JCoException e) {
            logger.log(Level.SEVERE, "获取函数失败", e);
            return;
        }

        // 设置输入参数
        JCoParameterList imports = function.getImportParameterList();
        imports.setValue("QUERY_TABLE", "E070");
        imports.setValue("DELIMITER", "|");

        // 指定需要查询的字段(可选但推荐,避免返回冗余数据)
        JCoTable fields = function.getTableParameterList().getTable("FIELDS");
        fields.appendRow();
        fields.setValue("FIELDNAME", "TRKORR"); // 传输请求ID
        fields.appendRow();
        fields.setValue("FIELDNAME", "AS4TEXT"); // 请求描述
        fields.appendRow();
        fields.setValue("FIELDNAME", "AS4USER"); // 创建用户
        fields.appendRow();
        fields.setValue("FIELDNAME", "AS4DATE"); // 创建日期

        // 可选:添加过滤条件,比如只读取客户端000的请求
        // JCoTable options = function.getTableParameterList().getTable("OPTIONS");
        // options.appendRow();
        // options.setValue("TEXT", "MANDT = '000'");

        // 执行RFC函数
        try {
            function.execute(destination);
            logger.info("RFC函数执行成功");
        } catch (JCoException e) {
            logger.log(Level.SEVERE, "执行RFC函数失败", e);
            return;
        }

        // 处理返回结果
        JCoTable dataTable = function.getTableParameterList().getTable("DATA");
        if (dataTable.getNumRows() == 0) {
            logger.info("未查询到传输请求数据");
            return;
        }

        for (int i = 0; i < dataTable.getNumRows(); i++) {
            dataTable.setRow(i);
            String rowData = dataTable.getString("WA");
            String[] columns = rowData.split("\\|");

            // 确保列数匹配指定的字段数量
            if (columns.length >= 4) {
                String transportId = columns[0].trim();
                String description = columns[1].trim();
                String creator = columns[2].trim();
                String createDate = columns[3].trim();

                logger.info("传输请求ID: " + transportId);
                logger.info("描述: " + description);
                logger.info("创建用户: " + creator);
                logger.info("创建日期: " + createDate);
                logger.info("-----------------------------------");
            }
        }
    }
}

额外注意事项

  • 确认SAP系统中的RFC_READ_TABLE函数已被激活,且目标用户拥有访问E070表和该函数的权限。
  • 检查SAP-ECC-Dest对应的JCo配置文件(比如destinations/sapjco_destinations.properties)是否正确配置了SAP系统的IP、客户端、用户名、密码等信息。
  • 如果E070表数据量极大,建议分页查询(通过ROWSKIPS和ROWCOUNT参数)或者添加更精确的过滤条件。

内容的提问来源于stack exchange,提问作者aman kumar chagti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:27:35