打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ASP.Net 连接SAP通用类(来自智遥工作流软件)

智遥工作流软件中自带有一个连接SAP RFC的类,调用起来非常方便,以下是源代码:

注:.Net 要连接SAP,需要网上下载一个 NCO3.0

然后引用命名空间 using SAP.Middleware.Connector;

 public class SapRFCHelper

    {
        /// <summary>
        /// 获取登录SAP参数
        /// </summary>
        /// <returns></returns>
        public RfcConfigParameters GetRfcLoginParameters(string conn)
        {
            //1.获取连接参数
            Z_SAP sap = new Z_SAP();
            sap.GetModel(conn);
            
            RfcConfigParameters parameters = new RfcConfigParameters();
            parameters[RfcConfigParameters.Name] = sap.sap_system;
            parameters[RfcConfigParameters.User] = sap.sap_user;
            parameters[RfcConfigParameters.Password] = sap.sap_psd;
            parameters[RfcConfigParameters.Client] = sap.sap_client;
            parameters[RfcConfigParameters.Language] = sap.sap_language;
            parameters[RfcConfigParameters.AppServerHost] = sap.sap_server;
            parameters[RfcConfigParameters.SystemNumber] = sap.sap_systemnumber;
            parameters[RfcConfigParameters.IdleTimeout] = "6000";

            return parameters;
        }


        /// <summary>
        /// 调用RFC,返回一个表;注:RFC必须返回一个内表,无论是否有数据,否则出问题
        /// </summary>
        /// <param name="param">需要传入的字符串参数 例:{"P1|value1","P2|value2"}</param>
        /// <param name="RfcName">调用的Rfc名称</param>
        /// <param name="IT_tableName">Rfc执行后返回的内表名称</param>
        /// <returns></returns>
        public DataTable GetSapData(string conn,string[] param, string RfcName, string IT_tableName)
        {
            //1.登录SAP
            RfcConfigParameters parameters = GetRfcLoginParameters(conn);//获取登录参数
            RfcDestination rd = RfcDestinationManager.GetDestination(parameters);

            RfcRepository repo = rd.Repository;
            IRfcFunction f = repo.CreateFunction(RfcName);   //调用函数名

            foreach (string value in param)
            {
                string[] keyvalue = value.Split('|');
                f.SetValue(keyvalue[0], keyvalue[1].Trim());//传递入参数
            }
            f.Invoke(rd); //执行函数

            IRfcTable itb = f.GetTable(IT_tableName);       //获取执行RFC后返回的内表

            DataTable dt = new DataTable();
            //建立表结构
            for (int col = 0; col < itb.ElementCount; col++)
            {
                RfcElementMetadata rfcCol = itb.GetElementMetadata(col);
                string columnName = rfcCol.Name;
                dt.Columns.Add(columnName);
            }


            for (int rx = 0; rx < itb.RowCount; rx++)
            {
                object[] dr = new object[itb.ElementCount];


                for (int cx = 0; cx < dt.Columns.Count; cx++)
                {
                    dr[cx] = itb[rx][dt.Columns[cx].ColumnName].GetValue();
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }


        /// <summary>
        /// 直接调用RFC,不返回任何东西
        /// </summary>
        /// <param name="param">需要传入的字符串参数 例:{"P1|value1","P2|value2"}</param>
        /// <param name="RfcName">Rfc名称</param>
        public void ExecuteRFC(string conn,string[] param, string RfcName)
        {
            //1.登录SAP
            RfcConfigParameters parameters = GetRfcLoginParameters(conn);//获取登录参数
            RfcDestination rd = RfcDestinationManager.GetDestination(parameters);

            RfcRepository repo = rd.Repository;
            IRfcFunction f = repo.CreateFunction(RfcName);   //调用函数名

            foreach (string value in param)
            {
                string[] keyvalue = value.Split('|');
                f.SetValue(keyvalue[0], keyvalue[1].Trim());//传递入参数
            }
            f.Invoke(rd); //执行函数
        }


        /// <summary>
        /// 直接调用RFC,返回字符串
        /// </summary>
        /// <param name="param"></param>
        /// <param name="RfcName"></param>
        /// <param name="OutName">RFC中返回的参数名称,没有就""</param>
        public string GetSAPString(string conn,string[] param, string RfcName, string OutName)
        {
            //1.登录SAP
            RfcConfigParameters parameters = GetRfcLoginParameters(conn);//获取登录参数
            RfcDestination rd = RfcDestinationManager.GetDestination(parameters);


            RfcRepository repo = rd.Repository;
            IRfcFunction f = repo.CreateFunction(RfcName);   //调用函数名


            foreach (string value in param)
            {
                string[] keyvalue = value.Split('|');
                f.SetValue(keyvalue[0], keyvalue[1].Trim());//传递入参数
            }
            f.Invoke(rd); //执行函数

            return f.GetString("").ToString();      //获取执行RFC后返回的内表
        }


        /// <summary>
        /// 执行RFC,返回一个内表
        /// </summary>
        /// <param name="conn"></param>
        /// <param name="param"></param>
        /// <param name="RfcName"></param>
        /// <param name="IT_tableName"></param>
        /// <returns></returns>
        public IRfcTable GetSAPRfcTable(string conn, string[] param, string RfcName, string IT_tableName) 
        {
            //1.登录SAP
            RfcConfigParameters parameters = GetRfcLoginParameters(conn);//获取登录参数
            RfcDestination rd = RfcDestinationManager.GetDestination(parameters);


            RfcRepository repo = rd.Repository;
            IRfcFunction f = repo.CreateFunction(RfcName);   //调用函数名


            foreach (string value in param)
            {
                string[] keyvalue = value.Split('|');
                f.SetValue(keyvalue[0], keyvalue[1].Trim());//传递入参数
            }
            f.Invoke(rd); //执行函数


            IRfcTable itb = f.GetTable(IT_tableName);       //获取执行RFC后返回的内表
            return itb;
        }


        /// <summary>
        /// 将内表转换成DataTable
        /// </summary>
        /// <param name="rfcTable">内表名称</param>
        /// <returns>返回一个DataTable</returns>
        public DataTable ConvertToTable(IRfcTable rfcTable) 
        {
            DataTable dt = new DataTable();


            //建立表结构
            for (int col = 0; col < rfcTable.ElementCount; col++)
            {
                RfcElementMetadata rfcCol = rfcTable.GetElementMetadata(col);
                string columnName = rfcCol.Name;
                dt.Columns.Add(columnName);
            }

            for (int rx = 0; rx < rfcTable.RowCount; rx++)
            {
                object[] dr = new object[rfcTable.ElementCount];
                for (int cx = 0; cx < dt.Columns.Count; cx++)
                {
                    dr[cx] = rfcTable[rx][dt.Columns[cx].ColumnName].GetValue();
                }
                dt.Rows.Add(dr);
            }
            return dt;

        }

    }

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
易宝Java版在线支付
json和table互相转换
C# winform 开发之Excel操作
c# XML和实体类之间相互转换
C# 通过DataGridView更新数据库
dataset基本用法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服