/// <summary>
 /// 填充所有的参数调用SAP RFC函数后,填充所有的参数
 /// </summary>
 /// <param name="funame">函数名</param>
 /// <param name="list">输入参数列表</param>
 /// <param name="olist">输出参数列表</param>
 /// <returns></returns>
 private static bool InvokeFunctionFromJson(string sysName, string funame, RfcInputListJson list, out RfcOutputListJson olist)
 {
     try
     {
         if (funame == "" || null == list)
         {
             olist = null;
             return false;
         }
         if (!SAPFunction.CheckFunction(sysName, funame))
         {
             olist = null;
             return false;
         }
         RfcDestination destination = SAPDestination.GetDesByName(sysName);
         RfcFunctionMetadata MetaData = destination.Repository.GetFunctionMetadata(funame);
         IRfcFunction function = MetaData.CreateFunction();
         //初步序列化后的参数还需要进一步进行格式化,把结构体与表格都转化成SAP格式。
         list.All.Clear();
         list.All.AddRange(list.Import);
         list.All.AddRange(list.Change);
         list.All.AddRange(list.Tables);
         foreach (var item in list.All)
         {
             if (item.Value == null)
             {
                 continue;
             }
             RfcParameterMetadata p = MetaData[item.Name];
             if (p == null)
             {
                 continue;
             }
             //尝试把OBJECT反解析成对应的类型
             if (p.DataType == RfcDataType.STRUCTURE)
             {
                 Console.WriteLine(item.Value.GetType().ToString());
                 if (item.Value.GetType().ToString() != "Newtonsoft.Json.Linq.JArray" && item.Value.GetType().ToString() != "System.Array")
                 {
                     continue;
                 }
                 if (item.Value.GetType().ToString() != "System.Array")
                 {
                     // continue;
                 }
                 IRfcStructure str = function.GetStructure(item.Name, true);
                 var arr = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(item.Value.ToString());
                 if (arr.Count == 1)
                 {
                     //结构使用第一行
                     var o = arr[0];
                     for (int s = 0; s < str.Metadata.FieldCount; s++)
                     {
                         RfcFieldMetadata field = str.Metadata[s];
                         str.SetValue(field.Name, o[field.Name]);
                     }
                 }
                 item.Value = str;
             }
             else if (p.DataType == RfcDataType.TABLE)
             {
                 if (string.IsNullOrEmpty(item.Value.ToString()))
                 {
                     continue;
                 }
                 IRfcTable tbl = function.GetTable(item.Name, true);
                 var arr = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(item.Value.ToString());
                 for (int x = 0; x < arr.Count; x++)
                 {
                     IRfcStructure str = tbl.Metadata.LineType.CreateStructure();
                     for (int s = 0; s < tbl.Metadata.LineType.FieldCount; s++)
                     {
                         RfcFieldMetadata field = tbl.Metadata.LineType[s];
                         str.SetValue(field.Name, arr[x][field.Name]);
                     }
                     tbl.Append(str);
                 }
                 item.Value = tbl;
             }
         }
         //填充所有的参数
         for (int i = 0; i < MetaData.ParameterCount; i++)
         {
             RfcParameterMetadata pMetadata = MetaData[i];
             if (list.All.Exists(x => x.Name == pMetadata.Name))
             {
                 var value = list.All.Find(x => x.Name == pMetadata.Name).Value;
                 if (value != null)
                 {
                     function.SetValue(pMetadata.Name, value);
                 }
             }
         }
         //远程调用函数
         try
         {
             function.Invoke(destination);
         }
         catch (RfcAbapException ee)
         {
             throw new Exception(ee.Key + ee.Message);
         }
         //保留调用结果。
         RfcOutputListJson outlist = new RfcOutputListJson();
         //循环读取结果。把所以的结果都保存到List<object>中。
         for (int i = 0; i < MetaData.ParameterCount; i++)
         {
             RfcParameterMetadata pMetadata = MetaData[i];
             //
             if (pMetadata.Direction == RfcDirection.IMPORT)
             {
                 continue;
             }
             RfcKeyValueJson d = new RfcKeyValueJson();
             d.Name = pMetadata.Name;
             if (pMetadata.DataType == RfcDataType.STRUCTURE)
             {
                 //注意,在这里就算是结构体,也把放到List中,这样可以序列化成数组格式。
                 List<object> tb_list = new List<object>();
                 IRfcStructure row = function.GetStructure(pMetadata.Name);
                 Dictionary<string, object> rowd = new Dictionary<string, object>();
                 for (int x = 0; x < row.Metadata.FieldCount; x++)
                 {
                     rowd.Add(row[x].Metadata.Name, row[x].GetValue());
                 }
                 tb_list.Add(rowd);
                 d.Value = tb_list;
             }
             else if (pMetadata.DataType == RfcDataType.TABLE)
             {
                 List<object> tb_list = new List<object>();
                 IRfcTable table = function.GetTable(pMetadata.Name);
                 var readItems = table.RowCount;
                 if (readItems > 0)
                 {
                     try
                     {
                         //保存结果到数据库。
                         RfcTableMetadata tableMeta = pMetadata.ValueMetadataAsTableMetadata;
                         var _table = new SapTable(sysName, funame + "_" + pMetadata.Name, tableMeta.LineType.Name);
                         _table.DbConnectionString = ConfigFileTool.SAPGlobalSettings.GetDefaultDbConnection();
                         _table.NewTable = true;
                         _table.SaveDataTable(SAPFunction.RfcTableToDataTable(table));
                         // RfcTableToDb dbhelper = new RfcTableToDb(funame, d.Name, tble);
                         //  dbhelper.saveTable();
                     }
                     catch (Exception ee)
                     {
                         throw new Exception(ee.Message);
                     }
                     // ThreadStart threadStart = new ThreadStart(dbhelper.saveTable);
                     //  Thread thread = new Thread(threadStart);
                     //  thread.Start();
                     //DbHelper.saveRfcTable(funame,ref tble);
                 }
                 //控制100条,数据过多会序列华出错。以后再做改善,
                 if (readItems > 10)
                 {
                     readItems = 10;
                 }
                 for (int rowc = 0; rowc < readItems; rowc++)
                 {
                     IRfcStructure row = table[rowc];
                     Dictionary<string, object> rowd = new Dictionary<string, object>();
                     for (int x = 0; x < row.Metadata.FieldCount; x++)
                     {
                         rowd.Add(row[x].Metadata.Name, row[x].GetValue());
                     }
                     tb_list.Add(rowd);
                 }
                 d.Value = tb_list;
             }
             else
             {
                 d.Value = function.GetValue(pMetadata.Name);
             }
             //存放于不同的集合也是为了序列化方便。
             switch (pMetadata.Direction)
             {
                 case RfcDirection.CHANGING:
                     outlist.Change.Add(d);
                     break;
                 case RfcDirection.EXPORT:
                     outlist.Export.Add(d);
                     break;
                 case RfcDirection.IMPORT:
                     outlist.Import.Add(d);
                     break;
                 case RfcDirection.TABLES:
                     outlist.Tables.Add(d);
                     break;
             }
         }
         olist = outlist;
         return true;
     }
     catch (Exception e)
     {
         throw new SAPException(e.Message);
     }
 }
Пример #2
0
        /// <summary>
        /// 填充所有的参数调用SAP RFC函数后,填充所有的参数
        /// </summary>
        /// <param name="funame">函数名</param>
        /// <param name="list">输入参数列表</param>
        /// <param name="olist">输出参数列表</param>
        /// <returns></returns>
        private static bool InvokeFunctionFromJson(string sysName, string funame, RfcInputListJson list, out RfcOutputListJson olist)
        {
            try
            {
                if (funame == "" || null == list)
                {
                    olist = null;
                    return(false);
                }
                if (!SAPFunction.CheckFunction(sysName, funame))
                {
                    olist = null;
                    return(false);
                }
                RfcDestination      destination = SAPDestination.GetDesByName(sysName);
                RfcFunctionMetadata MetaData    = destination.Repository.GetFunctionMetadata(funame);
                IRfcFunction        function    = MetaData.CreateFunction();
                //初步序列化后的参数还需要进一步进行格式化,把结构体与表格都转化成SAP格式。
                list.All.Clear();
                list.All.AddRange(list.Import);
                list.All.AddRange(list.Change);
                list.All.AddRange(list.Tables);
                foreach (var item in list.All)
                {
                    if (item.Value == null)
                    {
                        continue;
                    }
                    RfcParameterMetadata p = MetaData[item.Name];
                    if (p == null)
                    {
                        continue;
                    }
                    //尝试把OBJECT反解析成对应的类型
                    if (p.DataType == RfcDataType.STRUCTURE)
                    {
                        Console.WriteLine(item.Value.GetType().ToString());
                        if (item.Value.GetType().ToString() != "Newtonsoft.Json.Linq.JArray" && item.Value.GetType().ToString() != "System.Array")
                        {
                            continue;
                        }
                        if (item.Value.GetType().ToString() != "System.Array")
                        {
                            // continue;
                        }
                        IRfcStructure str = function.GetStructure(item.Name, true);
                        var           arr = JsonConvert.DeserializeObject <List <Dictionary <string, object> > >(item.Value.ToString());
                        if (arr.Count == 1)
                        {
                            //结构使用第一行
                            var o = arr[0];
                            for (int s = 0; s < str.Metadata.FieldCount; s++)
                            {
                                RfcFieldMetadata field = str.Metadata[s];
                                str.SetValue(field.Name, o[field.Name]);
                            }
                        }
                        item.Value = str;
                    }
                    else if (p.DataType == RfcDataType.TABLE)
                    {
                        if (string.IsNullOrEmpty(item.Value.ToString()))
                        {
                            continue;
                        }
                        IRfcTable tbl = function.GetTable(item.Name, true);
                        var       arr = JsonConvert.DeserializeObject <List <Dictionary <string, object> > >(item.Value.ToString());
                        for (int x = 0; x < arr.Count; x++)
                        {
                            IRfcStructure str = tbl.Metadata.LineType.CreateStructure();
                            for (int s = 0; s < tbl.Metadata.LineType.FieldCount; s++)
                            {
                                RfcFieldMetadata field = tbl.Metadata.LineType[s];
                                str.SetValue(field.Name, arr[x][field.Name]);
                            }
                            tbl.Append(str);
                        }
                        item.Value = tbl;
                    }
                }
                //填充所有的参数
                for (int i = 0; i < MetaData.ParameterCount; i++)
                {
                    RfcParameterMetadata pMetadata = MetaData[i];
                    if (list.All.Exists(x => x.Name == pMetadata.Name))
                    {
                        var value = list.All.Find(x => x.Name == pMetadata.Name).Value;
                        if (value != null)
                        {
                            function.SetValue(pMetadata.Name, value);
                        }
                    }
                }
                //远程调用函数
                try
                {
                    function.Invoke(destination);
                }
                catch (RfcAbapException ee)
                {
                    throw new Exception(ee.Key + ee.Message);
                }
                //保留调用结果。
                RfcOutputListJson outlist = new RfcOutputListJson();
                //循环读取结果。把所以的结果都保存到List<object>中。
                for (int i = 0; i < MetaData.ParameterCount; i++)
                {
                    RfcParameterMetadata pMetadata = MetaData[i];
                    //
                    if (pMetadata.Direction == RfcDirection.IMPORT)
                    {
                        continue;
                    }
                    RfcKeyValueJson d = new RfcKeyValueJson();
                    d.Name = pMetadata.Name;
                    if (pMetadata.DataType == RfcDataType.STRUCTURE)
                    {
                        //注意,在这里就算是结构体,也把放到List中,这样可以序列化成数组格式。
                        List <object> tb_list            = new List <object>();
                        IRfcStructure row                = function.GetStructure(pMetadata.Name);
                        Dictionary <string, object> rowd = new Dictionary <string, object>();
                        for (int x = 0; x < row.Metadata.FieldCount; x++)
                        {
                            rowd.Add(row[x].Metadata.Name, row[x].GetValue());
                        }
                        tb_list.Add(rowd);
                        d.Value = tb_list;
                    }
                    else if (pMetadata.DataType == RfcDataType.TABLE)
                    {
                        List <object> tb_list   = new List <object>();
                        IRfcTable     table     = function.GetTable(pMetadata.Name);
                        var           readItems = table.RowCount;
                        if (readItems > 0)
                        {
                            try
                            {
                                //保存结果到数据库。
                                RfcTableMetadata tableMeta = pMetadata.ValueMetadataAsTableMetadata;
                                var _table = new SapTable(sysName, funame + "_" + pMetadata.Name, tableMeta.LineType.Name);
                                _table.DbConnectionString = ConfigFileTool.SAPGlobalSettings.GetDefaultDbConnection();
                                _table.NewTable           = true;
                                _table.SaveDataTable(SAPFunction.RfcTableToDataTable(table));
                                // RfcTableToDb dbhelper = new RfcTableToDb(funame, d.Name, tble);
                                //  dbhelper.saveTable();
                            }
                            catch (Exception ee)
                            {
                                throw new Exception(ee.Message);
                            }
                            // ThreadStart threadStart = new ThreadStart(dbhelper.saveTable);
                            //  Thread thread = new Thread(threadStart);
                            //  thread.Start();
                            //DbHelper.saveRfcTable(funame,ref tble);
                        }
                        //控制100条,数据过多会序列华出错。以后再做改善,
                        if (readItems > 10)
                        {
                            readItems = 10;
                        }
                        for (int rowc = 0; rowc < readItems; rowc++)
                        {
                            IRfcStructure row = table[rowc];
                            Dictionary <string, object> rowd = new Dictionary <string, object>();
                            for (int x = 0; x < row.Metadata.FieldCount; x++)
                            {
                                rowd.Add(row[x].Metadata.Name, row[x].GetValue());
                            }
                            tb_list.Add(rowd);
                        }
                        d.Value = tb_list;
                    }
                    else
                    {
                        d.Value = function.GetValue(pMetadata.Name);
                    }
                    //存放于不同的集合也是为了序列化方便。
                    switch (pMetadata.Direction)
                    {
                    case RfcDirection.CHANGING:
                        outlist.Change.Add(d);
                        break;

                    case RfcDirection.EXPORT:
                        outlist.Export.Add(d);
                        break;

                    case RfcDirection.IMPORT:
                        outlist.Import.Add(d);
                        break;

                    case RfcDirection.TABLES:
                        outlist.Tables.Add(d);
                        break;
                    }
                }
                olist = outlist;
                return(true);
            }
            catch (Exception e)
            {
                throw new SAPException(e.Message);
            }
        }