/// <summary> /// 根据IDOC内容,递归创建一个IDOC树。 /// </summary> /// <param name="idocSegment">IDOC 段节点</param> /// <param name="node2"></param> private void buildTreeNode(SAPINT.Idocs.IdocSegment idocSegment, TreeNode node2) { var segmentName = idocSegment.SegmentName + " " + idocSegment.SegmentNumber.PadLeft(3, '0'); TreeNode node3 = node2.Nodes.Add(segmentName); idocSegmentList.Add(segmentName, idocSegment); if (idocSegment.HasChildren) { foreach (SAPINT.Idocs.IdocSegment item in idocSegment.ChildSegments) { buildTreeNode(item, node3); } } }
public IdocSegment Clone() { IdocSegment segment = new IdocSegment { _DataBuffer = this._DataBuffer, _Description = this._Description, _SegmentName = this._SegmentName, _SegmentType = this._SegmentType, _MaxOccur = this._MaxOccur }; for (int i = 0; i < this._Fields.Count; i++) { IdocSegmentField newParameter = this._Fields[i].Clone(); segment.Fields.Add(newParameter); } return(segment); }
/// <summary> /// 根据IDOC内容,递归创建一个IDOC树。 /// </summary> /// <param name="idocSegment">IDOC 段节点</param> /// <param name="node2"></param> private void BuildTreeNode(SAPINT.Idocs.IdocSegment idocSegment, TreeNode node2) { var segmentName = string.Empty; if (idocSegment.SegmentNumber == null) { segmentName = idocSegment.SegmentName; } else { segmentName = idocSegment.SegmentName + " " + idocSegment.SegmentNumber.PadLeft(3, '0'); } TreeNode node3 = node2.Nodes.Add(segmentName); idocSegmentList.Add(segmentName, idocSegment); if (idocSegment.HasChildren) { foreach (SAPINT.Idocs.IdocSegment item in idocSegment.ChildSegments) { BuildTreeNode(item, node3); } } }
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)); }
public virtual void Add(IdocSegment NewSegment) { base.List.Add(NewSegment); }
public IdocSegment CreateSegment(string SegmentName) { SegmentName = SegmentName.Trim(); if (SegmentName.Length < 3) { // throw new ERPException(string.Format(Messages.Segment_0_notvalidforthisIdoc, SegmentName)); throw new Exception(string.Format("{0} not valid for this Idoc", SegmentName)); } IdocSegment segment = null; segment = (IdocSegment)this.StoredSegments[SegmentName]; if (segment == null) { string str = SegmentName.Substring(0, SegmentName.Length - 3); segment = (IdocSegment)this.StoredSegments[str]; if (segment == null) { if (SegmentName.Substring(1, 1) == "2") { str = SegmentName.Substring(0, 1) + "1" + SegmentName.Substring(2); } else { str = SegmentName.Substring(0, 1) + "2" + SegmentName.Substring(2); } segment = (IdocSegment)this.StoredSegments[str]; if (segment == null) { str = str.Substring(0, str.Length - 3); segment = (IdocSegment)this.StoredSegments[str]; if (segment == null) { segment = new IdocSegment(); } } } } segment.SegmentName = SegmentName; return segment.Clone(); }
private IdocSegment GetSegmentFromNode(XmlNode node) { IdocSegment segment; string segmentName = Converts.XmlNameToOriginalName(node.Name); try { segment = this.CreateSegment(segmentName); } catch { segment = new IdocSegment { SegmentName = segmentName }; } for (int i = 0; i < node.ChildNodes.Count; i++) { XmlNode node2 = node.ChildNodes[i]; if (node2.Name.Equals("BUFFER")) { segment.WriteDataBuffer(node2.InnerText, 0, 0x3e8); segment.Fields.Clear(); this.RegenerateSegment(segment); } else if ((node2.ChildNodes.Count > 0) && node2.ChildNodes[0].Name.Equals("BUFFER")) { segment.ChildSegments.Add(this.GetSegmentFromNode(node2)); } else { string str2 = Converts.XmlNameToOriginalName(node2.Name); if (this.IsSegmentValid(str2)) { segment.ChildSegments.Add(this.GetSegmentFromNode(node2)); } else { try { segment.Fields[str2].FieldValue = node2.InnerText; } catch { segment.WriteDataBuffer(node2.InnerText.PadRight(0x3e8), 0, 0x3e8); } } } } return segment; }
private void WriteSegment(ref StringBuilder st, IdocSegment seg) { int maxOccur = seg.MaxOccur; if (maxOccur <= 0) { maxOccur = 1; } st.Append(string.Concat(new object[] { "<xsd:element name=\"", Converts.OriginalNameToXmlName(seg.SegmentName), "\" msprop:SEGMENTMAXOCCUR=\"", maxOccur, "\" maxOccurs=\"", maxOccur, "\">" })); st.Append("<xsd:annotation>\n"); st.Append("<xsd:documentation>" + Converts.OriginalNameToXmlName(seg.Description.Replace("&", "")) + "</xsd:documentation>\n "); st.Append("</xsd:annotation>\n"); st.Append("<xsd:complexType>\n"); st.Append("<xsd:sequence>\n"); foreach (IdocSegmentField field in seg.Fields) { st.Append("<xsd:element name=\"" + Converts.OriginalNameToXmlName(field.FieldName) + "\" minOccurs=\"0\">\n"); st.Append("<xsd:annotation>\n"); st.Append("<xsd:documentation>" + Converts.OriginalNameToXmlName(field.Description.Replace("&", "")) + "</xsd:documentation> \n"); st.Append("</xsd:annotation>\n"); st.Append("<xsd:simpleType>\n"); st.Append("<xsd:restriction base=\"xsd:string\">\n"); st.Append("<xsd:maxLength value=\"" + field.ExternalLength + "\" /> \n"); st.Append("</xsd:restriction>\n"); st.Append("</xsd:simpleType>\n"); st.Append("</xsd:element>\n"); } foreach (IdocSegment segment in seg.ChildSegments) { this.WriteSegment(ref st, segment); } st.Append("</xsd:sequence>\n"); st.Append("<xsd:attribute name=\"SEGMENT\" use=\"required\">\n"); st.Append("<xsd:simpleType>\n"); st.Append("<xsd:restriction base=\"xsd:string\">\n"); st.Append("<xsd:enumeration value=\"1\"/>\n"); st.Append("</xsd:restriction>\n"); st.Append("</xsd:simpleType>\n"); st.Append("</xsd:attribute>\n"); st.Append("</xsd:complexType>\n"); st.Append("</xsd:element>\n"); }
private void RegenerateSegment(IdocSegment seg) { try { if (seg.Fields.Count == 0) { try { IdocSegment segment = this.CreateSegment(seg.SegmentName); string str = seg.ReadDataBuffer(0, 0x3e8); seg.Fields = segment.Fields; foreach (IdocSegmentField field in seg.Fields) { field.FieldValue = str.Substring(field.OffsetInBuffer, field.ExternalLength); } } catch { } } for (int i = 0; i < seg.ChildSegments.Count; i++) { this.RegenerateSegment(seg.ChildSegments[i]); } } catch { } }
private void WriteSegment(ref string ret, IdocSegment seg) { string str = ret; ret = str + seg.SegmentName + " " + seg.Description + "\r\n"; ret = ret + seg.ReadDataBuffer(0, 0x3e8) + "\r\n"; for (int i = 0; i < seg.ChildSegments.Count; i++) { this.WriteSegment(ref ret, seg.ChildSegments[i]); } }
private void LoadSegmentFromPlainString(string SegmentString, bool UseStoredSegments) { IdocSegment segment; string segmentName = SegmentString.Substring(0, 30).Trim(); SegmentString.Substring(30, 3).Trim(); SegmentString.Substring(0x21, 0x10).Trim(); string key = SegmentString.Substring(0x31, 6).Trim(); string str3 = SegmentString.Substring(0x37, 6).Trim(); SegmentString.Substring(0x3d, 2).Trim(); string str4 = Converts.Unescape(SegmentString.Substring(0x3f), plainTextUnescapes, '\\'); if (UseStoredSegments) { segment = this.CreateSegment(segmentName); } else { segment = new IdocSegment { SegmentName = segmentName }; } segment.WriteDataBuffer(str4.PadRight(0x3e8), 0, 0x3e8); segment.SegmentNumberForPlainLoad = key; if (str3.Equals("000000")) { this.Segments.Add(segment); } else if (this.PlainLoadSegmentHash[str3] == null) { this.Segments.Add(segment); } else { ((IdocSegment)this.PlainLoadSegmentHash[str3]).ChildSegments.Add(segment); } if (!key.Trim().Equals("")) { try { this.PlainLoadSegmentHash.Add(key, segment); } catch { } } foreach (IdocSegmentField field in segment.Fields) { field.FieldValue = str4.Substring(field.OffsetInBuffer, field.ExternalLength).Trim(); } }
private void LoadIdocSchema(DataSet ds) { for (int i = 0; i < ds.Tables.Count; i++) { DataTable table = ds.Tables[i]; int num2 = 1; if (((table.ExtendedProperties != null) && table.ExtendedProperties.ContainsKey("SEGMENTMAXOCCUR")) && ((table.ExtendedProperties["SEGMENTMAXOCCUR"] is string) && !string.IsNullOrEmpty((string)table.ExtendedProperties["SEGMENTMAXOCCUR"]))) { num2 = Convert.ToInt32(table.ExtendedProperties["SEGMENTMAXOCCUR"]); } string str = Converts.XmlNameToOriginalName(table.TableName); IdocSegment seg = new IdocSegment { SegmentName = str, MaxOccur = num2 }; int offset = 0; for (int j = 0; j < table.Columns.Count; j++) { if (table.Columns[j].MaxLength > 0) { seg.Fields.Add(Converts.XmlNameToOriginalName(table.Columns[j].ColumnName), table.Columns[j].Caption, table.Columns[j].MaxLength, offset, "CHAR", ""); offset += table.Columns[j].MaxLength; } } this.StoreSegmentForFurtherUse(seg); } this.RegenerateFields(); }
private XmlNode GetXMLNodeFromSegment(IdocSegment seg, XmlDocument doc) { XmlNode node = doc.CreateNode(XmlNodeType.Element, Converts.OriginalNameToXmlName(seg.SegmentName), ""); if (seg.Fields.Count > 0) { foreach (IdocSegmentField field in seg.Fields) { if (!field.FieldValue.ToString().Trim().Equals("")) { XmlNode newChild = doc.CreateNode(XmlNodeType.Element, Converts.OriginalNameToXmlName(field.FieldName), ""); newChild.InnerText = field.FieldValue.ToString().TrimEnd(new char[0]); node.AppendChild(newChild); } } } else { XmlNode node3 = doc.CreateNode(XmlNodeType.Element, "BUFFER", ""); node3.InnerText = seg.ReadDataBuffer(0, 0x3e8).TrimEnd(" ".ToCharArray()); node.AppendChild(node3); } foreach (IdocSegment segment in seg.ChildSegments) { node.AppendChild(this.GetXMLNodeFromSegment(segment, doc)); } return node; }
/// <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; }
private void WriteSegmentToFile(string ParentNr, StreamWriter writer, IdocSegment SegToWrite, int HLevel) { string str = ""; str = SegToWrite.SegmentName.PadRight(30) + this.MANDT.PadRight(3) + this.DOCNUM.PadRight(0x10); string input = SegToWrite.ReadDataBuffer(0, 0x3e8).TrimEnd(new char[] { " ".ToCharArray()[0] }); string parentNr = this.SegNumForPlainFile.ToString().PadLeft(6, "0".ToCharArray()[0]); string str4 = ParentNr.PadLeft(6, "0".ToCharArray()[0]); this.SegNumForPlainFile++; str = str + parentNr + str4; if ((HLevel == 1) && (SegToWrite.MaxOccur > 1)) { HLevel++; } if (this._SkipHLevel) { str = str + " "; } else { str = str + HLevel.ToString().PadLeft(2, "0".ToCharArray()[0]); } str = str + Converts.Escape(input, plainTextEscapes, '\\'); writer.WriteLine(str); if (SegToWrite.HasChildren) { for (int i = 0; i < SegToWrite.ChildSegments.Count; i++) { this.WriteSegmentToFile(parentNr, writer, SegToWrite.ChildSegments[i], HLevel + 1); } } }
private void WriteSegmentToTable(string ParentNr, IRfcTable tData, IdocSegment SegToWrite, int HLevel) { tData.Append(); IRfcStructure structure = tData.CurrentRow; //RFCStructure structure = tData.AddRow(); string parentNr = tData.RowCount.ToString(); string str2 = SegToWrite.ReadDataBuffer(0, 0x3e8); structure["SEGNAM"].SetValue(SegToWrite.SegmentName); structure["MANDT"].SetValue(this.MANDT); structure["DOCNUM"].SetValue(this.DOCNUM); structure["SEGNUM"].SetValue(parentNr.PadLeft(6, "0".ToCharArray()[0])); structure["PSGNUM"].SetValue(ParentNr.PadLeft(6, "0".ToCharArray()[0])); if ((HLevel == 1) && (SegToWrite.MaxOccur > 1)) { HLevel++; } if (this._SkipHLevel) { structure["HLEVEL"].SetValue(" "); } else { structure["HLEVEL"].SetValue(Convert.ToString(HLevel).PadLeft(2, "0".ToCharArray()[0])); } structure["SDATA"].SetValue(str2); if (SegToWrite.HasChildren) { for (int i = 0; i < SegToWrite.ChildSegments.Count; i++) { this.WriteSegmentToTable(parentNr, tData, SegToWrite.ChildSegments[i], HLevel + 1); } } }
public IdocSegment Clone() { IdocSegment segment = new IdocSegment { _DataBuffer = this._DataBuffer, _Description = this._Description, _SegmentName = this._SegmentName, _SegmentType = this._SegmentType, _MaxOccur = this._MaxOccur }; for (int i = 0; i < this._Fields.Count; i++) { IdocSegmentField newParameter = this._Fields[i].Clone(); segment.Fields.Add(newParameter); } return segment; }
internal void StoreSegmentForFurtherUse(IdocSegment seg) { if (!this.StoredSegments.Contains(seg.SegmentName)) { this.StoredSegments.Add(seg.SegmentName, seg); } }