Private Sub btnGenerate_Click(sender As Object, e As EventArgs) Handles btnGenerate.Click

        Dim oEdiDoc As ediDocument
        Dim oSchema As ediSchema
        Dim oSchemas As ediSchemas
        Dim oInterchange As ediInterchange
        Dim oGroup As ediGroup
        Dim oTransactionSet As ediTransactionSet
        Dim oSegment As ediDataSegment

        Dim sSql As String
        Dim sEdiFileName As String
        Dim sSefFileName As String

        Dim sAppPath As String = AppDomain.CurrentDomain.BaseDirectory


        ' Create the top-level application object "ediDocument". 
        oEdiDoc = New ediDocument

        ' This makes certain that Framework EDI only uses the SEF file provided,
        ' and that it does not use its built-in Standard Reference table to generate
        ' the EDI document
        oSchemas = oEdiDoc.GetSchemas
        oSchemas.EnableStandardReference = False

        ' The FORWARD-WRITE cursor increases the performance of processing the EDI
        ' document (see Technical Note 3 below).
        oEdiDoc.CursorType = DocumentCursorTypeConstants.Cursor_ForwardWrite

        oEdiDoc.Property(DocumentPropertyIDConstants.Property_DocumentBufferIO) = 200

        ' Terminators have to be specified. 
        oEdiDoc.SegmentTerminator = "~{13:10}"
        oEdiDoc.ElementTerminator = "*"
        oEdiDoc.CompositeTerminator = "!"

        sEdiFileName = "810_004010_output.X12"
        sSefFileName = "810_004010.EVAL0.SEF"   'EVALUATION SEF FILE

        ' Specify SEF file to load. 
        oSchema = oEdiDoc.LoadSchema(sAppPath & sSefFileName, SchemaTypeIDConstants.Schema_Standard_Exchange_Format)

        oConnection = New SqlConnection(sConnection)
        oConnection.Open()

        sSql = "select * from [Interchange]"
        Dim oInterchangeAdapter As SqlDataAdapter = New SqlDataAdapter(sSql, oConnection)
        Dim oInterchangeDs As DataSet = New DataSet("dsInterchange")
        oInterchangeAdapter.Fill(oInterchangeDs, "dsInterchange")

        For Each oInterchangeRow As DataRow In oInterchangeDs.Tables("dsInterchange").Rows

            ' Creates the Interchange Control Header segment (ISA). 
            oInterchange = oEdiDoc.CreateInterchange("X", "004010")
            oSegment = oInterchange.GetDataSegmentHeader
            oSegment.DataElementValue(1) = oInterchangeRow("ISA01_AuthorizationInformationQualifier").ToString()         ' Authorization Information Qualifier (I01) 
            oSegment.DataElementValue(2) = oInterchangeRow("ISA02_AuthorizationInformation").ToString()         ' Authorization Information (I02) 
            oSegment.DataElementValue(3) = oInterchangeRow("ISA03_SecurityInformationQualifier").ToString()         ' Security Information Qualifier (I03) 
            oSegment.DataElementValue(4) = oInterchangeRow("ISA04_SecurityInformation").ToString()         ' Security Information (I04) 
            oSegment.DataElementValue(5) = oInterchangeRow("ISA05_InterchangeIdQualifier").ToString()         ' Interchange ID Qualifier (I05) 
            oSegment.DataElementValue(6) = oInterchangeRow("ISA06_InterchangeSenderId").ToString()         ' Interchange Sender ID (I06) 
            oSegment.DataElementValue(7) = oInterchangeRow("ISA07_InterchangeIdQualifier").ToString()         ' Interchange ID Qualifier (I05) 
            oSegment.DataElementValue(8) = oInterchangeRow("ISA08_InterchangeReceiverId").ToString()         ' Interchange Receiver ID (I07) 
            oSegment.DataElementValue(9) = oInterchangeRow("ISA09_InterchangeDate").ToString()         ' Interchange Date (I08) 
            oSegment.DataElementValue(10) = oInterchangeRow("ISA10_InterchangeTime").ToString()        ' Interchange Time (I09) 
            oSegment.DataElementValue(11) = oInterchangeRow("ISA11_InterchangeControlStandardsIdentifier").ToString()         ' Interchange Control Standards Identifier (I10) 
            oSegment.DataElementValue(12) = oInterchangeRow("ISA12_InterchangeControlVersionNumber").ToString()         ' Interchange Control Version Number (I11) 
            oSegment.DataElementValue(13) = oInterchangeRow("ISA13_InterchangeControlNumber").ToString()         ' Interchange Control Number (I12) 
            oSegment.DataElementValue(14) = oInterchangeRow("ISA14_AcknowledgmentRequested").ToString()         ' Acknowledgment Requested (I13) 
            oSegment.DataElementValue(15) = oInterchangeRow("ISA15_UsageIndicator").ToString()         ' Usage Indicator (I14) 
            oSegment.DataElementValue(16) = oInterchangeRow("ISA16_ComponentElementSeparator").ToString()         ' Component Element Separator (I15) 

            sSql = "select * from [FunctionalGroup] where InterchangeKey = " & oInterchangeRow("InterchangeKey").ToString()
            Dim oGroupAdapter As SqlDataAdapter = New SqlDataAdapter(sSql, oConnection)
            Dim oGroupDs As DataSet = New DataSet("dsGroup")
            oGroupAdapter.Fill(oGroupDs, "dsGroup")

            For Each oGroupRow As DataRow In oGroupDs.Tables("dsGroup").Rows

                ' Creates the Functional Group Header segment (GS). 
                oGroup = oInterchange.CreateGroup("004010")
                oSegment = oGroup.GetDataSegmentHeader
                oSegment.DataElementValue(1) = oGroupRow("GS01_FunctionalIdentifierCode").ToString()         ' Functional Identifier Code (479) 
                oSegment.DataElementValue(2) = oGroupRow("GS02_ApplicationSendersCode").ToString()         ' Application Sender's Code (142) 
                oSegment.DataElementValue(3) = oGroupRow("GS03_ApplicationReceiversCode").ToString()          ' Application Receiver's Code (124) 
                oSegment.DataElementValue(4) = oGroupRow("GS04_Date").ToString()         ' Date (373) 
                oSegment.DataElementValue(5) = oGroupRow("GS05_Time").ToString()           ' Time (337) 
                oSegment.DataElementValue(6) = oGroupRow("GS06_GroupControlNumber").ToString()          ' Group Control Number (28) 
                oSegment.DataElementValue(7) = oGroupRow("GS07_ResponsibleAgencyCode").ToString()          ' Responsible Agency Code (455) 
                oSegment.DataElementValue(8) = oGroupRow("GS08_VersionReleaseIndustryIdentifierCode").ToString()         ' Version / Release / Industry Identifier Code (480) 

                sSql = "select * from [TS810_Header] where GroupKey = " & oGroupRow("GroupKey").ToString()
                Dim oHeaderAdapter As SqlDataAdapter = New SqlDataAdapter(sSql, oConnection)
                Dim oHeaderDs As DataSet = New DataSet("dsHeader")
                oHeaderAdapter.Fill(oHeaderDs, "dsHeader")

                For Each oHeaderRow As DataRow In oHeaderDs.Tables("dsHeader").Rows

                    ' TRANSACTION SET ID 810 - Invoice  

                    ' Creates the Transaction Set header segment (ST). 
                    oTransactionSet = oGroup.CreateTransactionSet("810")
                    oSegment = oTransactionSet.GetDataSegmentHeader
                    oSegment.DataElementValue(1) = oHeaderRow("ST01_TransactionSetIdentifierCode").ToString()        ' Transaction Set Identifier Code (143) 
                    oSegment.DataElementValue(2) = oHeaderRow("ST02_TransactionSetControlNumber").ToString()       ' Transaction Set Control Number (329) 


                    ' Beginning Segment for Invoice (BIG) 
                    oSegment = oTransactionSet.CreateDataSegment("BIG")
                    oSegment.DataElementValue(1) = oHeaderRow("BIG01_InvoiceDate").ToString()       ' Date (373) 
                    oSegment.DataElementValue(2) = oHeaderRow("BIG02_InvoiceNumber").ToString()         ' Invoice Number (76) 
                    oSegment.DataElementValue(3) = oHeaderRow("BIG03_PurchaseOrderDate").ToString()       ' Date (373) 
                    oSegment.DataElementValue(4) = oHeaderRow("BIG04_PurchaseOrderNumber").ToString()         ' Purchase Order Number (324) 
                    oSegment.DataElementValue(7) = oHeaderRow("BIG07_TransactionTypeCode").ToString()         ' Transaction Type Code (640) 

                    'BILLTO
                    If oHeaderRow("N102_BillToName").ToString().Trim() <> "" Then
                        oSegment = oTransactionSet.CreateDataSegment("N1\N1")
                        oSegment.DataElementValue(1) = "BT"         ' Entity Identifier Code (98) 
                        oSegment.DataElementValue(2) = oHeaderRow("N102_BillToName").ToString()        ' Name (93) 
                        oSegment.DataElementValue(3) = "1"      ' Identification Code Qualifier (66) 
                        oSegment.DataElementValue(4) = oHeaderRow("N104_BillToIdentificationCode").ToString()         ' Identification Code (67) 

                        ' Address Information (N3) 
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\N3"))
                        oSegment.DataElementValue(1) = oHeaderRow("N301_BillToAddressInformation").ToString()      ' Address Information (166) 

                        ' Geographic Location (N4) 
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\N4"))
                        oSegment.DataElementValue(1) = oHeaderRow("N401_BillToCityName").ToString()      ' City Name (19) 
                        oSegment.DataElementValue(2) = oHeaderRow("N402_BillToStateOrProvinceCode").ToString()         ' State or Province Code (156) 
                        oSegment.DataElementValue(3) = oHeaderRow("N403_BillToPostalCode").ToString()      ' Postal Code (116) 

                    End If

                    'REMIT TO
                    If oHeaderRow("N102_RemitToName").ToString().Trim() <> "" Then
                        oSegment = oTransactionSet.CreateDataSegment("N1\N1")
                        oSegment.DataElementValue(1) = "RE"         ' Entity Identifier Code (98) 
                        oSegment.DataElementValue(2) = oHeaderRow("N102_RemitToName").ToString()        ' Name (93) 
                        oSegment.DataElementValue(3) = "1"      ' Identification Code Qualifier (66) 
                        oSegment.DataElementValue(4) = oHeaderRow("N104_RemitToIdentificationCode").ToString()         ' Identification Code (67) 

                        ' Address Information (N3) 
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\N3"))
                        oSegment.DataElementValue(1) = oHeaderRow("N301_RemitToAddressInformation").ToString()      ' Address Information (166) 

                        ' Geographic Location (N4) 
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\N4"))
                        oSegment.DataElementValue(1) = oHeaderRow("N401_RemitToCityName").ToString()      ' City Name (19) 
                        oSegment.DataElementValue(2) = oHeaderRow("N402_RemitToStateOrProvinceCode").ToString()         ' State or Province Code (156) 
                        oSegment.DataElementValue(3) = oHeaderRow("N403_RemitToPostalCode").ToString()      ' Postal Code (116) 

                    End If

                    'SHIP TO
                    If oHeaderRow("N102_ShipToName").ToString().Trim() <> "" Then
                        oSegment = oTransactionSet.CreateDataSegment("N1\N1")
                        oSegment.DataElementValue(1) = "ST"         ' Entity Identifier Code (98) 
                        oSegment.DataElementValue(2) = oHeaderRow("N102_ShipToName").ToString()        ' Name (93) 
                        oSegment.DataElementValue(3) = "1"      ' Identification Code Qualifier (66) 
                        oSegment.DataElementValue(4) = oHeaderRow("N104_ShipToIdentificationCode").ToString()         ' Identification Code (67) 

                        ' Address Information (N3) 
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\N3"))
                        oSegment.DataElementValue(1) = oHeaderRow("N301_ShipToAddressInformation").ToString()      ' Address Information (166) 

                        ' Geographic Location (N4) 
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\N4"))
                        oSegment.DataElementValue(1) = oHeaderRow("N401_ShipToCityName").ToString()      ' City Name (19) 
                        oSegment.DataElementValue(2) = oHeaderRow("N402_ShipToStateOrProvinceCode").ToString()         ' State or Province Code (156) 
                        oSegment.DataElementValue(3) = oHeaderRow("N403_ShipToPostalCode").ToString()      ' Postal Code (116) 

                    End If

                    'SHIP FROM
                    If oHeaderRow("N102_ShipFromName").ToString().Trim() <> "" Then
                        oSegment = oTransactionSet.CreateDataSegment("N1\N1")
                        oSegment.DataElementValue(1) = "SF"         ' Entity Identifier Code (98) 
                        oSegment.DataElementValue(2) = oHeaderRow("N102_ShipFromName").ToString()        ' Name (93) 
                        oSegment.DataElementValue(3) = "1"      ' Identification Code Qualifier (66) 
                        oSegment.DataElementValue(4) = oHeaderRow("N104_ShipFromIdentificationCode").ToString()         ' Identification Code (67) 

                        ' Address Information (N3) 
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\N3"))
                        oSegment.DataElementValue(1) = oHeaderRow("N301_ShipFromAddressInformation").ToString()      ' Address Information (166) 

                        ' Geographic Location (N4) 
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\N4"))
                        oSegment.DataElementValue(1) = oHeaderRow("N401_ShipFromCityName").ToString()      ' City Name (19) 
                        oSegment.DataElementValue(2) = oHeaderRow("N402_ShipFromStateOrProvinceCode").ToString()         ' State or Province Code (156) 
                        oSegment.DataElementValue(3) = oHeaderRow("N403_ShipFromPostalCode").ToString()      ' Postal Code (116) 

                        ' Reference Identification (REF) 
                        If oHeaderRow("REF02_StoreNumber").ToString().Trim() <> "" Then
                            ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\REF"))
                            oSegment.DataElementValue(1) = "ST"         ' Reference Identification Qualifier (128) 
                            oSegment.DataElementValue(2) = oHeaderRow("REF02_StoreNumber").ToString()         ' Reference Identification (127) 

                        End If
                        
                    End If

                    'VENDOR
                    If oHeaderRow("N102_VendorName").ToString().Trim() <> "" Then
                        oSegment = oTransactionSet.CreateDataSegment("N1\N1")
                        oSegment.DataElementValue(1) = "VN"         ' Entity Identifier Code (98) 
                        oSegment.DataElementValue(2) = oHeaderRow("N102_VendorName").ToString()        ' Name (93) 
                        oSegment.DataElementValue(3) = "1"      ' Identification Code Qualifier (66) 
                        oSegment.DataElementValue(4) = oHeaderRow("N104_VendorIdentificationCode").ToString()         ' Identification Code (67) 

                        ' Address Information (N3) 
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\N3"))
                        oSegment.DataElementValue(1) = oHeaderRow("N301_VendorAddressInformation").ToString()      ' Address Information (166) 

                        ' Geographic Location (N4) 
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\N4"))
                        ' Syntax Rule: If 06 is present, then 05 is required. 
                        oSegment.DataElementValue(1) = oHeaderRow("N401_VendorCityName").ToString()      ' City Name (19) 
                        oSegment.DataElementValue(2) = oHeaderRow("N402_VendorStateOrProvinceCode").ToString()         ' State or Province Code (156) 
                        oSegment.DataElementValue(3) = oHeaderRow("N403_VendorPostalCode").ToString()      ' Postal Code (116) 


                        ' Reference Identification (REF) 
                        If oHeaderRow("REF02_VendorOrderNumber").ToString().Trim() <> "" Then
                            ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("N1\REF"))
                            oSegment.DataElementValue(1) = "VN"         ' Reference Identification Qualifier (128) 
                            oSegment.DataElementValue(2) = oHeaderRow("REF02_VendorOrderNumber").ToString()         ' Reference Identification (127) 

                        End If

                    End If

                    ' Terms of Sale/Deferred Terms of Sale (ITD) 
                    ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("ITD"))
                    oSegment.DataElementValue(1) = oHeaderRow("ITD01_TermsTypeCode").ToString()         ' Terms Type Code (336) 
                    oSegment.DataElementValue(2) = "3"      ' Terms Basis Date Code (333) 
                    oSegment.DataElementValue(3) = oHeaderRow("ITD03_TermsDiscountPercent").ToString()         ' Terms Discount Percent (338) 
                    oSegment.DataElementValue(5) = oHeaderRow("ITD05_TermsDiscountDaysDue").ToString()        ' Terms Discount Days Due (351)
                    oSegment.DataElementValue(7) = oHeaderRow("ITD07_TermsNetDays").ToString()        ' Terms Net Days (386) 
                    oSegment.DataElementValue(12) = oHeaderRow("ITD12_Description").ToString()        ' Description (352) 

                    ' Date/Time Reference (DTM) 
                    If oHeaderRow("DTM02_ShippedDate").ToString().Trim() <> "" Then
                        ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("DTM"))
                        oSegment.DataElementValue(1) = "0011"        ' Date/Time Qualifier (374) 
                        oSegment.DataElementValue(2) = oHeaderRow("DTM02_ShippedDate").ToString()       ' Date (373) 

                    End If
                    
                    ' F.O.B. Related Instructions (FOB) 
                    ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("FOB"))
                    oSegment.DataElementValue(1) = oHeaderRow("FOB01_ShipmentMethodOfPayment").ToString()         ' Shipment Method of Payment (146) 

                    sSql = "select * from [TS810_Detail] where HeaderKey = " & oHeaderRow("HeaderKey").ToString()
                    Dim oDetailAdapter As SqlDataAdapter = New SqlDataAdapter(sSql, oConnection)
                    Dim oDetailDs As DataSet = New DataSet("dsDetail")
                    oDetailAdapter.Fill(oDetailDs, "dsDetail")

                    For Each oDetailRow As DataRow In oDetailDs.Tables("dsDetail").Rows

                        ' Baseline Item Data (Invoice) (IT1) 
                        oSegment = oTransactionSet.CreateDataSegment("IT1\IT1")
                        oSegment.DataElementValue(2) = oDetailRow("IT102_QuantityInvoiced").ToString()         ' Quantity Invoiced (358) 
                        oSegment.DataElementValue(3) = oDetailRow("IT103_UnitOrBasisForMeasurementCode").ToString()         ' Unit or Basis for Measurement Code (355) 
                        oSegment.DataElementValue(4) = oDetailRow("IT104_UnitPrice").ToString()         ' Unit Price (212) 
                        oSegment.DataElementValue(6) = oDetailRow("IT106_ProductServiceIdQualifier").ToString()         ' Product/Service ID Qualifier (235) 
                        oSegment.DataElementValue(7) = oDetailRow("IT107_ProductServiceId").ToString()         ' Product/Service ID (234) 

                        ' Product/Item Description (PID) 
                        oSegment = oTransactionSet.CreateDataSegment("IT1\PID\PID")
                        oSegment.DataElementValue(1) = "F"      ' Item Description Type (349) 
                        oSegment.DataElementValue(5) = oDetailRow("PID05_Description").ToString()         ' Description (352) 

                        ' Service, Promotion, Allowance, or Charge Information (SAC) 
                        oSegment = oTransactionSet.CreateDataSegment("IT1\SAC\SAC")
                        oSegment.DataElementValue(1) = oDetailRow("SAC01_AllowanceOrChargeIndicator").ToString()      ' Allowance or Charge Indicator (248) 
                        oSegment.DataElementValue(2) = oDetailRow("SAC02_ServicePromotionAllowanceOrChargeCode").ToString()       ' Service, Promotion, Allowance, or Charge Code (1300) 
                        oSegment.DataElementValue(5) = oDetailRow("SAC05_Amount").ToString()         ' Amount (610)
                        oSegment.DataElementValue(12) = oDetailRow("SAC12_AllowanceOrChargeMethodOfHandlingCode").ToString()        ' Allowance or Charge Method of Handling Code (331) 
                        oSegment.DataElementValue(15) = oDetailRow("SAC15_Description").ToString()        ' Description (352) 

                    Next ' For Each oDetailRow

                    ' Total Monetary Value Summary (TDS) 
                    oSegment = oTransactionSet.CreateDataSegment("TDS")
                    oSegment.DataElementValue(1) = oHeaderRow("TDS01_TotalAmount").ToString()         ' Amount (610) 

                    ' Carrier Detail (CAD) 
                    ediDataSegment.Set(oSegment, oTransactionSet.CreateDataSegment("CAD"))
                    oSegment.DataElementValue(5) = oHeaderRow("CAD05_CarrierRouting").ToString()         ' Routing (387) 

                    oSegment = oTransactionSet.CreateDataSegment("SAC\SAC")
                    oSegment.DataElementValue(1) = oHeaderRow("SAC01_AllowanceOrChargeIndicator").ToString()      ' Allowance or Charge Indicator (248) 
                    oSegment.DataElementValue(2) = oHeaderRow("SAC02_ServicePromotionAllowanceOrChargeCode").ToString()       ' Service, Promotion, Allowance, or Charge Code (1300) 
                    oSegment.DataElementValue(5) = oHeaderRow("SAC05_Amount").ToString()         ' Amount (610) 
                    oSegment.DataElementValue(12) = oHeaderRow("SAC12_AllowanceOrChargeMethodOfHandlingCode").ToString()        ' Allowance or Charge Method of Handling Code (331) 
                    oSegment.DataElementValue(15) = oHeaderRow("SAC15_Description").ToString()        ' Description (352) 

                    oSegment = oTransactionSet.CreateDataSegment("ISS\ISS")
                    oSegment.DataElementValue(1) = oHeaderRow("ISS01_NumberOfUnitsShipped").ToString()         ' Number of Units Shipped (382) 
                    oSegment.DataElementValue(2) = "CA"         ' Unit or Basis for Measurement Code (355) 

                Next ' For Each oHeaderRow

            Next ' For Each oGroupRow

        Next ' For Each oInterchangeRow

        ' Trailing segments are automatically created when Framework EDI commits
        ' (saves) the instance of "oEdiDoc" object into an EDI file.
        oEdiDoc.Save(sAppPath & sEdiFileName)

        MessageBox.Show(oEdiDoc.GetEdiString(), sEdiFileName)

    End Sub

    Click here to download a trial version of the Framework EDI