我想从SAP服务器中获取一些数据到Visual Studio中的C#程序。SAP和程序之间的连接已经在工作,但我真的不知道如何将数据从服务器获取到程序中。
namespace ConsoleApp1
{
class Program //: IDestinationConfiguration
{
static void Main(string[] args)
{
fn f = new fn();
RfcDestination destination = f.GetRfcDestination("vhcalnplci", "brachi", "Abap2017", "001", "EN", "vhcalnplci", "00", "20", "10");
RfcSessionManager.BeginContext(destination);
destination.Ping();
IRfcFunction function = destination.Repository.CreateFunction("/BODS/RFC_READ_TABLE");
IRfcTable addresses = function["ADDRESSES"].GetTable();
Console.WriteLine("STREET");
for (int index = 0;
index < addresses.RowCount;
++index)
{
Console.WriteLine(addresses[index]["STREET"].GetString());
}
}
}
}
正如你所看到的,我已经写了一些代码,但不幸的是,当我试图执行这个程序时,我得到了以下错误:
SAP.Middleware.Connector.RfcInvalidParameterException:"容器元数据/BODS/RFC_READ_TABLE未知的元素ADDRESSES";
在以下代码行:
IRfcTable addresses = function["ADDRESSES"].GetTable();
我知道错误是因为RFC_READ_TABLE模块中不存在该元素,但正如我所说,我真的不知道如何获取数据,也不知道程序的这一部分真正需要什么代码。我已经看过SAP的编程指南,但也许它会帮助我:.NET连接器编程指南
从我的角度来看,你的问题太宽泛了,这里无法简单回答。您似乎缺乏有关SAP系统及其功能和数据模型的基本知识。使用SAP系统的推荐方法是使用适合您需求的特定功能模块(BAPI(,如果这种功能模块无法开箱即用,则在ABAP中开发自己的功能模块
如果选择任何RFC_READ_TABLE功能模块,则表明您希望像访问数据库一样访问SAP系统,但事实并非如此。这是一个ERP系统(使用数据库(。对于所有的RFC_READ_TABLE变体,您甚至需要了解SAP的内部数据库表设计及其表依赖关系,并且必须在函数调用中指定适当的SQL语句。这种方法容易出错,不是从SAP系统访问数据的推荐方法
举个例子,如果您想读取存储的客户数据(包括他们的地址(,请使用远程功能模块BAPI_customer_GETLIST
最后是你的源代码:
- 您通过调用
RfcSessionManager.BeginContext(destination)
但没有再次结束上下文创建了连接资源泄漏。只有当您真的需要它来执行有状态调用序列时,才调用它。你在这里不需要它 - 您没有设置或填充任何用于调用函数模块的导入参数
- 您没有执行/调用SAP系统中的功能模块。这需要调用
function.Invoke(destination)
- 您试图访问所选功能模块/BODS/RFC_READ_TABLE中不可用的参数"ADDRESSES"。查看SAP系统,并使用事务SE37检查您的功能模块接口公开了哪些参数和表