SAP接口编程之NCo3.0系列(05) : Table作为输入参数

调用 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);
        }       
    }
}

源代码

05-table as importing parameter - 码云

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值