unit Unit1;

    interface

    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OleServer, FREDI_TLB,
      StdCtrls;

    type
      TForm1 = class(TForm)
        cmdTranslate: TButton;
        cmdClose: TButton;
        Label1: TLabel;
        txtInvoiceNo: TEdit;
        Label2: TLabel;
        ListErrors: TListBox;
        Label3: TLabel;
        procedure cmdTranslateClick(Sender: TObject);
        procedure cmdCloseClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.cmdTranslateClick(Sender: TObject);
    var
       oEdiDoc : IediDocument;
       oSegment : IediDataSegment;
       oDataElement : IediDataElement;
       oSchemas : IediSchemas;
       oWarning : IediWarning;
       oWarnings : IediWarnings;

       sPath : String;
       sQlfr : String;
       sSefFile : String;
       sEdiFile : String;
       sSegmentID : string;
       nArea : integer;
       sLoopSection : string;
       sValue : string;
       i : integer;
       nWarningCount : integer;


    begin
       cmdTranslate.Enabled := False;

       sPath := Trim(GetCurrentDir) + '\';
       sSefFile := '810_X12-4010.SEF';
       sEdiFile := '810_4010.X12';

       instantiate EDI document object
       oEdiDoc := CoediDocument.Create();

       //Change cursor type from dynamic (default) to ForwardOnly to improve performance
       oEdiDoc.CursorType := Cursor_ForwardOnly;

       //Disable standard reference library to improve performance
       oSchemas := oEdiDoc.GetSchemas as IediSchemas;
       oSchemas.EnableStandardReference := false;

       //Load Sef file
       oEdidoc.LoadSchema(sPath + sSefFile,0);

       //Load EDI file
       oEdiDoc.LoadEdi(sPath + sEdiFile);

       //traverse through the entire EDI file a segment at a time

       //get first data segment
       oSegment := oEdiDoc.FirstDataSegment as IediDataSegment;

       while oSegment <> Nil do begin

          //segments are identified by their area, loop section they are in and their ID.
          //(segment properties of EDI file can be viewed with our eFileManager utility)
      
          nArea := oSegment.Area;
          sLoopSection := oSegment.LoopSection;
          sSegmentID := oSegment.ID;

          if nArea = 0 then begin
            if sSegmentID = 'ISA' then begin
               sValue := oSegment.DataElementValue[13,0];  //ISA INTERCHANGE CONTROL NO.
            end
            else if sSegmentID = 'GS' then begin
               sValue := oSegment.DataElementValue[6,0];  //GS CONTROL NO.
            end;

          end
          else if nArea = 1 then begin
             if sLoopSection = '' then begin
                if sSegmentID = 'ST' then begin
                end
                else if sSegmentID = 'BIG' then begin
                   sValue := oSegment.DataElementValue[1,0];  //INVOICE DATE
                   txtInvoiceNo.Text  := oSegment.DataElementValue[2,0];  //INVOICE NO.

                   //Get description of datalement 1
                   oDataElement := oSegment.DataElement[1] as IediDataElement;
                   sValue := oDataElement.Description;
                end
                else if sSegmentID = 'ITD' then begin
                   sValue := oSegment.DataElementValue[12,0];  //TERMS DESCRIPTION
                end
                else if sSegmentID = 'FOB' then begin
                end;
             end  //sLoopSection = ''
             else if sLoopSection = 'N1' then begin
                if sSegmentID = 'N1' then begin
                   sQlfr := oSegment.DataElementValue[1,0];
                end;
                if sQlfr = 'ST' then begin  //SHIP TO
                   if sSegmentID = 'N1' then begin
                      sValue := oSegment.DataElementValue[2,0];  //NAME
                      sValue := oSegment.DataElementValue[4,0];  //ID NO.
                   end
                   else if sSegmentID = 'N3' then begin
                      sValue := oSegment.DataElementValue[1,0];  //ADDRESS
                   end
                   else if sSegmentID = 'N4' then begin
                      sValue := oSegment.DataElementValue[1,0];  //CITY
                      sValue := oSegment.DataElementValue[2,0];  //STATE
                      sValue := oSegment.DataElementValue[3,0];  //ZIP
                   end;
                end  //sQlfr = 'ST'
                else if sQlfr = 'BT' then begin  //BILL TO
                   if sSegmentID = 'N1' then begin
                      sValue := oSegment.DataElementValue[2,0];  //NAME
                      sValue := oSegment.DataElementValue[4,0];  //ID NO.
                   end
                   else if sSegmentID = 'N3' then begin
                      sValue := oSegment.DataElementValue[1,0];  //ADDRESS
                   end
                   else if sSegmentID = 'N4' then begin
                      sValue := oSegment.DataElementValue[1,0];  //CITY
                      sValue := oSegment.DataElementValue[2,0];  //STATE
                      sValue := oSegment.DataElementValue[3,0];  //ZIP
                   end;
                end  //sQlfr = 'BT'
                else if sQlfr = 'RE' then begin  //REMIT TO
                   if sSegmentID = 'N1' then begin
                      sValue := oSegment.DataElementValue[2,0];  //NAME
                      sValue := oSegment.DataElementValue[4,0];  //ID NO.
                   end
                   else if sSegmentID = 'N3' then begin
                      sValue := oSegment.DataElementValue[1,0];  //ADDRESS
                   end
                   else if sSegmentID = 'N4' then begin
                      sValue := oSegment.DataElementValue[1,0];  //CITY
                      sValue := oSegment.DataElementValue[2,0];  //STATE
                      sValue := oSegment.DataElementValue[3,0];  //ZIP
                   end;
                end;  //sQlfr = 'RE'
             end;  //sLoopSection = 'N1'
          end  //nArea = 1
          else if nArea = 2 then begin
             if sLoopSection = 'IT1' then begin
                if sSegmentID = 'IT1' then begin
                   sValue := oSegment.DataElementValue[2,0];  //QTY SHIPPED
                   sValue := oSegment.DataElementValue[3,0];  //UNIT
                   sValue := oSegment.DataElementValue[4,0];  //UNIT PRICE
                   sValue := oSegment.DataElementValue[7,0];  //PROUCT ID
                end;
             end  //sLoopSection = 'IT1'
             else if sLoopSection = 'IT1;PID' then begin
                if sSegmentID = 'PID' then begin
                   sValue := oSegment.DataElementValue[5,0];  //PRODUCT DESCRIPTION
                end;
             end;  //sLoopSection = 'IT1;PID'
          end
          else if nArea = 3 then begin
             if sLoopSection = '' then begin
                if sSegmentID = 'TDS' then begin
                   sValue := oSegment.DataElementValue[1,0];  //TOTAL AMOUNT
                end
                else if sSegmentID = 'CAD' then begin  //ROUTING
                end
                else if sSegmentID = 'CTT' then begin  //TOTAL ITEMS
                   sValue := oSegment.DataElementValue[1,0];
                end;
             end
             else if sLoopSection = 'ISS' then begin
                if sSegmentID = 'ISS' then begin
                   sValue := oSegment.DataElementValue[1,0];  //TOTAL SHIPPED
                end;
             end;
          end;  //nArea

          //get next data segment
          oSegment := oSegment.Next as IediDataSegment;
       end;

       //get errors
       oWarnings := oEdidoc.GetWarnings as IediWarnings;

       //show errors
       nWarningCount := oWarnings.Count;
       for i := 1 to nWarningCount do begin
            oWarning := oWarnings.Warning[i] as IediWarning;
            ListErrors.Items.Add(oWarning.Description);
       end;

       ShowMessage('Translate done');
       cmdTranslate.Enabled := true;

       //Close oEdiDoc and underlying objects
       oEdiDoc.Close;
    end;
    

    Click here to download a trial version of the Framework EDI