.NET通过RFC读取SAP数据
2014-05-22 10:23
302 查看
本篇文章中我主要讲的是.NET如何通过RFC从SAP中读取数据。为了功能的可复用性,我将调用RFC的代码从业务层中分离出来单独建立在一个namespace中。
当然除了需要我们自己编写代码以外,还需要引用SAP提供的程序集文件(sapnco.dll、sapnco_utils.dll),在代码文件需要引用相应的命名空间(using SAP.Middleware.Connector;)。
我在这个namespace中建立了三个类来实现这个功能,一个配置类(RfcDestinationConfig)、一个参数类(RfcParam)、一个主体功能类(RfcManager)。
RfcDestinationConfig
我们需要一个类来实现SAP的连接配置工作,就如同为数据连接层建立一个数据库配置类一样重要。
RfcParam
想要从SAP中读取数据,就必须将查询条件作为参数传递给RFC。另外为了返回的结果具有通用性,我使用DataTable作为返回结果的类型,然后考虑到不同条件下列是不同的,我又将列也参数化,最终我将输入参数和输出参数都封装在一个参数类之中。
RfcManager
该主角登场了,读取数据的功能正是业务层真正想要的东西。
方法ExecRfc首先将输出参数转换成一个真正可用的新的DataTable,然后将输入参数传递给SAP执行相关的RFC功能并返回IRfcTable(SAP定义的一种接口),最后再将IRfcTable转换成我们自定义的DataTable。
当然除了需要我们自己编写代码以外,还需要引用SAP提供的程序集文件(sapnco.dll、sapnco_utils.dll),在代码文件需要引用相应的命名空间(using SAP.Middleware.Connector;)。
我在这个namespace中建立了三个类来实现这个功能,一个配置类(RfcDestinationConfig)、一个参数类(RfcParam)、一个主体功能类(RfcManager)。
RfcDestinationConfig
我们需要一个类来实现SAP的连接配置工作,就如同为数据连接层建立一个数据库配置类一样重要。
public class RfcDestinationConfig : IDestinationConfiguration { #region 事件 /// <summary> /// 配置变更事件 /// </summary> public event RfcDestinationManager.ConfigurationChangeHandler ConfigurationChanged; /// <summary> /// 默认接收器名称 /// </summary> public static readonly string DefaultDesName = "destination"; #endregion #region 方法 /// <summary> /// 配置变更事件触发时,暂时无用 /// </summary> /// <param name="destinationName"></param> /// <param name="args"></param> public void OnConfigurationChanged(string destinationName, RfcConfigurationEventArgs args) { if (ConfigurationChanged != null) { ConfigurationChanged(destinationName, args); } } /// <summary> /// 获取SAP配置参数 /// </summary> /// <param name="destinationName"></param> /// <returns></returns> public RfcConfigParameters GetParameters(string destinationName) { if (destinationName == DefaultDesName) { RfcConfigParameters parms = new RfcConfigParameters(); parms.Add(RfcConfigParameters.AppServerHost,ConfigManager.GetAppSettings("SAPApplicationServer").Trim()); //SAP主机IP parms.Add(RfcConfigParameters.SystemNumber, ConfigManager.GetAppSettings("SAPSystemNumber").Trim()); //SAP实例 parms.Add(RfcConfigParameters.User, ConfigManager.GetAppSettings("SAPUser").Trim()); //用户名 parms.Add(RfcConfigParameters.Password,ConfigManager.GetAppSettings("SAPPwd").Trim()); //密码 parms.Add(RfcConfigParameters.Client, ConfigManager.GetAppSettings("SAPClient").Trim()); // Client parms.Add(RfcConfigParameters.Language,ConfigManager.GetAppSettings("SAPLanguage").Trim()); //登陆语言 return parms; } else { return null; } } /// <summary> /// 变更事件方法,暂时无用 /// </summary> /// <returns>true</returns> public bool ChangeEventsSupported() { return true; } #endregion }
RfcParam
想要从SAP中读取数据,就必须将查询条件作为参数传递给RFC。另外为了返回的结果具有通用性,我使用DataTable作为返回结果的类型,然后考虑到不同条件下列是不同的,我又将列也参数化,最终我将输入参数和输出参数都封装在一个参数类之中。
public class RfcParam { /// <summary> /// 初始化 /// </summary> public RfcParam() { CoulmnNames = new List<string>(); Param = new Dictionary<string, object>(); } /// <summary> /// RFC方法名称 /// </summary> public string RfcName { get; set; } /// <summary> /// RFC表名 /// </summary> public string TableName { get; set; } /// <summary> /// 数据表各列的列名 /// </summary> public List<string> CoulmnNames { get; set; } /// <summary> /// RFC执行参数 /// </summary> public Dictionary<string, object> Param { get; set; } }
RfcManager
该主角登场了,读取数据的功能正是业务层真正想要的东西。
方法ExecRfc首先将输出参数转换成一个真正可用的新的DataTable,然后将输入参数传递给SAP执行相关的RFC功能并返回IRfcTable(SAP定义的一种接口),最后再将IRfcTable转换成我们自定义的DataTable。
public class RfcManager { #region 属性字段 /// <summary> /// 接收器 /// </summary> public RfcDestination Prd { get; set; } /// <summary> /// 数据仓库 /// </summary> public RfcRepository Repo { get; set; } #endregion #region 构造函数 /// <summary> /// 初始化 /// </summary> public RfcManager() { //初始化RFC接收器 //配置接收器 IDestinationConfiguration IDC = new RfcDestinationConfig(); //注册 RfcDestinationManager.RegisterDestinationConfiguration(IDC); //获取RFC接收器 this.Prd = RfcDestinationManager.GetDestination(RfcDestinationConfig.DefaultDesName); this.Repo = this.Prd.Repository; //注销 RfcDestinationManager.UnregisterDestinationConfiguration(IDC); } #endregion #region 方法 /// <summary> /// 执行RFC获取数据表 /// </summary> /// <param name="rfcname">rfc方法名称</param> /// <param name="tablename">rfc表名</param> /// <param name="columnnames">数据表列名列表</param> /// <param name="param">rfc执行参数</param> /// <returns>数据表</returns> public DataTable ExecRfc(string rfcname, string tablename, List<string> columnnames, Dictionary<string, object> param) { DataTable dt = new DataTable(); if (columnnames != null && columnnames.Count > 0) { //配置datatable dt.Columns.Clear(); foreach (string cname in columnnames) { dt.Columns.Add(cname, typeof(string)); } dt.AcceptChanges(); //从SAP那获取数据表 if (!string.IsNullOrEmpty(rfcname) && param != null && param.Count > 0) { IRfcFunction rfc = this.Repo.CreateFunction(rfcname); foreach (KeyValuePair<string, object> kv in param) { rfc.SetValue(kv.Key, kv.Value); } rfc.Invoke(this.Prd); IRfcTable iTable = rfc.GetTable(tablename); if (iTable.Count > 0) { for (int i = 0; i < iTable.RowCount; i++) { iTable.CurrentIndex = i; DataRow oNewRow = dt.NewRow(); foreach (string cname in columnnames) { oNewRow[cname] = iTable.GetString(cname).ToString(); } dt.Rows.Add(oNewRow); } } } } return dt; } #endregion }
相关文章推荐
- .NET通过RFC读取SAP数据
- .Net 调用SAP RFC接口来读取数据实战纪实
- .Net 调用SAP RFC接口来读取数据实战纪实
- 一步一步教你写SAP RFC (实战项目)OA通过读取采购订单号获取物料号最近5次变价记录
- .NET用NCO连接SAP 从RFC查询数据 代码配置连接SAP的信息
- asp.net 读取SAP数据(rfc形式全过程)
- sap 系统之间读取数据- rfc_read_table
- Net 调用SAP RFC接口来读取数据
- .net 调用SAP RFC函数获取数据的两种方式
- .net MVC知识积累,当遇到一个页面有多个数据集合时可以采用哈希表来存贮集合。通过循环来读取数据!
- Net 调用SAP RFC接口来读取数据实战纪实
- asp.net 读取SAP数据(rfc形式全过程)
- .Net中,通过子窗体向父窗体传递数据
- 通过php来读取xml的数据
- FLEX 通过web 服务访问.NET数据信息
- RFC_READ_TABLE读取表的数据时每行字节数的最大限制
- 在.NET中使用XML、读取XML文件,插入数据到XML文档中。
- 【转载】VC 通过剪贴板读取word数据并存为jpg
- 用VB调用RFC,将数据写入SAP!
- ASP.NET 实现SAP数据的读取