# sapdotnetconnector **Repository Path**: aoemoon/sapdotnetconnector ## Basic Information - **Project Name**: sapdotnetconnector - **Description**: .net5 sapnrrfc .net framework 4.0 sapnetconnector3 与SAP进行交互的实例 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-02-02 - **Last Updated**: 2024-02-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # sapdotnetconnector #### 介绍 .net5 sapnrrfc .net framework 4.0 sapnetconnector3 与SAP进行交互的实例 #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1.1. net5 1.2. 安装SapNwRfc dotnet add package SapNwRfc or PM> Install-Package SapNwRfc 1.3将saplib文件夹下的文件拷贝到项目bin文件夹下 1.4连接到SAP服务器 string connectionString = "AppServerHost=MY_SERVER_HOST; SystemNumber=00; User=MY_SAP_USER; Password=SECRET; Client=100; Language=EN; PoolSize=5; Trace=8"; using var connection = new SapConnection(connectionString); connection.Connect(); 1.5建立Sap 接口连接,参数为接口名 using var someFunction = connection.CreateFunction("BAPI_SOME_FUNCTION_NAME"); 1.6调取接口并返回数据 //具有输入参数但没有输出参数的呼叫功能 var result = someFunction.Invoke(new SomeFunctionParameters { Budat = "2021-07-18", //Werks = "2000", //Aufnr = "", Matnr = "60001297", //Lgort = "" }); 1.7接口相关对象 class SomeFunctionParameters { [SapName("SOME_FIELD")] public string SomeField { get; set; } } class SomeFunctionResult { [SapName("RES_ABC")] public string Abc { get; set; } [SapName("RES_ITEMS")] public SomeFunctionResultItem[] Items { get; set; } } class SomeFunctionResultItem { [SapName("ITM_NAME")] public string Name { get; set; } } 2.0 .net framework 4.0 2.1 安装SAPDotNetConnector3 dotnet add package SAPDotNetConnector3 or PM> Install-Package SAPDotNetConnector3 2.2 连接对象 public abstract class Common { /// /// 获取SAP配置信息 /// public static SAPServerInfoModel GetSapServerInfo() { SAPServerInfoModel sapInfo = new SAPServerInfoModel { NAME = ConfigurationManager.AppSettings["NAME"], ASHOST = ConfigurationManager.AppSettings["ASHOST"], CLIENT = ConfigurationManager.AppSettings["CLIENT"], USER = ConfigurationManager.AppSettings["USER"], PASSWD = ConfigurationManager.AppSettings["PASSWD"], SYSNR = ConfigurationManager.AppSettings["SYSNR"], LANG = ConfigurationManager.AppSettings["LANG"] }; return sapInfo; } } 2.3连接参数 public class SAPConfiguration : IDestinationConfiguration { public bool ChangeEventsSupported() { return false; } public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged; private SAPServerInfoModel info; public SAPConfiguration(SAPServerInfoModel info) { this.info = info; } public RfcConfigParameters GetParameters(string destinationName) { try { if (destinationName.Equals("PRD")) { RfcConfigParameters parms = new RfcConfigParameters(); parms.Add(RfcConfigParameters.Name, info.NAME); parms.Add(RfcConfigParameters.AppServerHost, info.ASHOST); parms.Add(RfcConfigParameters.Client, info.CLIENT); parms.Add(RfcConfigParameters.User, info.USER); parms.Add(RfcConfigParameters.Password, info.PASSWD); parms.Add(RfcConfigParameters.Language, info.LANG); parms.Add(RfcConfigParameters.SystemNumber, info.SYSNR); return parms; } else { return null; } } catch (Exception ex) { return null; } } } public class SAPServerInfoModel { public string NAME { get; set; } public string ASHOST { get; set; } public string CLIENT { get; set; } public string USER { get; set; } public string PASSWD { get; set; } public string SYSNR { get; set; } public string LANG { get; set; } } 2.5创建连接 public class SAPServerHelper : IDisposable { private RfcDestination prd;//SAP Rfc定义声明对象 private SAPConfiguration sapConfig;//SAP配置对象 #region 创建SAP连接对象 /// /// 创建SAP连接对象 /// public SAPServerHelper() { SAPServerInfoModel sapInfo = Common.GetSapServerInfo(); sapConfig = new SAPConfiguration(sapInfo); prd = RfcDestinationManager.GetDestination(sapConfig.GetParameters("PRD")); } #endregion #region 与SAP进行数据交互(MES->SAP && SAP->MES) /// /// 与SAP进行数据交互(MES->SAP && SAP->MES) /// /// SAP接口名 /// SAP传入参数列表 /// SAP表名 /// SAP传入参数Table列表 /// 返回值列表 /// 返回参数列表 /// public DataTable getSapFunctionToTable(string funName, Dictionary lstParameters, string TableName, Dictionary rtbInputList, out Dictionary outParameters, List outList) { Dictionary outDataList = new Dictionary(); DataTable dt = new DataTable(); RfcRepository repo = prd.Repository; //输入 IRfcFunction function = repo.CreateFunction(funName); foreach (var item in lstParameters) { function.SetValue(item.Key, item.Value); } foreach (var item in rtbInputList) { function.SetValue(item.Value, item.Key); } function.Invoke(prd); //输出 IRfcTable rtb = function.GetTable(TableName); foreach (var item in outList) { outDataList[item] = function.GetString(item); } outParameters = outDataList; dt = CreateTable(rtb, TableName); return dt; } #endregion #region 与SAP进行数据交互(MES->SAP)返回Table /// /// /// /// RFC名称 /// 参数列表 /// 返回值Table结构名称 /// public DataTable getSapFunctionToTable(string funName, Dictionary lstParameters, string TableName) { DataTable dt = new DataTable(); RfcRepository repo = prd.Repository; IRfcFunction function = repo.CreateFunction(funName); foreach (var item in lstParameters) { function.SetValue(item.Key, item.Value); } function.SetParameterActive(0, true); function.Invoke(prd); IRfcTable rtb = function.GetTable(TableName); dt = CreateTable(rtb, TableName); return dt; } #endregion #region 与SAP进行数据交互(MES->SAP)返回多个字符串+Table /// /// /// /// RFC名称 /// 参数列表 /// 返回值Table结构名称 /// 接收返回字符串List /// 返回参数列表 /// public DataTable getSapFunctionToTable(string funName, Dictionary lstParameters, string TableName, out Dictionary outParameters, List outList) { Dictionary outDataList = new Dictionary(); DataTable dt = new DataTable(); RfcRepository repo = prd.Repository; IRfcFunction function = repo.CreateFunction(funName); foreach (var item in lstParameters) { function.SetValue(item.Key, item.Value); } function.SetParameterActive(0, true); function.Invoke(prd); IRfcTable rtb = function.GetTable(TableName); foreach (var item in outList) { outDataList[item] = function.GetString(item); } outParameters = outDataList; dt = CreateTable(rtb, TableName); return dt; } #endregion #region 根据返回的数据,生成DataTable /// /// 根据返回的数据,生成DataTable /// /// /// /// private DataTable CreateTable(IRfcTable rtb, string TableName) { DataTable dt = new DataTable(TableName); //建立表结构,设定表头 for (int i = 0; i <= rtb.ElementCount - 1; i++) { DataColumn col = new DataColumn(rtb.GetElementMetadata(i).Name); dt.Columns.Add(col); } //填充表数据 for (int k = 0; k <= rtb.RowCount - 1; k++) { DataRow dr = dt.NewRow(); for (int i = 0; i <= rtb.ElementCount - 1; i++) { dr[i] = rtb[k][i].GetValue(); } dt.Rows.Add(dr); } return dt; } #endregion #region 定义要给SAP传送的数据列表(把实际的Table数据转换成SAP可识别的Table数据) /// /// 定义要给SAP传送的数据列表(把实际的Table数据转换成SAP可识别的Table数据) /// /// /// /// /// public IRfcTable CreateRfcTable(DataTable dt, string funName, string TableName) { RfcRepository repo = prd.Repository; IRfcFunction Z_RFC_ZCOX = repo.CreateFunction(funName); IRfcTable rtb = Z_RFC_ZCOX.GetTable(TableName, true); for (int i = 0; i < dt.Rows.Count; i++) { rtb.Append(); foreach (DataColumn col in dt.Columns) { rtb.SetValue(rtb[i][col.ColumnName].Metadata.Name, dt.Rows[i][col.ColumnName].ToString()); } } return rtb; } #endregion #region 释放资源 /// /// 释放资源 /// public void Dispose() { RfcDestinationManager.UnregisterDestinationConfiguration(sapConfig); } #endregion } 2.7与SAP交互 static void Main(string[] args) { Dictionary keyValues = new Dictionary(); keyValues.Add("IM_BUDAT","2021-07-18"); List columns = new List(); SAPServerHelper sapHelper = new SAPServerHelper(); var result =sapHelper.getSapFunctionToTable("ZOAFM_HWYD_INFO", keyValues, "OT_DATA"); Console.WriteLine(result.Rows.Count); foreach(DataColumn item in result.Columns) { Console.WriteLine(item.ColumnName+"\t"); } Console.WriteLine("Press any key outer."); Console.ReadKey(); } 2.8 App.config配置项 .net4.0部分内容参考 https://www.cnblogs.com/gcr1314/p/4627290.html #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)