SAP接口编程之 NCo3.0系列(02) : RFC Client Programs

演示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);
            }
        }
    }
}

你可能感兴趣的:(SAP接口编程之 NCo3.0系列(02) : RFC Client Programs)