因项目中用到RFC调用,之前又从未弄过,过程中找的文章或者帖子又零零散散,所以做下记录
本文记录的是基础调用类
public void Execute() { IDestinationConfiguration ID = new MyBackendConfig(); RfcDestinationManager.RegisterDestinationConfiguration(ID); //登录 RfcDestination prd = RfcDestinationManager.GetDestination("PA0_000"); Execute(prd); //退出登录 RfcDestinationManager.UnregisterDestinationConfiguration(ID); return dt; }
/// <summary> /// 调用SAP方法,目前是将获取到的数据转化为datatable,后面转换为list /// </summary> /// <param name="prd"></param> private DataTable Execute(RfcDestination prd, string[] columns, string tableName, string functionName, Dictionary<string, object> requestParam) { RfcRepository repo = prd.Repository; IRfcFunction companyBapi = repo.CreateFunction(functionName); //调用函数名 foreach (var item in requestParam) { companyBapi.SetValue(item.Key, item.Value); } //companyBapi.SetValue("BUKRS", "G000"); //设置Import的参数 //companyBapi.SetValue("ZTYPE", "S"); //设置Import的参数 companyBapi.Invoke(prd); //执行函数 IRfcTable table = companyBapi.GetTable(tableName); DataTable dt = new DataTable(); //新建表格 foreach (string clmn in columns) { dt.Columns.Add(clmn); } for (int i = 0; i < table.RowCount; i++) { DataRow dr = dt.NewRow(); foreach (string clmn in columns) { dr[clmn] = table[i].GetString(clmn); } dt.Rows.Add(dr); //填充该表格的值 } prd = null; repo = null; return dt; }
调用的方法准备好了,现在缺一个配置类,这里配置的是主机地址
public class MyBackendConfig : IDestinationConfiguration { public RfcConfigParameters GetParameters(String destinationName) { if ("PA0_000".Equals(destinationName)) { RfcConfigParameters parms = new RfcConfigParameters(); parms.Add(RfcConfigParameters.AppServerHost, "192.168.0.1"); //SAP主机IP parms.Add(RfcConfigParameters.SystemNumber, "00"); //SAP实例 parms.Add(RfcConfigParameters.User, "userName"); //用户名 parms.Add(RfcConfigParameters.Password, "password"); //密码 parms.Add(RfcConfigParameters.Client, "300"); // Client parms.Add(RfcConfigParameters.Language, "ZH"); //登陆语言 parms.Add(RfcConfigParameters.PoolSize, "1000"); parms.Add("max_get_client_time", "100"); parms.Add("peak_limit", "1000"); //parms.Add(RfcConfigParameters.MaxPoolSize, "10"); //parms.Add(RfcConfigParameters.IdleTimeout, "60"); return parms; } else return null; } public bool ChangeEventsSupported() { return false; } public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged; }
这个只是基础类和调用方法,还需要引用类库
https://files.cnblogs.com/files/wjr408/SAP%26rfc.rar
这个是我使用的,有32位和64位的,因为配置需要将编译环境指定32位或64位,any CPU会报错