演示Nco3.0 RFC client programming的方法(也就是还有server端编程)。代码分成四块:
- DestinationProvider: 填充登录参数(logon parameters),获取
RfcDestination
- Rfc函数调用:调用SAP FM的代码是模式化的,基本都是这种调用模式
- 处理
IRfcStructure
- 单元测试
DestinationProvider
文件:DestinationProvider.cs
using SAP.Middleware.Connector;
namespace Nco02
{
public class DestinationProvider
{
private static RfcConfigParameters GetConfigParams()
{
RfcConfigParameters configParams = new RfcConfigParameters();
// Name property is neccessary, otherwise, NonInvalidParameterException will be thrown
configParams.Add(RfcConfigParameters.Name, "ECC");
configParams.Add(RfcConfigParameters.AppServerHost, "192.168.65.100");
configParams.Add(RfcConfigParameters.SystemNumber, "00"); // instance number
configParams.Add(RfcConfigParameters.SystemID, "D01");
configParams.Add(RfcConfigParameters.User, "STONE");
configParams.Add(RfcConfigParameters.Password, "123456");
configParams.Add(RfcConfigParameters.Client, "001");
configParams.Add(RfcConfigParameters.Language, "EN");
configParams.Add(RfcConfigParameters.PoolSize, "5");
configParams.Add(RfcConfigParameters.MaxPoolSize, "10");
configParams.Add(RfcConfigParameters.IdleTimeout, "30");
return configParams;
}
public static RfcDestination GetDestination()
{
RfcConfigParameters configParams = GetConfigParams();
RfcDestination dest = RfcDestinationManager.GetDestination(configParams);
return dest;
}
}
}
Rfc函数调用
文件:RfcCall.cs
using System;
using System.Collections;
using SAP.Middleware.Connector;
namespace Nco02
{
public class RfcCall
{
// get information from company code
public ArrayList GetCocdInfo(String cocd)
{
var list = new ArrayList();
RfcDestination dest = DestinationProvider.GetDestination();
RfcRepository repository = dest.Repository;
IRfcFunction fm = repository.CreateFunction("BAPI_COMPANYCODE_GETDETAIL");
fm.SetValue("COMPANYCODEID", cocd); // Populate parameter
fm.Invoke(dest); // call function
// BAPI_COMPANYCODE_GETDETAIL returns a structure named COMPANYCODE_DETAIL
// which contains the information of the company code
IRfcStructure cocdDetail = fm.GetStructure("COMPANYCODE_DETAIL");
list = Utils.ToArrayList(cocdDetail);
return list;
}
}
}
和之前RFC调用的方法相比,现在的方法确实方便多了。说下几个重点:
编程人员不用关心与SAP系统的连接,只需要关心RfcDestination,RfcDestination代表后端SAP系统,nco3.0负责连接和关闭。我们把RfcDestination封装在DestinationProvider类中,RfcCall类只需要
RfcDestination dest = DestinationProvider.GetDestination();
获取就可以。IRfcFunction代表SAP系统的函数
SAP的函数包含在Repository中,所以获取SAP函数使用下面的代码:
RfcDestination dest = XXX;
RfcRepository repository = dest.Repository;
IRfcFunction fm = repository.CreateFunction("xxx");
一般我们关心Repository
不多,所以也可以写为:
RfcDestination dest = XXX;
IRfcFunction fm = dest.Repository.CreateFunction("xxx")
IRfcStructure
BAPI_COMPANYCODE_GETDETAIL函数exporting参数COMPANYCODE_DETAIL是一个结构,我们将它转换成一个ArrayList,代码如下,在Utils.cs中:
using SAP.Middleware.Connector;
using System;
using System.Collections;
namespace Nco02
{
public class Utils
{
public static ArrayList ToArrayList(IRfcStructure stru)
{
var list = new ArrayList();
for (int i = 0; i < stru.ElementCount; i++) {
// get column name from position
RfcElementMetadata colMeta = stru.GetElementMetadata(i);
list.Add(String.Format("{0}: {1}",
colMeta.Name, // column name
stru.GetString(colMeta.Name))); // get value from column name
}
return list;
}
}
}
单元测试
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Nco02;
using System.Collections;
namespace UnitTestProject1
{
[TestClass]
public class TestRfcCall
{
[TestMethod]
public void Test_RfcCall()
{
RfcCall rfc = new RfcCall();
ArrayList list = rfc.GetCocdInfo("0001");
foreach (String item in list) {
System.Console.WriteLine(item);
}
}
}
}