procedure TForm1.cmdTranslateClick(Sender: TObject);
// This is just an example to show how to translate an EDI X12 837 4010 X096
// in Delphi with Framework EDI component

var
   oEdiDoc : IediDocument;
   oSchemas : IediSchemas;
   oSegment : IediDataSegment;

   sPath : string;
   sHlEntity : string;
   sNm1Entity : string;
   sQlfr : string;
   sSefFile : string;
   sEdiFile : string;
   sSegmentID : string;
   nArea : integer;
   sLoopSection : string;
   sValue : string;


begin
   cmdTranslate.Enabled := False;

   sPath := Trim(GetCurrentDir) + '\';'
   sSefFile := '837_X096.SEF';
   sEdiFile := '837_X096.X12';

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

   //Change cursor type to forwardonly to improve performance
   oEdiDoc.CursorType := 1;     //forwardOnly

   //disable internal standard reference library
   oSchemas := oEdiDoc.GetSchemas;
   oSchemas.EnableStandardReference := False;

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

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

   //traverse through all segements in the EDI file

   //get first data segment
   oSegment := oEdiDoc.FirstDataSegment as IediDataSegment;
   while oSegment <> Nil do begin 

        //identify segments by their area, the loop section they are in, and their segment id
      nArea := oSegment.Area;
      sLoopSection := oSegment.LoopSection;
      sSegmentID := oSegment.ID;

      if nArea = 0 then begin
        if sSegmentID = 'ISA' then begin
           //map data elements of ISA here
           sValue := oSegment.DataElementValue[13,0];  //Interchange Control Number
           ShowMessage('Interchange Control Number = ' + sValue);
        end
        else if sSegmentID = 'GS' then begin
           //map data elements of GS here
           sValue := oSegment.DataElementValue[6,0];   //Group Control Number
           ShowMessage('Group Control Number = ' + sValue);
        end;

      end
      else if nArea = 1 then begin
         if sLoopSection = '' then begin
            if sSegmentID = 'ST' then begin
                //map data elements of ST here
                sValue := oSegment.DataElementValue[2,0];   //Transaction Set Control Number
                ShowMessage('Transaction Set Control Number = ' + sValue);
            end
            else if sSegmentID = 'BHT' then begin
                //map data elements of BHT here
                sValue := oSegment.DataElementValue[3,0];   //reference id
                ShowMessage('reference id = ' + sValue);
                sValue := oSegment.DataElementValue[4,0];   //date
            end;
         end
         else if sLoopSection = 'NM1' then begin
            if sSegmentID = 'NM1' then begin    //get entity id of NM1 loop
               sNm1Entity := oSegment.DataElementValue[1,0];
            end;
            if sNm1Entity = '41' then begin  //SUBMITTER
               if sSegmentID = 'NM1' then begin
                  sValue := oSegment.DataElementValue[3,0];
                  ShowMessage('Submitter Name = ' + sValue);
                  sValue := oSegment.DataElementValue[9,0];
               end
               else if sSegmentID = 'PER' then begin
                  sValue := oSegment.DataElementValue[2,0];   //Contact Name
                  sValue := oSegment.DataElementValue[4,0];   //Telephone Number
               end;
            end
            else if sNm1Entity = '40' then begin  //RECEIVER
               if sSegmentID = 'NM1' then begin
                  sValue := oSegment.DataElementValue[3,0];
                  ShowMessage('Receiver Name = ' + sValue);
                  sValue := oSegment.DataElementValue[9,0];
               end;
            end;
         end;
      end
      else if nArea = 2 then begin
         if (sLoopSection = 'HL') and (sSegmentID = 'HL') then begin    //get entity id of HL loop
            sHlEntity := oSegment.DataElementValue[3,0];
         end;
         if sHlEntity = '20' then begin //BILLING POVIDER
            if sLoopSection = 'HL' then begin
            end
            else if sLoopSection = 'HL;NM1' then begin
               if sSegmentID = 'NM1' then begin
                  sNm1Entity := oSegment.DataElementValue[1,0];
               end;
               if sNm1Entity = '85' then begin  //BILLING PROVIDER NAME
                  if sSegmentID = 'NM1' then begin
                     sValue := oSegment.DataElementValue[3,0];
                     ShowMessage('Billing Provider Name = ' + sValue);
                     sValue := oSegment.DataElementValue[9,0];
                  end
                  else if sSegmentID = 'N3' then begin  //ADDRESS
                     sValue := oSegment.DataElementValue[1,0];
                  end
                  else if sSegmentID = 'N4' then begin  //CITY STATE ZIP
                     sValue := oSegment.DataElementValue[1,0];
                     sValue := oSegment.DataElementValue[2,0];
                     sValue := oSegment.DataElementValue[3,0];
                  end
                  else if sSegmentID = 'REF' then begin
                  end;  //sSegmentID
               end;  //sNm1Entity
            end;   //sLoopSection
         end
         else if sHlEntity = '22' then begin  //SUBSCRIBER
            if sLoopSection = 'HL' then begin
               if sSegmentID = 'SBR' then begin
               end;
            end
            else if sLoopSection = 'HL;NM1' then begin
               if sSegmentID = 'NM1' then begin
                  sNm1Entity := oSegment.DataElementValue[1,0];
               end;
               if sNm1Entity = 'IL' then begin  //SUBSCRIBER NAME
                  if sSegmentID = 'NM1' then begin
                     sValue := oSegment.DataElementValue[3,0];  //LASTNAME
                     sValue := oSegment.DataElementValue[4,0];  //FIRSTNAME
                     ShowMessage('Patient Firstname = ' + sValue);
                     sValue := oSegment.DataElementValue[5,0];  //MIDDLE INITIAL
                     sValue := oSegment.DataElementValue[9,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
                  else if sSegmentID = 'DMG' then begin
                     sValue := oSegment.DataElementValue[2,0];  //DOB
                     sValue := oSegment.DataElementValue[3,0];  //SEX
                  end;
               end
               else if sNm1Entity = 'PR' then begin  //PAYER
                  if sSegmentID = 'NM1' then begin
                     sValue := oSegment.DataElementValue[3,0];  //NAME
                     sValue := oSegment.DataElementValue[9,0];  //ID NO
                  end;
               end;  //sNm1Entity
            end
            else if sLoopSection = 'HL;CLM' then begin
               if sSegmentID = 'CLM' then begin
                  sValue := oSegment.DataElementValue[1,0];  //PATIENT ACCOUNT NO.
                  ShowMessage('Patient Account No. = ' + sValue);
                  sValue := oSegment.DataElementValue[2,0];  //TOTAL CHARGES
               end
               else if sSegmentID = 'DTP' then begin  //DATE OF STATEMENT
                  if oSegment.DataElementValue[1,0] = '434' then begin
                     sValue := oSegment.DataElementValue[3,0]
                  end;
               end
               else if sSegmentID = 'CL1' then begin
               end
               else if sSegmentID = 'HI' then begin
                  sQlfr := oSegment.DataElementValue[1,1];
                  if sQlfr = 'BK' then begin  //PRINCIPAL DIAGNOSIS
                  end
                  else if sQlfr = 'BF' then begin  //OTHER DIAGNOSIS
                  end
                  else if sQlfr = 'BQ' then begin  //OTHER PROCEDURE INFO
                  end
                  else if sQlfr = 'BH' then begin  //OCCURENCE INFO
                  end
                  else if sQlfr = 'BE' then begin  //VALUE INFO
                  end
                  else if sQlfr = 'BG' then begin  //CONDITION INFO
                  end;
               end;
            end
            else if sLoopSection = 'HL;CLM;SBR' then begin
               if sSegmentID = 'SBR' then begin  //SUBSCRIBER INFORMATION
               end
               else if sSegmentID = 'DMG' then begin  //DEMOGRAPHIC
                  sValue := oSegment.DataElementValue[2,0];  //DOB
                  sValue := oSegment.DataElementValue[3,0];  //SEX
               end;
            end
            else if sLoopSection = 'HL;CLM;SBR;NM1' then begin
               if sSegmentID = 'NM1' then begin
                  sNm1Entity := oSegment.DataElementValue[1,0];
               end;
               if sNm1Entity = 'IL' then begin
                  if sSegmentID = 'NM1' then begin
                     sValue := oSegment.DataElementValue[3,0];  //LASTNAME
                     sValue := oSegment.DataElementValue[4,0];  //FIRSTNAME
                     sValue := oSegment.DataElementValue[5,0];  //MIDDLENAME
                     sValue := oSegment.DataElementValue[9,0];  //ID NO.
                  end
                  else if sSegmentID = 'N3' then begin
                      sValue := oSegment.DataElementValue[1,0];  //ADDRESS
                  end
                  else if sSegmentID = 'N4' then begin  //CITY STATE ZIP
                  end;
               end
               else if sNm1Entity = 'PR' then begin  //PAYER NAME
               end;
            end
            else if sLoopSection = 'HL;CLM;LX' then begin
               if sSegmentID = 'LX' then begin  //SERVICE LINE NUMBER
               end
               else if sSegmentID = 'SV2' then begin  //INSTITUTIONAL SERVICE LINE
                  sValue := oSegment.DataElementValue[1,0];
                  sValue := oSegment.DataElementValue[2,2];
                  sValue := oSegment.DataElementValue[3,0];
                  sValue := oSegment.DataElementvalue[5,0];
               end
               else if sSegmentID = 'DTP' then begin  //SERVICE LINE DATE
               end;
            end;   //sLoopSection
         end;  //sHlEntity
      end
      else if nArea = 3 then begin
      end;  //nArea

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

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

end;