コード例 #1
0
 public IdocMeta(String p_SystemName, Idoc pidoc)
     : this(p_SystemName)
 {
     this.idoc     = pidoc;
     this.idocType = pidoc.IDOCTYP;
     this.cimType  = pidoc.CIMTYP;
 }
コード例 #2
0
 public IdocMeta(String p_SystemName, Idoc pidoc)
     : this(p_SystemName)
 {
     this.idoc = pidoc;
     this.idocType = pidoc.IDOCTYP;
     this.cimType = pidoc.CIMTYP;
 }
コード例 #3
0
ファイル: IdocUtil.cs プロジェクト: shuicheng9/sap_interface
        /// <summary>
        /// 根据IDOC编号从SAP系统里读取一个idoc
        /// </summary>
        /// <param name="idocNumber"></param>
        /// <returns></returns>
        public Idoc GetIodcFromSapDataBase(String idocNumber)
        {
            SAPINT.Utils.ReadTable idocReadItem   = null;
            SAPINT.Utils.ReadTable idocReadHeader = null;
            DataTable dtIdocItem  = new DataTable();
            DataTable dtIdocHeder = 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 Utils.ReadTable(SystemName);
            idocReadItem.TableName = "EDID4";
            idocReadItem.SetCustomFunctionName(readTableFunction);
            idocReadItem.AddCriteria(criteria);
            idocReadItem.Run();
            dtIdocItem = idocReadItem.Result;

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

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

            Idoc idoc = ProcessSingleIdocFromDataTable(dtIdocHeder, dtIdocItem);

            return(idoc);
        }
コード例 #4
0
        private static void s_IncomingIdoc(RFCServer sender, Idoc idoc)
        {
            Console.WriteLine("Recieved Idoc " + idoc.IDOCTYP);
            IdocSegment e1maram = idoc.Segments["E2MARAM008", 0];

            for (int i = 0; i < e1maram.ChildSegments.Count; i++)
            {
                if (e1maram.ChildSegments[i].SegmentName == "E2MAKTM001")
                {
                    Console.WriteLine("Materialtext found: " +
                                      e1maram.ChildSegments[i].ReadDataBuffer(4, 40));
                }
            }
        }
コード例 #5
0
        public Idoc DecompileIdoc(Idoc pIdoc)
        {
            this.idoc = pIdoc;
            this.cimType = pIdoc.CIMTYP;
            this.idocType = pIdoc.IDOCTYP;
            //在这里进行缓存,不要每次都更新IDOC的类型定义。
            if (this.cimType != pIdoc.CIMTYP || this.idocType != pIdoc.IDOCTYP || _SEGMENTS.Count == 0)
            {
                GetIdocTypeDefinition();
            }

            if (idoc == null)
            {
                throw new SAPException("Idoc is null");
            }
            for (int i = 0; i < idoc.Segments.Count; i++)
            {
                IdocSegment segment = idoc.Segments[i];
                DecompileSegment(segment);
            }
            return idoc;
        }
コード例 #6
0
        public Idoc DecompileIdoc(Idoc pIdoc)
        {
            this.idoc     = pIdoc;
            this.cimType  = pIdoc.CIMTYP;
            this.idocType = pIdoc.IDOCTYP;
            //在这里进行缓存,不要每次都更新IDOC的类型定义。
            if (this.cimType != pIdoc.CIMTYP || this.idocType != pIdoc.IDOCTYP || _SEGMENTS.Count == 0)
            {
                GetIdocTypeDefinition();
            }


            if (idoc == null)
            {
                throw new SAPException("Idoc is null");
            }
            for (int i = 0; i < idoc.Segments.Count; i++)
            {
                IdocSegment segment = idoc.Segments[i];
                DecompileSegment(segment);
            }
            return(idoc);
        }
コード例 #7
0
ファイル: IdocUtil.cs プロジェクト: shuicheng9/sap_interface
        /// <summary>
        /// 转换RFC函数读取过来的IDOC.
        /// </summary>
        /// <param name="tControl"></param>
        /// <param name="datarows"></param>
        /// <returns></returns>
        private Idoc processSingleIdoc(IRfcStructure tControl, IRfcTable datarows)
        {
            Idoc idoc = new Idoc
            {
                TABNAM  = tControl["TABNAM"].GetValue().ToString().Trim(),
                MANDT   = tControl["MANDT"].GetValue().ToString().Trim(),
                DOCNUM  = tControl["DOCNUM"].GetValue().ToString().Trim(),
                DOCREL  = tControl["DOCREL"].GetValue().ToString().Trim(),
                STATUS  = tControl["STATUS"].GetValue().ToString().Trim(),
                DIRECT  = tControl["DIRECT"].GetValue().ToString().Trim(),
                OUTMOD  = tControl["OUTMOD"].GetValue().ToString().Trim(),
                EXPRSS  = tControl["EXPRSS"].ToString().Trim(),
                IDOCTYP = tControl["IDOCTYP"].GetValue().ToString().Trim(),
                CIMTYP  = tControl["CIMTYP"].GetValue().ToString().Trim(),
                MESTYP  = tControl["MESTYP"].GetValue().ToString().Trim(),
                MESCOD  = tControl["MESCOD"].GetValue().ToString().Trim(),
                MESFCT  = tControl["MESFCT"].GetValue().ToString().Trim(),
                STD     = tControl["STD"].GetValue().ToString().Trim(),
                STDVRS  = tControl["STDVRS"].GetValue().ToString().Trim(),
                STDMES  = tControl["STDMES"].GetValue().ToString().Trim(),
                SNDPOR  = tControl["SNDPOR"].GetValue().ToString().Trim(),
                SNDPRT  = tControl["SNDPRT"].GetValue().ToString().Trim(),
                SNDPFC  = tControl["SNDPFC"].GetValue().ToString().Trim(),
                SNDPRN  = tControl["SNDPRN"].GetValue().ToString().Trim(),
                SNDSAD  = tControl["SNDSAD"].GetValue().ToString().Trim(),
                SNDLAD  = tControl["SNDLAD"].GetValue().ToString().Trim(),
                RCVPOR  = tControl["RCVPOR"].GetValue().ToString().Trim(),
                RCVPRT  = tControl["RCVPRT"].GetValue().ToString().Trim(),
                RCVPFC  = tControl["RCVPFC"].GetValue().ToString().Trim(),
                RCVPRN  = tControl["RCVPRN"].GetValue().ToString().Trim(),
                RCVSAD  = tControl["RCVSAD"].GetValue().ToString().Trim(),
                RCVLAD  = tControl["RCVLAD"].GetValue().ToString().Trim(),
                CREDAT  = tControl["CREDAT"].GetValue().ToString().Trim(),
                CRETIM  = tControl["CRETIM"].GetValue().ToString().Trim(),
                REFINT  = tControl["REFINT"].GetValue().ToString().Trim(),
                REFGRP  = tControl["REFGRP"].GetValue().ToString().Trim(),
                REFMES  = tControl["REFMES"].GetValue().ToString().Trim(),
                ARCKEY  = tControl["ARCKEY"].GetValue().ToString().Trim(),
                SERIAL  = tControl["SERIAL"].GetValue().ToString().Trim()
            };

            Hashtable hashtable = new Hashtable();

            for (int i = 0; i < datarows.RowCount; i++)
            {
                IRfcStructure structure = datarows[i];
                if (structure["DOCNUM"].GetValue().ToString().Trim().Equals(tControl["DOCNUM"].GetValue().ToString().Trim()))
                {
                    IdocSegment newSegment = new IdocSegment();
                    if (structure["PSGNUM"].GetValue().ToString() == "000000")
                    {
                        idoc.Segments.Add(newSegment);
                    }
                    else
                    {
                        IdocSegment segment2 = (IdocSegment)hashtable[structure["PSGNUM"].GetValue().ToString()];
                        if (segment2 != null)
                        {
                            segment2.ChildSegments.Add(newSegment);
                        }
                        else
                        {
                            idoc.Segments.Add(newSegment);
                        }
                    }
                    newSegment.SegmentName   = structure["SEGNAM"].GetValue().ToString();
                    newSegment.SegmentNumber = structure["SEGNUM"].ToString();
                    segNameList.Add(newSegment.SegmentName);
                    string content = structure["SDATA"].GetValue().ToString();
                    newSegment.WriteDataBuffer(content, 0, 0x3e8);
                    if (!hashtable.ContainsKey(structure["SEGNUM"].GetValue().ToString()))
                    {
                        hashtable.Add(structure["SEGNUM"].GetValue().ToString(), newSegment);
                    }
                }
            }
            return(idoc);
        }
コード例 #8
0
ファイル: IdocUtil.cs プロジェクト: shuicheng9/sap_interface
        /// <summary>
        /// 把从数据库中读取的IDOC定义转换成一个IDOC对象。
        /// </summary>
        /// <param name="dtHeader"></param>
        /// <param name="dtItem"></param>
        /// <returns></returns>
        public Idoc ProcessSingleIdocFromDataTable(DataTable dtHeader, DataTable dtItem)
        {
            if (dtHeader == null || dtItem == null)
            {
                throw new SAPException("无效的IDOC定义!!");
            }
            if (dtHeader.Rows.Count == 0)
            {
                throw new SAPException("无法找到IDOC抬头定义!!");
            }
            if (dtHeader.Rows.Count > 1)
            {
                throw new SAPException("存在重复的IDOC!!");
            }

            if (dtItem.Rows.Count == 0)
            {
                throw new SAPException("无法找到IDOC明细!!");
            }

            DataRow header = dtHeader.Rows[0];
            Idoc    idoc   = null;

            try
            {
                idoc = new Idoc
                {
                    // TABNAM = header["TABNAM"].ToString().Trim(),
                    MANDT  = header["MANDT"].ToString().Trim(),
                    DOCNUM = header["DOCNUM"].ToString().Trim(),
                    DOCREL = header["DOCREL"].ToString().Trim(),
                    STATUS = header["STATUS"].ToString().Trim(),
                    DIRECT = header["DIRECT"].ToString().Trim(),
                    OUTMOD = header["OUTMOD"].ToString().Trim(),
                    EXPRSS = header["EXPRSS"].ToString().Trim(),
                    //特别注意不要使用“DOCTYP”
                    IDOCTYP = header["IDOCTP"].ToString().Trim(),
                    CIMTYP  = header["CIMTYP"].ToString().Trim(),
                    MESTYP  = header["MESTYP"].ToString().Trim(),
                    MESCOD  = header["MESCOD"].ToString().Trim(),
                    MESFCT  = header["MESFCT"].ToString().Trim(),
                    STD     = header["STD"].ToString().Trim(),
                    STDVRS  = header["STDVRS"].ToString().Trim(),
                    STDMES  = header["STDMES"].ToString().Trim(),
                    SNDPOR  = header["SNDPOR"].ToString().Trim(),
                    SNDPRT  = header["SNDPRT"].ToString().Trim(),
                    SNDPFC  = header["SNDPFC"].ToString().Trim(),
                    SNDPRN  = header["SNDPRN"].ToString().Trim(),
                    SNDSAD  = header["SNDSAD"].ToString().Trim(),
                    SNDLAD  = header["SNDLAD"].ToString().Trim(),
                    RCVPOR  = header["RCVPOR"].ToString().Trim(),
                    RCVPRT  = header["RCVPRT"].ToString().Trim(),
                    RCVPFC  = header["RCVPFC"].ToString().Trim(),
                    RCVPRN  = header["RCVPRN"].ToString().Trim(),
                    RCVSAD  = header["RCVSAD"].ToString().Trim(),
                    RCVLAD  = header["RCVLAD"].ToString().Trim(),
                    CREDAT  = header["CREDAT"].ToString().Trim(),
                    CRETIM  = header["CRETIM"].ToString().Trim(),
                    REFINT  = header["REFINT"].ToString().Trim(),
                    REFGRP  = header["REFGRP"].ToString().Trim(),
                    REFMES  = header["REFMES"].ToString().Trim(),
                    ARCKEY  = header["ARCKEY"].ToString().Trim(),
                    SERIAL  = header["SERIAL"].ToString().Trim()
                };

                Hashtable hashtable = new Hashtable();
                for (int i = 0; i < dtItem.Rows.Count; i++)
                {
                    DataRow item = dtItem.Rows[i];
                    if (item["DOCNUM"].ToString().Trim().Equals(header["DOCNUM"].ToString().Trim()))
                    {
                        IdocSegment newSegment = new IdocSegment();
                        if (item["PSGNUM"].ToString() == "000000")
                        {
                            idoc.Segments.Add(newSegment);
                        }
                        else
                        {
                            IdocSegment segment2 = (IdocSegment)hashtable[item["PSGNUM"].ToString()];
                            if (segment2 != null)
                            {
                                segment2.ChildSegments.Add(newSegment);
                            }
                            else
                            {
                                idoc.Segments.Add(newSegment);
                            }
                        }
                        newSegment.SegmentName   = item["SEGNAM"].ToString();
                        newSegment.SegmentNumber = item["SEGNUM"].ToString();
                        string content = item["SDATA"].ToString();
                        newSegment.WriteDataBuffer(content, 0, 0x3e8);
                        if (!hashtable.ContainsKey(item["SEGNUM"].ToString()))
                        {
                            hashtable.Add(item["SEGNUM"].ToString(), newSegment);
                        }
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }

            return(idoc);
        }
コード例 #9
0
        /// <summary>
        /// 转换RFC函数读取过来的IDOC.
        /// </summary>
        /// <param name="tControl"></param>
        /// <param name="datarows"></param>
        /// <returns></returns>
        private Idoc processSingleIdoc(IRfcStructure tControl, IRfcTable datarows)
        {
            Idoc idoc = new Idoc
            {
                TABNAM = tControl["TABNAM"].GetValue().ToString().Trim(),
                MANDT = tControl["MANDT"].GetValue().ToString().Trim(),
                DOCNUM = tControl["DOCNUM"].GetValue().ToString().Trim(),
                DOCREL = tControl["DOCREL"].GetValue().ToString().Trim(),
                STATUS = tControl["STATUS"].GetValue().ToString().Trim(),
                DIRECT = tControl["DIRECT"].GetValue().ToString().Trim(),
                OUTMOD = tControl["OUTMOD"].GetValue().ToString().Trim(),
                EXPRSS = tControl["EXPRSS"].ToString().Trim(),
                IDOCTYP = tControl["IDOCTYP"].GetValue().ToString().Trim(),
                CIMTYP = tControl["CIMTYP"].GetValue().ToString().Trim(),
                MESTYP = tControl["MESTYP"].GetValue().ToString().Trim(),
                MESCOD = tControl["MESCOD"].GetValue().ToString().Trim(),
                MESFCT = tControl["MESFCT"].GetValue().ToString().Trim(),
                STD = tControl["STD"].GetValue().ToString().Trim(),
                STDVRS = tControl["STDVRS"].GetValue().ToString().Trim(),
                STDMES = tControl["STDMES"].GetValue().ToString().Trim(),
                SNDPOR = tControl["SNDPOR"].GetValue().ToString().Trim(),
                SNDPRT = tControl["SNDPRT"].GetValue().ToString().Trim(),
                SNDPFC = tControl["SNDPFC"].GetValue().ToString().Trim(),
                SNDPRN = tControl["SNDPRN"].GetValue().ToString().Trim(),
                SNDSAD = tControl["SNDSAD"].GetValue().ToString().Trim(),
                SNDLAD = tControl["SNDLAD"].GetValue().ToString().Trim(),
                RCVPOR = tControl["RCVPOR"].GetValue().ToString().Trim(),
                RCVPRT = tControl["RCVPRT"].GetValue().ToString().Trim(),
                RCVPFC = tControl["RCVPFC"].GetValue().ToString().Trim(),
                RCVPRN = tControl["RCVPRN"].GetValue().ToString().Trim(),
                RCVSAD = tControl["RCVSAD"].GetValue().ToString().Trim(),
                RCVLAD = tControl["RCVLAD"].GetValue().ToString().Trim(),
                CREDAT = tControl["CREDAT"].GetValue().ToString().Trim(),
                CRETIM = tControl["CRETIM"].GetValue().ToString().Trim(),
                REFINT = tControl["REFINT"].GetValue().ToString().Trim(),
                REFGRP = tControl["REFGRP"].GetValue().ToString().Trim(),
                REFMES = tControl["REFMES"].GetValue().ToString().Trim(),
                ARCKEY = tControl["ARCKEY"].GetValue().ToString().Trim(),
                SERIAL = tControl["SERIAL"].GetValue().ToString().Trim()
            };

            Hashtable hashtable = new Hashtable();
            for (int i = 0; i < datarows.RowCount; i++)
            {
                IRfcStructure structure = datarows[i];
                if (structure["DOCNUM"].GetValue().ToString().Trim().Equals(tControl["DOCNUM"].GetValue().ToString().Trim()))
                {
                    IdocSegment newSegment = new IdocSegment();
                    if (structure["PSGNUM"].GetValue().ToString() == "000000")
                    {
                        idoc.Segments.Add(newSegment);
                    }
                    else
                    {
                        IdocSegment segment2 = (IdocSegment)hashtable[structure["PSGNUM"].GetValue().ToString()];
                        if (segment2 != null)
                        {
                            segment2.ChildSegments.Add(newSegment);
                        }
                        else
                        {
                            idoc.Segments.Add(newSegment);
                        }
                    }
                    newSegment.SegmentName = structure["SEGNAM"].GetValue().ToString();
                    newSegment.SegmentNumber = structure["SEGNUM"].ToString();
                    segNameList.Add(newSegment.SegmentName);
                    string content = structure["SDATA"].GetValue().ToString();
                    newSegment.WriteDataBuffer(content, 0, 0x3e8);
                    if (!hashtable.ContainsKey(structure["SEGNUM"].GetValue().ToString()))
                    {
                        hashtable.Add(structure["SEGNUM"].GetValue().ToString(), newSegment);
                    }
                }
            }
            return idoc;
        }
コード例 #10
0
        /// <summary>
        /// 把从数据库中读取的IDOC定义转换成一个IDOC对象。
        /// </summary>
        /// <param name="dtHeader"></param>
        /// <param name="dtItem"></param>
        /// <returns></returns>
        public Idoc ProcessSingleIdocFromDataTable(DataTable dtHeader, DataTable dtItem)
        {
            if (dtHeader==null || dtItem == null)
            {
                throw new SAPException("无效的IDOC定义!!");
            }
            if (dtHeader.Rows.Count == 0 )
            {
                throw new SAPException("无法找到IDOC抬头定义!!");
            }
            if (dtHeader.Rows.Count > 1)
            {
                throw new SAPException("存在重复的IDOC!!");
            }

            if (dtItem.Rows.Count == 0)
            {
                throw new SAPException("无法找到IDOC明细!!");
            }

            DataRow header = dtHeader.Rows[0];
            Idoc idoc = null;
            try
            {
                idoc = new Idoc
               {
                   // TABNAM = header["TABNAM"].ToString().Trim(),
                   MANDT = header["MANDT"].ToString().Trim(),
                   DOCNUM = header["DOCNUM"].ToString().Trim(),
                   DOCREL = header["DOCREL"].ToString().Trim(),
                   STATUS = header["STATUS"].ToString().Trim(),
                   DIRECT = header["DIRECT"].ToString().Trim(),
                   OUTMOD = header["OUTMOD"].ToString().Trim(),
                   EXPRSS = header["EXPRSS"].ToString().Trim(),
                   //特别注意不要使用“DOCTYP”
                   IDOCTYP = header["IDOCTP"].ToString().Trim(),
                   CIMTYP = header["CIMTYP"].ToString().Trim(),
                   MESTYP = header["MESTYP"].ToString().Trim(),
                   MESCOD = header["MESCOD"].ToString().Trim(),
                   MESFCT = header["MESFCT"].ToString().Trim(),
                   STD = header["STD"].ToString().Trim(),
                   STDVRS = header["STDVRS"].ToString().Trim(),
                   STDMES = header["STDMES"].ToString().Trim(),
                   SNDPOR = header["SNDPOR"].ToString().Trim(),
                   SNDPRT = header["SNDPRT"].ToString().Trim(),
                   SNDPFC = header["SNDPFC"].ToString().Trim(),
                   SNDPRN = header["SNDPRN"].ToString().Trim(),
                   SNDSAD = header["SNDSAD"].ToString().Trim(),
                   SNDLAD = header["SNDLAD"].ToString().Trim(),
                   RCVPOR = header["RCVPOR"].ToString().Trim(),
                   RCVPRT = header["RCVPRT"].ToString().Trim(),
                   RCVPFC = header["RCVPFC"].ToString().Trim(),
                   RCVPRN = header["RCVPRN"].ToString().Trim(),
                   RCVSAD = header["RCVSAD"].ToString().Trim(),
                   RCVLAD = header["RCVLAD"].ToString().Trim(),
                   CREDAT = header["CREDAT"].ToString().Trim(),
                   CRETIM = header["CRETIM"].ToString().Trim(),
                   REFINT = header["REFINT"].ToString().Trim(),
                   REFGRP = header["REFGRP"].ToString().Trim(),
                   REFMES = header["REFMES"].ToString().Trim(),
                   ARCKEY = header["ARCKEY"].ToString().Trim(),
                   SERIAL = header["SERIAL"].ToString().Trim()
               };

                Hashtable hashtable = new Hashtable();
                for (int i = 0; i < dtItem.Rows.Count; i++)
                {
                    DataRow item = dtItem.Rows[i];
                    if (item["DOCNUM"].ToString().Trim().Equals(header["DOCNUM"].ToString().Trim()))
                    {
                        IdocSegment newSegment = new IdocSegment();
                        if (item["PSGNUM"].ToString() == "000000")
                        {
                            idoc.Segments.Add(newSegment);
                        }
                        else
                        {
                            IdocSegment segment2 = (IdocSegment)hashtable[item["PSGNUM"].ToString()];
                            if (segment2 != null)
                            {
                                segment2.ChildSegments.Add(newSegment);
                            }
                            else
                            {
                                idoc.Segments.Add(newSegment);
                            }
                        }
                        newSegment.SegmentName = item["SEGNAM"].ToString();
                        newSegment.SegmentNumber = item["SEGNUM"].ToString();
                        string content = item["SDATA"].ToString();
                        newSegment.WriteDataBuffer(content, 0, 0x3e8);
                        if (!hashtable.ContainsKey(item["SEGNUM"].ToString()))
                        {
                            hashtable.Add(item["SEGNUM"].ToString(), newSegment);
                        }
                    }
                }

            }
            catch (Exception)
            {

                throw;
            }

            return idoc;
        }
コード例 #11
0
        /// <summary>
        /// 内部处理,根据IDOC类型与扩展类型,创建空的IDOC。
        /// </summary>
        /// <param name="IdocType">IDOC类型</param>
        /// <param name="Enhancement">IDOC扩展类型</param>
        /// <param name="CreateEmpty">如果是TRUE,将不会复制标准的IDOC段</param>
        /// <returns></returns>
        private Idoc InternalCreateIdoc(string IdocType, string Enhancement, bool CreateEmpty)
        {
            des      = SAPDestination.GetDesByName(m_sysName);
            IdocType = IdocType.ToUpper();
            IRfcFunction function = des.Repository.CreateFunction("IDOCTYPE_READ_COMPLETE");

            function["PI_IDOCTYP"].SetValue(IdocType);
            function["PI_CIMTYP"].SetValue(Enhancement);
            try
            {
                if (this.Logging)
                {
                    //   function.SaveToXML("IDOCTYPE_READ_COMPLETE_01_" + DateTime.Now.Ticks.ToString() + ".xml");
                    //   function.
                }
                function.Invoke(des);
                if (this.Logging)
                {
                    //   function.SaveToXML("IDOCTYPE_READ_COMPLETE_02_" + DateTime.Now.Ticks.ToString() + ".xml");
                }
            }
            catch (RfcAbapException exception)
            {
                if (!exception.Message.Trim().Equals("SEGMENT_UNKNOWN"))
                {
                    throw new Exception("Get IDoc failed: " + exception.ToString());
                }
                function["PI_RELEASE"].SetValue("    ");
                function.Invoke(des);
            }
            IRfcStructure structure = function.GetStructure("PE_HEADER");
            Idoc          idoc      = new Idoc(IdocType, Enhancement)
            {
                Connection  = this,
                MANDT       = this.des.Client,
                Description = structure["DESCRP"].ToString()
            };
            //IDOC类型的段定义
            IRfcTable table     = function.GetTable("PT_SEGMENTS");
            Hashtable hashtable = new Hashtable();

            for (int i = 0; i < table.RowCount; i++)
            {
                //一般来说,第一行都是主要的段定义。表示一个抬头定义。
                if (table[i]["PARPNO"].GetValue().ToString() == "0000")
                {
                    IdocSegment newSegment = new IdocSegment();
                    if (!CreateEmpty)
                    {
                        idoc.Segments.Add(newSegment);
                    }
                    newSegment.SegmentName = table[i]["SEGMENTTYP"].GetValue().ToString();
                    newSegment.SegmentType = table[i]["SEGMENTDEF"].GetValue().ToString();
                    newSegment.Description = table[i]["DESCRP"].GetValue().ToString();
                    int num2 = Convert.ToInt32(table[i]["GRP_OCCMAX"].GetValue().ToString().Substring(5, 5));
                    newSegment.MaxOccur = (num2 == 0) ? Convert.ToInt32(table[i]["OCCMAX"].GetValue().ToString().Substring(5, 5)) : num2;
                    if (newSegment.MaxOccur == 0)
                    {
                        newSegment.MaxOccur = 1;
                    }
                    string key = table[i]["NR"].GetValue().ToString();
                    hashtable.Add(key, newSegment);
                }
                else
                {
                    string      str2     = table[i]["PARPNO"].GetValue().ToString();
                    string      str3     = table[i]["NR"].GetValue().ToString();
                    IdocSegment segment2 = (IdocSegment)hashtable[str2];
                    if (segment2 == null)
                    {
                        throw new Exception("The idoc structure is not valid");
                    }
                    IdocSegment segment3 = new IdocSegment();
                    if (!CreateEmpty)
                    {
                        segment2.ChildSegments.Add(segment3);
                    }
                    segment3.SegmentName = table[i]["SEGMENTTYP"].GetValue().ToString();
                    segment3.SegmentType = table[i]["SEGMENTDEF"].GetValue().ToString();
                    segment3.Description = table[i]["DESCRP"].GetValue().ToString();
                    int num3 = Convert.ToInt32(table[i]["GRP_OCCMAX"].GetValue().ToString().Substring(5, 5));
                    segment3.MaxOccur = (num3 == 0) ? Convert.ToInt32(table[i]["OCCMAX"].GetValue().ToString().Substring(5, 5)) : num3;
                    if (segment3.MaxOccur == 0)
                    {
                        segment3.MaxOccur = 1;
                    }
                    hashtable.Add(str3, segment3);
                }
            }
            //查找段节点的结构定义。
            IRfcTable             table2     = function.GetTable("PT_FIELDS");
            IDictionaryEnumerator enumerator = hashtable.GetEnumerator();

            while (enumerator.MoveNext())
            {
                IdocSegment segment4 = (IdocSegment)enumerator.Value;
                for (int j = 0; j < table2.RowCount; j++)
                {
                    if (table2[j]["SEGMENTTYP"].GetValue().ToString().Trim() == segment4.SegmentName.Trim())
                    {
                        segment4.Fields.Add(table2[j]["FIELDNAME"].GetValue().ToString(), table2[j]["DESCRP"].GetValue().ToString(), Convert.ToInt32(table2[j]["EXTLEN"].GetValue().ToString()), Convert.ToInt32(table2[j]["BYTE_FIRST"].GetValue().ToString()) - 0x40, table2[j]["DATATYPE"].GetValue().ToString(), "");
                    }
                }
                idoc.StoreSegmentForFurtherUse(segment4.Clone());
            }
            return(idoc);
        }
コード例 #12
0
        private static void processSingleIdoc(IRfcStructure tControl, IRfcTable datarows)
        {
            Idoc idoc = new Idoc
            {
                TABNAM  = tControl["TABNAM"].GetValue().ToString().Trim(),
                MANDT   = tControl["MANDT"].GetValue().ToString().Trim(),
                DOCNUM  = tControl["DOCNUM"].GetValue().ToString().Trim(),
                DOCREL  = tControl["DOCREL"].GetValue().ToString().Trim(),
                STATUS  = tControl["STATUS"].GetValue().ToString().Trim(),
                DIRECT  = tControl["DIRECT"].GetValue().ToString().Trim(),
                OUTMOD  = tControl["OUTMOD"].GetValue().ToString().Trim(),
                EXPRSS  = tControl["EXPRSS"].ToString().Trim(),
                IDOCTYP = tControl["IDOCTYP"].GetValue().ToString().Trim(),
                CIMTYP  = tControl["CIMTYP"].GetValue().ToString().Trim(),
                MESTYP  = tControl["MESTYP"].GetValue().ToString().Trim(),
                MESCOD  = tControl["MESCOD"].GetValue().ToString().Trim(),
                MESFCT  = tControl["MESFCT"].GetValue().ToString().Trim(),
                STD     = tControl["STD"].GetValue().ToString().Trim(),
                STDVRS  = tControl["STDVRS"].GetValue().ToString().Trim(),
                STDMES  = tControl["STDMES"].GetValue().ToString().Trim(),
                SNDPOR  = tControl["SNDPOR"].GetValue().ToString().Trim(),
                SNDPRT  = tControl["SNDPRT"].GetValue().ToString().Trim(),
                SNDPFC  = tControl["SNDPFC"].GetValue().ToString().Trim(),
                SNDPRN  = tControl["SNDPRN"].GetValue().ToString().Trim(),
                SNDSAD  = tControl["SNDSAD"].GetValue().ToString().Trim(),
                SNDLAD  = tControl["SNDLAD"].GetValue().ToString().Trim(),
                RCVPOR  = tControl["RCVPOR"].GetValue().ToString().Trim(),
                RCVPRT  = tControl["RCVPRT"].GetValue().ToString().Trim(),
                RCVPFC  = tControl["RCVPFC"].GetValue().ToString().Trim(),
                RCVPRN  = tControl["RCVPRN"].GetValue().ToString().Trim(),
                RCVSAD  = tControl["RCVSAD"].GetValue().ToString().Trim(),
                RCVLAD  = tControl["RCVLAD"].GetValue().ToString().Trim(),
                CREDAT  = tControl["CREDAT"].GetValue().ToString().Trim(),
                CRETIM  = tControl["CRETIM"].GetValue().ToString().Trim(),
                REFINT  = tControl["REFINT"].GetValue().ToString().Trim(),
                REFGRP  = tControl["REFGRP"].GetValue().ToString().Trim(),
                REFMES  = tControl["REFMES"].GetValue().ToString().Trim(),
                ARCKEY  = tControl["ARCKEY"].GetValue().ToString().Trim(),
                SERIAL  = tControl["SERIAL"].GetValue().ToString().Trim()
            };

            Hashtable hashtable = new Hashtable();

            for (int i = 0; i < datarows.RowCount; i++)
            {
                IRfcStructure structure = datarows[i];
                if (structure["DOCNUM"].GetValue().ToString().Trim().Equals(tControl["DOCNUM"].GetValue().ToString().Trim()))
                {
                    IdocSegment newSegment = new IdocSegment();
                    if (structure["PSGNUM"].GetValue().ToString() == "000000")
                    {
                        idoc.Segments.Add(newSegment);
                    }
                    else
                    {
                        IdocSegment segment2 = (IdocSegment)hashtable[structure["PSGNUM"].GetValue().ToString()];
                        if (segment2 != null)
                        {
                            segment2.ChildSegments.Add(newSegment);
                        }
                        else
                        {
                            idoc.Segments.Add(newSegment);
                        }
                    }
                    newSegment.SegmentName = structure["SEGNAM"].GetValue().ToString();
                    string content = structure["SDATA"].GetValue().ToString();
                    newSegment.WriteDataBuffer(content, 0, 0x3e8);
                    if (!hashtable.ContainsKey(structure["SEGNUM"].GetValue().ToString()))
                    {
                        hashtable.Add(structure["SEGNUM"].GetValue().ToString(), newSegment);
                    }
                }
            }

            // IdocMeta idocMeta = new IdocMeta(ConfigFileTool.SAPGlobalSettings.GetDefaultSapCient(), idoc);
            // idocMeta.getIdocTypeDefinition();
            // idocMeta.deCompileIdoc();

            idoc.SavePlainData(@"d:/test.txt");

            //idocsegment e1maram = idoc.segments["E2MARAM006", 0];

            //// loop through segments and find the right ones
            //for (int i = 0; i < e1maram.childsegments.count; i++)
            //    if (e1maram.childsegments[i].segmentname == "e2maktm001")
            //        console.writeline("materialtext found: " +
            //            e1maram.childsegments[i].readdatabuffer(4, 40));
        }