procedure TForm1.cmdTranslateClick(Sender: TObject); //This is just an example program to demonstrate how to translate an UN/EDIFACT INVOIC file //in Delphi using Framework EDI component var oEdiDoc : IediDocument; oSegment : IediDataSegment; oSchemas : IediSchemas; sPath : string; sPartyEntity : string; sSefFile : string; sEdiFile : string; sSegmentID : string; nArea : integer; sLoopSection : string; sValue : string; begin cmdTranslate.Enabled := False; sPath := Trim(GetCurrentDir) + '\';' sSefFile := sPath + 'INVOIC_S93A.SEF'; sEdiFile := sPath + 'INVOIC.TXT'; //instantiate edi document object oEdiDoc := CoediDocument.Create(); //change cursor type to ForwardOnly sa as to save RAM and improve performance oEdiDoc.CursorType := 1; //disable internal Standard Reference Library to save RAM and improve performance oSchemas := oEdiDoc.GetSchemas as IediSchemas; oSchemas.EnableStandardReference := false; //set terminators oEdiDoc.SegmentTerminator := ''''; oEdiDoc.ElementTerminator := '+'; oEdiDoc.CompositeTerminator := ':'; oEdiDoc.ReleaseIndicator := '?'; //load SEF file oEdidoc.LoadSchema(sSefFile,0); //load EDI file oEdiDoc.LoadEdi(sEdiFile); //traverse through entire EDI file from top segment to bottom segment a segment at a time oSegment := oEdiDoc.FirstDataSegment as IediDataSegment; //get first data segment while oSegment <> Nil do begin //identify segments by their area, loop section they are in, and their ID. nArea := oSegment.Area; sLoopSection := oSegment.LoopSection; sSegmentID := oSegment.ID; if nArea = 0 then begin if sSegmentID = 'UNB' then begin sValue := oSegment.DataElementValue[1,1]; // Syntax identifier sValue := oSegment.DataElementValue[1,2]; // Syntax version number sValue := oSegment.DataElementValue[1,3]; // Service code list directory version number sValue := oSegment.DataElementValue[1,4]; // Character encoding, coded sValue := oSegment.DataElementValue[2,1]; // Interchange sender identification sValue := oSegment.DataElementValue[2,2]; // Partner identification code qualifier sValue := oSegment.DataElementValue[2,3]; // Interchange sender internal identification sValue := oSegment.DataElementValue[2,4]; // Interchange sender internal sub-identification sValue := oSegment.DataElementValue[3,1]; // Recipient identification sValue := oSegment.DataElementValue[3,2]; // Partner identification code qualifier sValue := oSegment.DataElementValue[3,3]; // Routing address sValue := oSegment.DataElementValue[3,4]; // Interchange Recipient Internal Sub-Identification sValue := oSegment.DataElementValue[4,1]; // Date sValue := oSegment.DataElementValue[4,2]; // Time ListBox1.Items.Add(oSegment.DataElement[5].Description + ' = ' + oSegment.DataElementValue[5,0]); //ISA INTERCHANGE CONTROL NO. sValue := oSegment.DataElementValue[6,1]; // Recipient reference/password sValue := oSegment.DataElementValue[6,2]; // Recipient's reference/password qualifier sValue := oSegment.DataElementValue[7,0]; // Application reference sValue := oSegment.DataElementValue[8,0]; // Processing priority code sValue := oSegment.DataElementValue[9,0]; // Acknowledgement request sValue := oSegment.DataElementValue[10,0]; // Interchange Agreement Identifier sValue := oSegment.DataElementValue[11,0]; // Test indicator end; end else if nArea = 1 then begin if sLoopSection = '' then begin if sSegmentID = 'UNH' then begin ListBox1.Items.Add(oSegment.DataElement[1].Description + ' = ' + oSegment.DataElementValue[1,0]); // Message reference number sValue := oSegment.DataElementValue[2,1]; // Message type identifier sValue := oSegment.DataElementValue[2,2]; // Message version number sValue := oSegment.DataElementValue[2,3]; // Message release number sValue := oSegment.DataElementValue[2,4]; // Controlling agency sValue := oSegment.DataElementValue[2,5]; // Association assigned code end else if sSegmentID = 'BGM' then begin sValue := oSegment.DataElementValue[1,1]; // Document/message name, coded sValue := oSegment.DataElementValue[1,2]; // Code list qualifier sValue := oSegment.DataElementValue[1,3]; // Code list responsible agency, coded sValue := oSegment.DataElementValue[1,4]; // Document/message name ListBox1.Items.Add(oSegment.DataElement[2].Description + ' = ' + oSegment.DataElementValue[2,0]); //INVOICE NO. sValue := oSegment.DataElementValue[3,0]; // Message function, coded end else if sSegmentID = 'DTM' then begin sValue := oSegment.DataElementValue[1,1]; // Date/time/period qualifier ListBox1.Items.Add(oSegment.DataElement[1].Description + ' = ' + oSegment.DataElementValue[1,2]); //INVOICE DATE. sValue := oSegment.DataElementValue[1,3]; // Date/time/period format qualifier end; end //sLoopSection = '' else if sLoopSection = 'RFF' then begin if sSegmentID = 'RFF' then begin sValue := oSegment.DataElementValue[1,1]; // Reference qualifier ListBox1.Items.Add(oSegment.DataElement[1].Description + ' = ' + oSegment.DataElementValue[1,2]); //ORDER NO sValue := oSegment.DataElementValue[1,3]; // Line number end; end else if sLoopSection = 'NAD' then begin //if loops has multiple instances, then first identify them by checking their qualifier if sSegmentID = 'NAD' then begin sPartyEntity := oSegment.DataElementValue[1,0]; //Get qualifier value. We will be checking for RE,ST OR BY end; if sPartyEntity = 'RE' then begin //Remit-to address if sSegmentID = 'NAD' then begin sValue := oSegment.DataElementValue[1,0]; // Party qualifier sValue := oSegment.DataElementValue[2,1]; // Party identification sValue := oSegment.DataElementValue[2,2]; // Code list qualifier sValue := oSegment.DataElementValue[2,3]; // Code list responsible agency, coded sValue := oSegment.DataElementValue[3,1]; // Name and address line sValue := oSegment.DataElementValue[3,2]; // Name and address line sValue := oSegment.DataElementValue[3,3]; // Name and address line sValue := oSegment.DataElementValue[3,4]; // Name and address line sValue := oSegment.DataElementValue[3,5]; // Name and address line ListBox1.Items.Add(oSegment.DataElement[4].Description + ' = ' + oSegment.DataElementValue[4,1]); //MANUFACTURER NAME sValue := oSegment.DataElementValue[4,2]; // Party name sValue := oSegment.DataElementValue[4,3]; // Party name end; end else if sPartyEntity = 'ST' then begin //Ship-To address if sSegmentID = 'NAD' then begin sValue := oSegment.DataElementValue[1,0]; // Party qualifier sValue := oSegment.DataElementValue[2,1]; // Party identification sValue := oSegment.DataElementValue[2,2]; // Code list qualifier sValue := oSegment.DataElementValue[2,3]; // Code list responsible agency, coded sValue := oSegment.DataElementValue[3,1]; // Name and address line sValue := oSegment.DataElementValue[3,2]; // Name and address line sValue := oSegment.DataElementValue[3,3]; // Name and address line sValue := oSegment.DataElementValue[3,4]; // Name and address line sValue := oSegment.DataElementValue[3,5]; // Name and address line ListBox1.Items.Add(oSegment.DataElement[4].Description + ' = ' + oSegment.DataElementValue[4,1]); //SHIPTO NAME end; end else if sPartyEntity = 'BY' then begin //Buyer address if sSegmentID = 'NAD' then begin sValue := oSegment.DataElementValue[1,0]; // Party qualifier sValue := oSegment.DataElementValue[2,1]; // Party identification sValue := oSegment.DataElementValue[2,2]; // Code list qualifier sValue := oSegment.DataElementValue[2,3]; // Code list responsible agency, coded sValue := oSegment.DataElementValue[3,1]; // Name and address line sValue := oSegment.DataElementValue[3,2]; // Name and address line sValue := oSegment.DataElementValue[3,3]; // Name and address line sValue := oSegment.DataElementValue[3,4]; // Name and address line sValue := oSegment.DataElementValue[3,5]; // Name and address line ListBox1.Items.Add(oSegment.DataElement[4].Description + ' = ' + oSegment.DataElementValue[4,1]); //BUYER NAME end; end; end else if sLoopSection = 'NAD;RFF' then begin if sPartyEntity = 'RE' then begin //Remit-to reference if sSegmentID = 'RFF' then begin sValue := oSegment.DataElementValue[1,1]; // Reference qualifier ListBox1.Items.Add(oSegment.DataElement[1].Description + ' = ' + oSegment.DataElementValue[1,2]); //MANUFACTURER REFERENCE sValue := oSegment.DataElementValue[1,3]; // Line number end; end else if sPartyEntity = 'ST' then begin //Ship-to reference if sSegmentID = 'RFF' then begin sValue := oSegment.DataElementValue[1,1]; // Reference qualifier sValue := oSegment.DataElementValue[1,2]; // Reference number sValue := oSegment.DataElementValue[1,3]; // Line number end; //sSegmentID end else if sPartyEntity = 'BY' then begin //Buyer reference if sSegmentID = 'RFF' then begin sValue := oSegment.DataElementValue[1,1]; // Reference qualifier sValue := oSegment.DataElementValue[1,2]; // Reference number sValue := oSegment.DataElementValue[1,3]; // Line number end; //sSegmentID end; end else if sLoopSection = 'NAD;CTA' then begin if sPartyEntity = 'RE' then begin //Remit-to contact if sSegmentID = 'CTA' then begin sValue := oSegment.DataElementValue[1,0]; // Contact function, coded sValue := oSegment.DataElementValue[2,1]; // Department or employee identification ListBox1.Items.Add(oSegment.DataElement[2].Description + ' = ' + oSegment.DataElementValue[2,2]); // Department or employee end else if sSegmentID = 'COM' then begin sValue := oSegment.DataElementValue[1,1]; // Communication number sValue := oSegment.DataElementValue[1,2]; // Communication channel qualifier end; end else if sPartyEntity = 'ST' then begin //Ship-to contact if sSegmentID = 'CTA' then begin sValue := oSegment.DataElementValue[1,0]; // Contact function, coded sValue := oSegment.DataElementValue[2,1]; // Department or employee identification sValue := oSegment.DataElementValue[2,2]; // Department or employee end else if sSegmentID = 'COM' then begin sValue := oSegment.DataElementValue[1,1]; // Communication number sValue := oSegment.DataElementValue[1,2]; // Communication channel qualifier end; //sSegmentID end else if sPartyEntity = 'BY' then begin //Buyer contact if sSegmentID = 'CTA' then begin sValue := oSegment.DataElementValue[1,0]; // Contact function, coded sValue := oSegment.DataElementValue[2,1]; // Department or employee identification sValue := oSegment.DataElementValue[2,2]; // Department or employee end else if sSegmentID = 'COM' then begin sValue := oSegment.DataElementValue[1,1]; // Communication number sValue := oSegment.DataElementValue[1,2]; // Communication channel qualifier end; //sSegmentID end; end; //sLoopSection end //nArea = 1 else if nArea = 2 then begin if sLoopSection = 'LIN' then begin if sSegmentID = 'LIN' then begin ListBox1.Items.Add(oSegment.DataElement[1].Description + ' = ' + oSegment.DataElementValue[1,0]); //LINE NUMBER sValue := oSegment.DataElementValue[2,0]; // Action request/notification, coded ListBox1.Items.Add(oSegment.DataElement[3].Description + ' = ' + oSegment.DataElementValue[3,1]); //BUYER PART NO sValue := oSegment.DataElementValue[3,2]; // Item number type, coded sValue := oSegment.DataElementValue[3,3]; // Code list qualifier sValue := oSegment.DataElementValue[3,4]; // Code list responsible agency, coded end else if sSegmentID = 'QTY' then begin sValue := oSegment.DataElementValue[1,1]; // Quantity qualifier ListBox1.Items.Add(oSegment.DataElement[1].Description + ' = ' + oSegment.DataElementValue[1,2]); //QUANTITY ListBox1.Items.Add(oSegment.DataElement[1].Description + ' = ' + oSegment.DataElementValue[1,3]); //MEASURE end; end else if sLoopSection = 'LIN;PRI' then begin if sSegmentID = 'PRI' then begin sValue := oSegment.DataElementValue[1,1]; // Price qualifier ListBox1.Items.Add(oSegment.DataElement[1].Description + ' = ' + oSegment.DataElementValue[1,2]); //ITEM PRICE end; end; //sLoopSection = 'LIN' end else if nArea = 3 then begin if sLoopSection = '' then begin if sSegmentID = 'UNS' then begin sValue := oSegment.DataElementValue[1,0]; // Section identification end; //sSegmentID end else if sLoopSection = 'MOA' then begin if sSegmentID = 'MOA' then begin sValue := oSegment.DataElementValue[1,1]; // Monetary amount type qualifier ListBox1.Items.Add(oSegment.DataElement[1].Description + ' = ' + oSegment.DataElementValue[1,2]); //TOTAL AMOUNT sValue := oSegment.DataElementValue[1,3]; // Currency, coded sValue := oSegment.DataElementValue[1,4]; // Currency qualifier sValue := oSegment.DataElementValue[1,5]; // Status, coded end; end else if sLoopSection = 'TAX' then begin if sSegmentID = 'TAX' then begin sValue := oSegment.DataElementValue[1,0]; // Duty/tax/fee function qualifier sValue := oSegment.DataElementValue[2,1]; // Duty/tax/fee type, coded sValue := oSegment.DataElementValue[2,2]; // Code list qualifier sValue := oSegment.DataElementValue[2,3]; // Code list responsible agency, coded sValue := oSegment.DataElementValue[2,4]; // Duty/tax/fee type sValue := oSegment.DataElementValue[3,1]; // Duty/tax/fee account identification sValue := oSegment.DataElementValue[3,2]; // Code list qualifier sValue := oSegment.DataElementValue[3,3]; // Code list responsible agency, coded sValue := oSegment.DataElementValue[4,0]; // Duty/tax/fee assessment basis sValue := oSegment.DataElementValue[5,1]; // Duty/tax/fee rate identification sValue := oSegment.DataElementValue[5,2]; // Code list qualifier sValue := oSegment.DataElementValue[5,3]; // Code list responsible agency, coded sValue := oSegment.DataElementValue[5,4]; // Duty/tax/fee rate sValue := oSegment.DataElementValue[5,5]; // Duty/tax/fee rate basis identification sValue := oSegment.DataElementValue[5,6]; // Code list qualifier sValue := oSegment.DataElementValue[5,7]; // Code list responsible agency, coded sValue := oSegment.DataElementValue[6,0]; // Duty/tax/fee category, coded end else if sSegmentID = 'MOA' then begin sValue := oSegment.DataElementValue[1,1]; // Monetary amount type qualifier ListBox1.Items.Add(oSegment.DataElement[1].Description + ' = ' + oSegment.DataElementValue[1,2]); //TAX AMOUNT sValue := oSegment.DataElementValue[1,3]; // Currency, coded sValue := oSegment.DataElementValue[1,4]; // Currency qualifier sValue := oSegment.DataElementValue[1,5]; // Status, coded end; end; end; //nArea //get next data segment oSegment := oSegment.Next as IediDataSegment; end; ShowMessage('Translate done'); cmdTranslate.Enabled := true; end;