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
相关产品推荐
相关产品推荐

