在之前 VBA 代码中,我们已经介绍过 table parameter 作为输入参数的要点。本篇主要演示 C# 使用 table parameter 作为 importing parameter 的语法。以 RFC_READ_TABLE
函数为例。
using System.Data;
using SAPLogonCtrl;
using SAPFunctionsOCX;
using ConnectionProvider;
using SAPTableFactoryCtrl;
// Table parameter 作为 importing parameter 时的使用方法
namespace SAPRfcCall
{
public class RFC3
{
private Connection connection;
// get table SKA1 contents
public DataTable GetSKA1()
{
DataTable ska1 = null;
bool isSuccessful = SAPConnection.SilentLogon(
"192.168.65.100", "D01", 00, "001", "STONE", "sappwd", "ZH");
if (isSuccessful) {
connection = SAPConnection.Connection;
ska1 = DoGetTableLines();
SAPConnection.Logoff();
}
return ska1;
}
public DataTable DoGetTableLines()
{
if (connection.IsConnected != CRfcConnectionStatus.tloRfcConnected) {
return null;
}
SAPFunctions functions = new SAPFunctions();
functions.Connection = connection;
Function fm = functions.Add("RFC_READ_TABLE");
fm.Exports["QUERY_TABLE"].Value = "SKA1";
fm.Exports["DELIMITER"].Value = "~";
// criterial to filter data retrieved
Tables tables = fm.Tables;
Table options = tables.get_Item("OPTIONS");
options.AppendGridData(1, 1, 1, "KTOPL = 'Z900' ");
// only cares for two fields
Table fields = tables.get_Item("FIELDS");
fields.AppendGridData(1, 1, 1, "KTOPL"); // first row
fields.AppendGridData(2, 1, 1, "SAKNR"); // second row
fm.Call();
Table data = fm.Tables["DATA"];
DataTable tableLines = Utils.ToDataTable(data);
return tableLines;
}
}
}
说明: 向 table 参数添加行时,与 VBA 语法不同,使用AppendGridData()
方法。 另外,获取 importing 参数、exporting 参数、table 参数,可以有以下两种方法:
- 方法1
fm.get_Exports("QUERY_TABLE").Value = "SKA1";
// 或者
fm.Exports["QUERY_TABLE"].Value = "SKA1"
- 方法2
Tables tables = fm.Tables;
Table options = tables.get_Item("OPTIONS");
// or : Table options = fm.Tables["OPTIONS"];
单元测试
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using SAPRfcCall;
using System.Data;
namespace UnitTestProject
{
[TestClass]
public class TestRFC3
{
[TestMethod]
public void TestRFCReadTable()
{
RFC3 rfc = new RFC3();
DataTable ska1 = rfc.GetSKA1();
Utils.ConsolePrint(ska1);
}
}
}
Utils.ConsolePrint()
方法在 Output 窗口打印 dataTable,代码如下:
public static void ConsolePrint(DataTable dataTable)
{
// function: print dataTable contents in console
foreach (DataRow row in dataTable.Rows) {
foreach (DataColumn col in dataTable.Columns) {
Console.Write(row[col.Caption].ToString() + "\t");
}
Console.WriteLine();
}
}