网上已经有人写了NET连接SAP系统专题,这里就不细说了,有需要的同学可以自己点开专题链接。
调用RFC的时候我们要传参数,传常规类型(string,int)非常简单,实例化一个IRfcFunction,然后调用实例化的SetValue函数就完成了。要传Structure、传Table怎么办呢。直觉告诉我,应该先定义一个RfcStructure或RfcTable,当然,定义它们之后还要定义一堆的RfcField,然后再用SetValue传进去。忙活了半天,发现还是不行。报数据类型转换的错误。找谷歌帮忙,也没找到满意的答案。后来打起了nco的主意,IRfcFunction在调用Invoke才开始调用rfc函数,能不能在调用Invoke之前,先调用GetTable或GetStructure得到内表或structure的结构的实例,将我们要传入的数据写入实例,再调用SetValue函数将实例设为RFC的参数,最后再调用Invoke呢?开始coding……,运行,成功了!!啰嗦了这么多,再整理下。
net调用rfc函数,对于简单类型的参数,可以直接调用SetValue进行传参。
对于复杂类型的参数(structure,table),先调用IRfcFunction.GetTable或GetStructure()创建复杂类型的实例,对实例进行赋值,再调用SetValue进行传参。
IRfcFunction function = SAPHelper.GetFunction(”ZHELI_TEST1″);
IRfcTable inTable = function.GetTable(”LINES”, true);
IRfcStructure wa_line = inTable.Metadata.LineType.CreateStructure();
wa_line.SetValue(0, “1″);
wa_line.SetValue(1, “1111111111111111111″);
inTable.Append(wa_line);
wa_line = remoteTable.Metadata.LineType.CreateStructure();
wa_line.SetValue(0, “2″);
wa_line.SetValue(1, “22222222222222″);
inTable.Append(wa_line);
wa_line = remoteTable.Metadata.LineType.CreateStructure();
wa_line.SetValue(0, “3″);
wa_line.SetValue(1, “3333333333333333″);
inTable.Append(wa_line);
function.SetValue(”LINES”, inTable);
function.Invoke(SAPHelper.DEST);
DataTable dt = SAPHelper.RfcTableToDataTable(function.GetTable(”OLINES”));