Unit Unit1;

    interface

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

    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        ListBox1: TListBox;
        txtInvoiceNo: TEdit;
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.Button1Click(Sender: TObject);
    var
       oEdiDoc: Iedidocument;
       oSchemas: IediSchemas;
       oInterchange: IediInterchange;
       oGroup: IediGroup;
       oTransactionset: IediTransactionset;
       oSegment: IediDataSegment;
       oWarning: IediWarning;
       oWarnings: IediWarnings;

       sPath: string;
       sEdiFile: string;
       sSefFile: string;
       i: integer;
       nWarningCount: integer;


    begin
       // This is just an example program to demonstrate how to generate and then
       // validate an 810 EDI file in Delphi using the Framework EDI component.
   
       button1.Enabled := false;
       sPath := Trim(GetCurrentDir) + '\';
       sEdiFile := '810Output.x12';
       sSefFile := '810_X12-4010.sef';

       //CREATE EDI DOCUMENT OBJECT
       oEdidoc := coedidocument.Create ;

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

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

       //LOAD SEF FILE
       oEdidoc.LoadSchema(sPath + sSefFile,0);

       //SET TERMINATORS
       oEdidoc.SegmentTerminator := chr(13) + chr(10);
       oEdidoc.ElementTerminator := '*';
       oedidoc.CompositeTerminator := '>';


       //CREATE ISA SEGMENT
       oInterchange := oEdidoc.CreateInterchange('X','004010') as IediInterchange;
       oSegment := oInterchange.GetDataSegmentHeader as IediDataSegment;
       oSegment.DataElementValue[1,0] := '00';
       oSegment.DataElementValue[2,0] := ' ';
       oSegment.DataElementValue[3,0] := '00';
       oSegment.DataElementValue[4,0] := ' ';
       oSegment.DataElementValue[5,0] := 'ZZ';
       oSegment.DataElementValue[6,0] := 'SENDERID';
       oSegment.DataElementValue[7,0] := 'ZZ';
       oSegment.DataElementValue[8,0] := 'RECEIVERID';
       oSegment.DataElementValue[9,0] := '960702';
       oSegment.DataElementValue[10,0] := '1230';
       oSegment.DataElementValue[11,0] := 'U';
       oSegment.DataElementValue[12,0] := '00401';
       oSegment.DataElementValue[13,0] := '000000020';
       oSegment.DataElementValue[14,0] := '0';
       oSegment.DataElementValue[15,0] := 'T';
       oSegment.DataElementValue[16,0] := '>';

       //CREATE GS SEGMENT
       oGroup := oInterchange.CreateGroup('004010') as IediGroup;
       oSegment := oGroup.GetDataSegmentHeader as IediDataSegment;
       oSegment.DataElementValue[1,0] := 'IN';
       oSegment.DataElementValue[2,0] := 'SENDERDEPT';
       oSegment.DataElementValue[3,0] := 'RECEIVERDEPT';
       oSegment.DataElementValue[4,0] := '19961230';
       oSegment.DataElementValue[5,0] := '1548';
       oSegment.DataElementValue[6,0] := '1';
       oSegment.DataElementValue[7,0] := 'X';
       oSegment.DataElementValue[8,0] := '004010';

       //CREATE ST SEGMENT
       oTransactionset := oGroup.CreateTransactionset('810') as IediTransactionset;
       oSegment := oTransactionset.GetDataSegmentHeader as IediDataSegment;
       oSegment.DataElementValue[2,0] := '12345';

       //BIG
       oSegment := oTransactionset.CreateDataSegment('BIG') as IediDataSegment;
       oSegment.DataElementValue[1,0] := '20020305';  //this is a mandatory data element - omitting it will cause an error
       oSegment.DataElementValue[2,0] := txtInvoiceNo.Text;
       oSegment.DataElementValue[4,0] := '7890';

       //Ship To
       //N1 SEGMENT IN LOOP N1
        oSegment := oTransactionset.CreateDataSegment('N1\N1') as IediDataSegment;
        oSegment.DataElementValue[1,0] := 'ST';
        oSegment.DataElementValue[2,0] := 'BUYSNACKS PORT';
        oSegment.DataElementValue[3,0] := '9';
        oSegment.DataElementValue[4,0] := '1223334445';

        //N3 SEGMENT IN LOOP N1
        oSegment := oTransactionset.CreateDataSegment('N1\N3') as IediDataSegment;
        oSegment.DataElementValue[1,0] := '1000 N. SAMPLE HIGHWAY';

        //N4 SEGMENT IN LOOP N1
        oSegment := oTransactionset.CreateDataSegment('N1\N4') as IediDataSegment;
        oSegment.DataElementValue[1,0] := 'ATHENS';
        oSegment.DataElementValue[2,0] := 'GA';
        oSegment.DataElementValue[3,0] := '30603';

        //Bill To
        //SECOND INSTANCE OF N1 SEGMENT IN LOOP N1
        oSegment := oTransactionset.CreateDataSegment('N1(2)\N1') as IediDataSegment;  //it is not necessary to include the loop instance count e.g. (2) in the syntax when cursor type is forwardwrite
        oSegment.DataElementValue[1,0] := 'BT';
        oSegment.DataElementValue[2,0] := 'BUYSNACKS';
        oSegment.DataElementValue[3,0] := '9';
        oSegment.DataElementValue[4,0] := '1223334444';

        //SECOND INSTANCE OF N3 SEGMENT IN LOOP N1
        oSegment := oTransactionset.CreateDataSegment('N1(2)\N3') as IediDataSegment;
        oSegment.DataElementValue[1,0] := 'P.O. BOX 0000';

        oSegment := oTransactionset.CreateDataSegment('N1(2)\N4') as IediDataSegment;
        oSegment.DataElementValue[1,0] := 'TEMPLE';
        oSegment.DataElementValue[2,0] := 'TX';
        oSegment.DataElementValue[3,0] := '76503';

        //Remit To
        //THIRD INSTANCE OF N1 SEGMENT IN LOOP N1
        oSegment := oTransactionset.CreateDataSegment('N1(3)\N1') as IediDataSegment;
        oSegment.DataElementValue[1,0] := 'RE';
        oSegment.DataElementValue[2,0] := 'FOODSELLER';
        oSegment.DataElementValue[3,0] := '9';
        oSegment.DataElementValue[4,0] := '12345QQQQ';

        //THIRD INSTANCE OF N3 IN LOOP N1
        oSegment := oTransactionset.CreateDataSegment('N1(3)\N3') as IediDataSegment;
        oSegment.DataElementValue[1,0] := 'P.O. BOX 222222';

        oSegment := oTransactionset.CreateDataSegment('N1(3)\N4') as IediDataSegment;
        oSegment.DataElementValue[1,0] := 'DALLAS';
        oSegment.DataElementValue[2,0] := 'TX';
        oSegment.DataElementValue[3,0] := '723224444';

        //ITD
        oSegment := oTransactionset.CreateDataSegment('ITD') as IediDataSegment;
        oSegment.DataElementValue[1,0] := '01';
        oSegment.DataElementValue[2,0] := '3';
        oSegment.DataElementValue[3,0] := '1.000';
        oSegment.DataElementValue[5,0] := '15';
        oSegment.DataElementValue[7,0] := '16';
        oSegment.DataElementValue[12,0] := '1/15 NET 30';

        //FOB
        oSegment := oTransactionset.CreateDataSegment('FOB') as IediDataSegment;
        oSegment.DataElementValue[1,0] := 'PP';

        //IT1
        for i := 1 to 6 do
        begin
            oSegment := oTransactionset.CreateDataSegment('IT1(' + trim(IntToStr(i)) + ')\IT1') as IediDataSegment;
            oSegment.DataElementValue[2,0] := '16';
            oSegment.DataElementValue[3,0] := 'CA';
            oSegment.DataElementValue[4,0] := '12.34';
            oSegment.DataElementValue[6,0] := 'UA';
            oSegment.DataElementValue[7,0] := '002840022222';

            oSegment := oTransactionset.CreateDataSegment('IT1(' + trim(IntToStr(i)) + ')\PID\PID') as IediDataSegment;
            oSegment.DataElementValue[1,0] := 'F';
            oSegment.DataElementValue[5,0] := 'CRUNCHY CHIPS LSS';
        end;

        //TOTAL AMOUNT
        oSegment := oTransactionset.CreateDataSegment('TDS') as IediDataSegment;
        oSegment.DataElementValue[1,0] := '25538';

        //ROUTING DESC
        oSegment := oTransactionset.CreateDataSegment('CAD') as IediDataSegment;
        oSegment.DataElementValue[5,0] := 'FREEFORM';

        //ISS SEGMENT IN LOOP ISS
        oSegment := oTransactionset.CreateDataSegment('ISS\ISS') as IediDataSegment;
        oSegment.DataElementValue[1,0] := '96';
        oSegment.DataElementValue[2,0] := 'CA';

        //ITEM COUNT
        oSegment := oTransactionset.CreateDataSegment('CTT') as IediDataSegment;
        oSegment.DataElementValue[1,0] := '6';

       //write the edi document object to a file
       oEdidoc.Save(sPath + sEdiFile,0);

       //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;
            ListBox1.Items.Add(oWarning.Description);
       end;

       ShowMessage('Done. Output = ' + sPath + sEdiFile);

    end;
    

    Click here to download a trial version of the Framework EDI