如何使用node-rfc从SAP系统获取数据表数据?技术求助
问题:node-rfc调用SAP获取数据表数据时的参数传递疑问
我想用node-rfc库从SAP系统获取数据表数据,但不知道该在哪里传入表名称或参数来获取合适的数据构建Node.js API,完全没头绪,不知道问题出在哪。
我的代码
const noderfc = require("node-rfc"); const client = new noderfc.Client({ dest: "MME" }); (async () => { try { // 注意:直接创建的客户端连接初始是关闭状态,不同于连接池获取的连接 await client.open(); // 调用ABAP函数模块,传递结构和表参数 // ABAP结构 const abap_structure = { RFCINT4: 345, RFCFLOAT: 1.23456789, RFCCHAR4: "ABCD", RFCDATE: "20180625", // ABAP日期格式 // 也可以用JavaScript Date对象:RFCDATE: new Date('2018-06-25'), 需要配置clientOption "date" }; // ABAP表 let abap_table = [abap_structure]; const result = await client.call("STFC_STRUCTURE", { IMPORTSTRUCT: abap_structure, RFCTABLE: abap_table, }); // 查看结果 console.log(result); GetDataTableFromRFCTable(result.RFCTABLE); } catch (err) { // 连接和调用错误处理 console.error(err); } })(); // 假设DataTable、GetDataTableFromRFCTable等已在其他地方定义 function GetDataTableFromRFCTable(lrfcTable) { console.log("lrfcTable", lrfcTable); }
当前得到的响应
{ ECHOSTRUCT: { RFCFLOAT: 1.23456789, RFCCHAR1: '', RFCINT2: 0, RFCINT1: 0, RFCCHAR4: 'ABCD', RFCINT4: 345, RFCHEX3: <Buffer 00 00 00>, RFCCHAR2: '', RFCTIME: '000000', RFCDATE: '20180625', RFCDATA1: '', RFCDATA2: '' }, RESPTEXT: 'SAP R/3 Rel. 750 Sysid: QP3 Date: 20240105 Time: 130159', IMPORTSTRUCT: { RFCFLOAT: 1.23456789, RFCCHAR1: '', RFCINT2: 0, RFCINT1: 0, RFCCHAR4: 'ABCD', RFCINT4: 345, RFCHEX3: <Buffer 00 00 00>, RFCCHAR2: '', RFCTIME: '000000', RFCDATE: '20180625', RFCDATA1: '', RFCDATA2: '' }, RFCTABLE: [ { RFCFLOAT: 1.23456789, RFCCHAR1: '', RFCINT2: 0, RFCINT1: 0, RFCCHAR4: 'ABCD', RFCINT4: 345, RFCHEX3: <Buffer 00 00 00>, RFCCHAR2: '', RFCTIME: '000000', RFCDATE: '20180625', RFCDATA1: '', RFCDATA2: '' }, { RFCFLOAT: 2.23456789, RFCCHAR1: 'X', RFCINT2: 1, RFCINT1: 1, RFCCHAR4: 'QP3', RFCINT4: 346, RFCHEX3: <Buffer f1 f2 f3>, RFCCHAR2: 'YZ', RFCTIME: '130159', RFCDATE: '20240105', RFCDATA1: '', RFCDATA2: '' } ] }
解决方案
你现在调用的STFC_STRUCTURE是SAP自带的测试函数,仅回传你传入的参数,不会读取实际数据表的数据。要获取真实表数据,需要调用专门的表读取函数模块,比如标准函数RFC_READ_TABLE或自定义ABAP函数。
方法1:使用标准函数RFC_READ_TABLE
这是SAP提供的通用表读取RFC函数,调用时需传入以下核心参数:
QUERY_TABLE: 目标SAP表名(如MARA、EKPO)OPTIONS: 查询条件(类似SQL的WHERE子句,格式为字段名 操作符 '值',比如MATNR EQ '100001')FIELDS: 指定要读取的字段(不指定则返回所有字段)DELIMITER: 可选,字段分隔符,用于简化返回字符串的解析
示例代码:
const noderfc = require("node-rfc"); const client = new noderfc.Client({ dest: "MME" }); (async () => { try { await client.open(); // 读取SAP表MARA的示例 const result = await client.call("RFC_READ_TABLE", { QUERY_TABLE: "MARA", OPTIONS: [ { TEXT: "MATNR LIKE '10%'" } ], FIELDS: [ { FIELDNAME: "MATNR" }, { FIELDNAME: "MAKTX" } ], DELIMITER: "|" }); console.log("原始返回数据:", result.DATA); // 解析带分隔符的返回字符串 const parsedData = result.DATA.map(item => { const [MATNR, MAKTX] = item.WA.split("|"); return { MATNR: MATNR.trim(), MAKTX: MAKTX.trim() }; }); console.log("解析后结构化数据:", parsedData); } catch (err) { console.error(err); } finally { await client.close(); } })();
方法2:自定义ABAP函数模块
如果RFC_READ_TABLE满足不了复杂需求(比如多表关联、业务逻辑处理),可以在SAP系统中创建自定义RFC函数:
- 定义输入参数(表名、查询条件等)
- 定义输出参数为结构化的内表
- 在函数中编写ABAP逻辑读取目标表数据
- 在node-rfc中调用该自定义函数,直接获取结构化数据,无需手动解析字符串
关键注意事项
- 确保SAP用户拥有目标函数模块的调用权限,以及对应数据表的访问权限
- 调用时参数名称必须与ABAP函数的参数名完全一致(ABAP参数名默认大写,node-rfc中需使用大写参数名)
- 使用
RFC_READ_TABLE时,若未设置DELIMITER,需根据FIELDS返回的OFFSET和LENGTH字段拆分字符串
内容的提问来源于stack exchange,提问作者Munna Kumar
相关产品推荐
相关产品推荐

