C#调用SAP函数,传入参数为表

 

//using SAP.Middleware.Connector;
 
//private RfcConfigParameters _params = new RfcConfigParameters();
//private RfcDestination _rfcDest;
 
//RfcConfigParameters parms = new RfcConfigParameters();
//            parms.Add(RfcConfigParameters.Name, "xxx");
//            parms.Add(RfcConfigParameters.AppServerHost, "xxx");
//            parms.Add(RfcConfigParameters.SystemNumber, "00");
//            parms.Add(RfcConfigParameters.Client, "900");
//            parms.Add(RfcConfigParameters.User, "xxx");
//            parms.Add(RfcConfigParameters.Password, "xxxxx");
//            parms.Add(RfcConfigParameters.Language, "EN");
//            parms.Add(RfcConfigParameters.PoolSize, "5");
//            parms.Add(RfcConfigParameters.MaxPoolSize, "10");
//            parms.Add(RfcConfigParameters.IdleTimeout, "600");
//            return parms;
 
//_rfcDest = RfcDestinationManager.GetDestination(_params);
public DataTable GetSAPData(DataTable dt)
        {
            DataTable dtSAPData = new DataTable();
            try
            {
                dtSAPData.Columns.Add("DATA1", typeof(string));
                dtSAPData.Columns.Add("DATA2", typeof(string));
                dtSAPData.Columns.Add("DATA3", typeof(string));
 
                string strOrder = null;
 
                RfcRepository   rfcRep      =   _rfcDest.Repository;
                IRfcFunction    func        =   rfcRep.CreateFunction("Z_RFC_XXXX");
                IRfcTable       tSAP    =   func.GetTable("INPUT_TABLE");
 
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    str1 = dt.Rows[i][0].ToString();
                    str2 = dt.Rows[i][1].ToString();
                    str3 = dt.Rows[i][2].ToString();
                    IRfcStructure struSAP = tSAP.Metadata.LineType.CreateStructure();
                    struSAP.SetValue("str1", str1);
                    struSAP.SetValue("str2", str2);
                    struSAP.SetValue("str3", str3);
                    tSAP.Append(struSAP);
                }
                func.SetValue("INPUT_TABLE", tSAP); //table 参数
                func.SetValue("WERKS", "A");        //单个参数    
                func.SetValue("STATUS", "B");    //单个参数
                func.Invoke(_rfcDest);
                IRfcTable SAPDataTable = func.GetTable("RETURN_TABLE");
 
                for (int i = 0; i < SAPDataTable.RowCount; i++)
                {
                    IRfcStructure   stru    =   SAPDataTable[i];
                    DataRow         dr      =   dtSAPData.NewRow();
                    dr["DATA1"] = stru.GetValue("X").ToString();   
                    dr["DATA2"] = stru.GetValue("Y").ToString();   
                    dr["DATA3"] = stru.GetValue("Z").ToString();   
                    dtSAPData.Rows.Add(dr);
                }
            }
            catch(Exception ex)
            {
                string strcatch = ex.Message;
            }
            return dtSAPData;
        }

 

        以上是传入传出都为table的情况。
        还有一种直接传入一条数据的情况,当然,SAP函数里面的接收参数还是table        
        代码如下:
       
        var rfcDestination = SAPUtility.GetDestination(SapDestionation.PRD_800, SapUsers.PRD_IT06);
        BAPI_USER_GETLIST
        RfcRepository rfcrep = rfcDestination.Repository;
        IRfcFunction myfun = rfcrep.CreateFunction("Z_MISGETTEXT");//调用的SAP函数
        var table = myfun.GetTable("ZOBJTEXT");//SAP函数的table
        //设置传入参数
        table.Insert();
        table.CurrentIndex = 0;
        var currentRow = table.CurrentRow;
        currentRow.SetValue("TDOBJECT", "测试OBJ");
        currentRow.SetValue("TDNAME", "测试NAME");
        currentRow.SetValue("TDID", "测试ID");
        currentRow.SetValue("LANGUAGE", "测试语言");
        myfun.Invoke(rfcDestination); //提交调用BAPI
        //取得返回值,这里的TEXT项目也是SAP函数table【ZOBJTEXT】中的字段
        for (int i = 0; i < table.RowCount; i++)
        {
            table.CurrentIndex = i;
            var currentRow2 = table.CurrentRow;
            Console.WriteLine(currentRow2.GetString("TEXT"));
        }
        Console.Read();
     

 

posted @   毛小毛  阅读(622)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示