private void DirectSaveDataTableToDataBase()
        {
            if (localdt != null)
            {
                if (TableName != null && SystemName != null)
                {
                    try
                    {
                        SapTable table = new SapTable(SystemName, TableName);
                        if (table.SaveDataTable(localdt))
                        {
                            MessageBox.Show("保存成功!!!");
                        }
                        else
                        {
                            MessageBox.Show("保存失败!!!");
                        }

                    }
                    catch (Exception exception)
                    {
                        MessageBox.Show(exception.Message);
                        //  throw;
                    }

                }
            }
        }
        public static void IDOC_INBOUND(RfcServerContext context, IRfcFunction function)
        {
            IRfcTable control = function.GetTable("IDOC_CONTROL_REC_40");
            IRfcTable data = function.GetTable("IDOC_DATA_REC_40");

            DataTable dtIdocControlData = GetDataTableFromRfcTable(control);
            DataTable dtIdocData = GetDataTableFromRfcTable(data);

            for (int i = 0; i < control.RowCount; i++)
            {
                IRfcStructure tControl = control[i];
                string client = ConfigFileTool.SAPGlobalSettings.GetDefaultSapCient();
                string TableName = "T" + tControl["DOCNUM"].GetValue().ToString().Trim();
                SapTable idoctable = new SapTable(client, TableName, "EDI_DD40");
                DataTable dt = GetDataTableFromRfcTable(data);
                idoctable.SaveDataTable(dt);
                processSingleIdoc(tControl, data);
            }

            //DataTable dtcontrol = GetDataTableFromRfcTable(control);

            //foreach (DataRow row in dtcontrol.Rows)
            //{
            //    for (int k = 0; k < dtcontrol.Columns.Count; k++)
            //    {
            //        Console.WriteLine(row[k].ToString());

            //    }
            //}
            //DataTable dtdata = GetDataTableFromRfcTable(data);

            //foreach (DataRow row in dtdata.Rows)
            //{
            //    for (int k = 0; k < dtdata.Columns.Count; k++)
            //    {
            //        Console.WriteLine(row[k].ToString());

            //    }
            //}
        }
        //public static rfcdestination getdestination(string sysname)
        //{
        //    return sapdestination.getdesbyname(sysname);
        //}
        /// <summary>
        /// 搜索SAP中所有的RFC函数,如果函数名为空,读取所有的函数列表
        /// 并直接在储到数据库中
        /// </summary>
        /// <param name="sysName"></param>
        /// <param name="functionName"></param>
        /// <returns></returns>
        public static bool GetRFCfunctionListAndSaveToDb(string sysName, string functionName)
        {
            try
            {
                RfcDestination destination = SAPDestination.GetDesByName(sysName);
                string _funame = string.Format("*{0}*", functionName);
                IRfcFunction RFC_FUNCTION_SEARCH = destination.Repository.CreateFunction("RFC_FUNCTION_SEARCH");
                RFC_FUNCTION_SEARCH.SetValue("FUNCNAME", _funame);
                RFC_FUNCTION_SEARCH.Invoke(destination);
                IRfcTable FUNCTIONS = RFC_FUNCTION_SEARCH.GetTable("FUNCTIONS");
                if (FUNCTIONS.RowCount > 0)
                {
                    //保存结果到数据库。

                    var _table = new SapTable(sysName, "RFC_FUNCTIONS", "RFCFUNC");
                    _table.DbConnectionString = ConfigFileTool.SAPGlobalSettings.GetDefaultDbConnection();
                    _table.NewTable = true;
                    _table.SaveDataTable(SAPFunction.RfcTableToDataTable(FUNCTIONS));
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (RfcAbapException rfce)
            {
                throw new SAPException(rfce.Key + rfce.Message);
            }
            catch (Exception e)
            {
                throw new SAPException(e.Message);
            }
        }
        private void saveDataTableToDataBase()
        {
            if (this.dt != null)
            {
                if (SourceSystem != null && SourceTableName != null)
                {
                    try
                    {
                        SapTable table = new SapTable(SourceSystem, SourceTableName, "CHAR8000");
                        table.EventLogMessage += table_EventLogMessage;
                        if (table.SaveDataTable(this.dt) == true)
                        {
                            MessageBox.Show("保存成功!!!");
                        }
                        else
                        {
                            MessageBox.Show("保存失败!!!");
                        }

                    }
                    catch (Exception exception)
                    {
                        MessageBox.Show(exception.Message);
                        //  throw;
                    }

                }
            }
        }
 /// <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);
     }
 }
        /// <summary>
        /// 根据IDOC编号把IDOC复制到本地。
        /// </summary>
        /// <param name="idocNumber">IDOC编号</param>
        /// <param name="SystemName">远程SAP系统名称</param>
        public void CopyIdocFromSAP(String idocNumber, String SystemName)
        {
            try
            {
                SAPINT.Utils.ReadTable idocReadItem = null;
                SAPINT.Utils.ReadTable idocReadHeader = null;
                SAPINT.Utils.ReadTable idocReadStatus = null;

                //DataTable dtIdocItem = new DataTable();
                //DataTable dtIdocHeder = new DataTable();
                //DataTable dtIdocStatus = new DataTable();

                idocNumber = idocNumber.TrimStart('0');
                String criteria = idocNumber.PadLeft(16, '0');
                criteria = String.Format("DOCNUM = '{0}'", criteria);

                String readTableFunction = ConfigFileTool.SAPGlobalSettings.GetReadTableFunction();

                idocReadItem = new SAPINT.Utils.ReadTable(SystemName);
                idocReadItem.TableName = "EDID4";
                idocReadItem.SetCustomFunctionName(readTableFunction);
                idocReadItem.AddCriteria(criteria);
                idocReadItem.Run();

                idocItem = idocReadItem.Result;

                if (idocItem.Rows.Count == 0)
                {
                    idocReadItem = new SAPINT.Utils.ReadTable(SystemName);
                    idocReadItem.TableName = "EDID2";
                    idocReadItem.SetCustomFunctionName(readTableFunction);
                    idocReadItem.AddCriteria(criteria);
                    idocReadItem.Run();
                    idocItem = idocReadItem.Result;

                }
                if (idocItem.Rows.Count == 0)
                {
                    idocReadItem = new SAPINT.Utils.ReadTable(SystemName);
                    idocReadItem.TableName = "EDIDD_OLD";
                    idocReadItem.SetCustomFunctionName(readTableFunction);
                    idocReadItem.AddCriteria(criteria);
                    idocReadItem.Run();
                    idocItem = idocReadItem.Result;
                }
                if (idocItem.Rows.Count == 0)
                {
                    throw new Exception(String.Format("无法找到IDOC{0}明细", idocNumber));
                }
                //读取IDOC头
                idocReadHeader = new SAPINT.Utils.ReadTable(SystemName);
                idocReadHeader.TableName = "EDIDC";
                idocReadHeader.SetCustomFunctionName(readTableFunction);
                idocReadHeader.AddCriteria(criteria);
                idocReadHeader.Run();
                idocHeader = idocReadHeader.Result;

                //if (idocHeader.Rows.Count != 1)
                //{
                //    throw new Exception(String.Format("无法找到IDOC{0}抬头定义", idocNumber));
                //}

                //读取IDOC状态
                idocReadStatus = new SAPINT.Utils.ReadTable(SystemName);
                idocReadStatus.TableName = "EDIDS";
                idocReadStatus.SetCustomFunctionName(readTableFunction);
                idocReadStatus.AddCriteria(criteria);
                idocReadStatus.Run();
                idocStatus = idocReadStatus.Result;

                SapTable idocTable = null;
                if (idocHeader.Rows.Count > 0)
                {
                    idocTable = new SapTable(SystemName, "EDIDC");
                    idocTable.DbConnectionString = this.ConnectionName;
                    idocTable.AppendToDb = AppendTodb;
                    idocTable.SaveDataTable(idocHeader);
                }

                if (idocItem.Rows.Count > 0)
                {
                    idocTable = new SapTable(SystemName, "EDID4", "EDID4");
                    idocTable.DbConnectionString = this.ConnectionName;
                    idocTable.AppendToDb = AppendTodb;
                    idocTable.SaveDataTable(idocItem);
                }

                if (idocStatus.Rows.Count > 0)
                {
                    idocTable = new SapTable(SystemName, "EDIDS");
                    idocTable.DbConnectionString = this.ConnectionName;
                    idocTable.AppendToDb = AppendTodb;
                    idocTable.SaveDataTable(idocStatus);

                }

            }
            catch (Exception)
            {

                throw;
            }
        }