调用 SAP 函数,如果需要 table 作为输入参数,主要解决如填充 IRfcTable 数据的问题。以 RFC_READ_TABLE 函数为例,假设需要查询科目表 Z900 的数据,输出科目表(KTOPL) 和科目代码(SAKNR)两个字段。
先在 SAP 系统中,用 SE37 测试:
query_table 参数:要查询的表名称
delimeter: 输出数据的分隔符
接着填写 options 参数。options 参数表示输出数据的筛选条件:
fields 参数是 table 类型,只需要指定 fieldname 列即可:
运行测试,没有问题:
查看数据:
在项目中编写 ReadSKA1Table() 方法:
public DataTable ReadSKA1Table() {
// purpose:
// read table SKA1 with criteria: KTOPL = Z900
RfcDestination dest = DestinationProvider.GetSAPDestination();
IRfcFunction fm = dest.Repository.CreateFunction("RFC_READ_TABLE");
// 填写函数的参数
fm.SetValue("QUERY_TABLE", "SKA1");
fm.SetValue("DELIMITER", "~");
// OPTIONS parameter (IRfcTable)
IRfcTable options = fm.GetTable("OPTIONS");
options.Append(); // create a new row
options.SetValue("TEXT", "KTOPL = 'Z900' ");
// FIELDS parameter(IRfcTable)
IRfcTable fields = fm.GetTable("FIELDS");
fields.Append();
fields.CurrentRow.SetValue("FIELDNAME", "KTOPL");
fields.Append();
fields.CurrentRow.SetValue("FIELDNAME", "SAKNR");
fm.Invoke(dest);
// DATA table paramter (output)
IRfcTable data = fm.GetTable("DATA");
DataTable dTable = SAPUtils.ToDataTable(data);
return dTable;
}
table 参数填充方法
将代码与 SE37 测试界面对照,可以看出 table 参数的填充方法。
options 参数用于设置输出数据的筛选条件。我们使用的条件是 KTOPL = ‘Z900’。在填充的时候,需要定位到 table 的行和列。行定位的方式是通过 CurrentRow 属性,列可以通过 SetValue() 方法的索引或者列名。
方法一:CurrentRow 定位行,索引定位列
IRfcTable options = fm.GetTable("OPTIONS");
options.Append(); // create a new row
options.CurrentRow.SetValue(0, "KTOPL = 'Z900' "); // first column
options.CurrentRow 返回一个 IRfcStructure,所以 structure.SetValue(0, “some value”) 表示第一列(从 0 开始)。rfc_table_read 函数的 options 参数只有一个字段 text,如果需要基于字段名称使用 SetValue() 方法,可以像下面这样。
方法二:CurrentRow 定位行,字段名称定位列
IRfcTable options = fm.GetTable("OPTIONS");
options.Append(); // create a new row
options.CurrentRow.SetValue("TEXT", "KTOPL = 'Z900' ");
方法三:利用 NCo 3.0 内部 CurrentIndex 机制
NCo3.0 内部通过 CurrentIndex 来标记当前行,所以代码可以进一步简化为这样:
IRfcTable options = fm.GetTable("OPTIONS");
options.Append(); // create a new row
options.SetValue("TEXT", "KTOPL = 'Z900' ");
fields 参数演示了填充多行的方法:多次调用 Append() 和 SetValue():
IRfcTable fields = fm.GetTable("FIELDS");
fields.Append();
fields.CurrentRow.SetValue("FIELDNAME", "KTOPL");
fields.Append();
fields.CurrentRow.SetValue("FIELDNAME", "SAKNR");
单元测试代码:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using NCo3Demo;
using System.Data;
namespace UnitTestProject1 {
[TestClass]
public class UnitTest1 {
[TestMethod]
public void Test_ReadSKA1Table() {
SAPService sap = new SAPService();
DataTable cocdList = sap.ReadSKA1Table();
DataTableHelper.Print(cocdList);
}
}
}