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

如何使用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函数:

  1. 定义输入参数(表名、查询条件等)
  2. 定义输出参数为结构化的内表
  3. 在函数中编写ABAP逻辑读取目标表数据
  4. 在node-rfc中调用该自定义函数,直接获取结构化数据,无需手动解析字符串

关键注意事项

  • 确保SAP用户拥有目标函数模块的调用权限,以及对应数据表的访问权限
  • 调用时参数名称必须与ABAP函数的参数名完全一致(ABAP参数名默认大写,node-rfc中需使用大写参数名)
  • 使用RFC_READ_TABLE时,若未设置DELIMITER,需根据FIELDS返回的OFFSET和LENGTH字段拆分字符串

内容的提问来源于stack exchange,提问作者Munna Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 00:27:10