//This is just an example program to demonstrate how to create a 999 Implementation Acknowledgment
            //in C# using the Framework EDI component.

            ediDocument oEdiDoc = null;
            ediDataSegment oSegment = null;
            ediAcknowledgment oAck = null;
            ediSchemas oSchemas = null;

            string sSegmentID;
            string sLoopSection;
            int nArea;

            string sPath = AppDomain.CurrentDomain.BaseDirectory;

            //edi file to be acknowledged
            //string sEdiFile = "837_5010X222A1.X12";
            string sEdiFile = "837_5010X222A1_bad.X12";

            Cursor = Cursors.WaitCursor;

            //instantiat edi document object
            ediDocument.Set(ref oEdiDoc, new ediDocument());    // oEdiDoc = new ediDocument();

            //By default, FREDI uses the  universal coordinated time (UTC), however you can change it to local time
            oEdiDoc.set_Option(DocumentOptionIDConstants.OptDocument_UseLocalTime,1);

            // Disabling the internal standard reference library to makes sure that 
            // FREDI uses only the SEF file provided
            ediSchemas.Set(ref oSchemas,(ediSchemas) oEdiDoc.GetSchemas());    //oSchemas = (ediSchemas) oEdiDoc.GetSchemas();
            oSchemas.EnableStandardReference = false;

            // This makes certain that the EDI file must use the same version SEF file, otherwise
            // the process will stop.
            oSchemas.set_Option(SchemasOptionIDConstants.OptSchemas_VersionRestrict,1);

            // By setting the cursor type to ForwardOnly, FREDI does not load the entire file into memory, which
            // improves performance when processing larger EDI files.
            oEdiDoc.CursorType = DocumentCursorTypeConstants.Cursor_ForwardOnly;

            // If an acknowledgment file has to be generated, an acknowledgment object must be created, and its 
            // property must be enabled before loading the EDI file.
            oAck = (ediAcknowledgment) oEdiDoc.GetAcknowledgment();
            oAck.EnableImplementationAcknowledgment = true;

            //Property to enable TA1 acknowledgment in the 999
            oAck.EnableInterchangeAcknowledgment = true;
    
            //Option to combine the TA1 and 999 into one Interchange
            oAck.set_Option(AcknowledgmentOptionIDConstants.OptAcknowledgment_Combine, 1);


            //Accept transaction set with errors
            //oAck.AcceptSetWithErrors = true;    //IK501 code will be "E" if transaction set has errors, and accepted.

            // Set the starting point of the control numbers in the acknowledgment
            oAck.set_Property(AcknowledgmentPropertyIDConstants.PropertyAck_StartInterchangeControlNum,1001);
            oAck.set_Property(AcknowledgmentPropertyIDConstants.PropertyAck_StartGroupControlNum,1);
            oAck.set_Property(AcknowledgmentPropertyIDConstants.PropertyAck_StartTransactionSetControlNum,1);

            // Error codes that are not automatically mapped to an acknowlegment error number by FREDI can be set by
            // using the MapDataElementLevelError method.
            oAck.MapDataElementLevelError(13209, 5,"","","","");

            // All SEF files required for processing the EDI files must be provided by calling the LoadSchema.  
            // The "LoadSchema" method does not actually load the SEF files at this time, but are actually 
            // loaded during the LoadEdi method.
            oEdiDoc.LoadSchema(sPath + "999_005010X231A1.EVAL0.SEF", 0);    // evaluation SEF file for Ack (999) file
            oEdiDoc.LoadSchema(sPath + "837_005010X222A1.SemRef.EVAL0.SEF", 0);    // evaluation SEF file for EDI (837) file

            // Loads EDI file and the corresponding SEF file
            oEdiDoc.LoadEdi(sPath + sEdiFile);

            // Gets the first data segment in the EDI files
            ediDataSegment.Set(ref oSegment, (ediDataSegment) oEdiDoc.FirstDataSegment);  //oSegment = (ediDataSegment) oEdiDoc.FirstDataSegment

            //Iterate through all segments in the EDI fle so that component has a chance to validate them.
            while ( oSegment != null ) 
            {
                //get next data segment
                ediDataSegment.Set(ref oSegment, (ediDataSegment) oSegment.Next());    //oSegment = (ediDataSegment) oSegment.Next();
            }


            // Checks the 999 acknowledgment file just created.  It can also be modified at this time.
            // The 999 file is an EDI file, so the logic to read the 999 Implementation Acknowledgemnt file is similar
            // to translating any other EDI file.

            // Gets the first segment of the 999 acknowledgment file
            ediDataSegment.Set(ref oSegment, (ediDataSegment)oAck.GetFirstDataSegmentByAck("999"));    //oSegment = (ediDataSegment) oAck.GetFirstDataSegmentByAck("999");

            while ( oSegment != null ) 
            {
                nArea = oSegment.Area;
                sLoopSection = oSegment.LoopSection;
                sSegmentID = oSegment.ID;

                if (nArea == 0)
                {
                    if (sSegmentID == "TA1")
                    {
                        if (oSegment.get_DataElementValue(4, 0) == "A")
                        {
                            MessageBox.Show("Interchange Accepted");
                        }
                    }
                }

                else if (nArea == 1)
                {
                    if (sLoopSection == "")
                    {
                        if (sSegmentID == "ST")
                        {
                            oSegment.set_DataElementValue(3, 0, "005010X231A1"); //Add this value into data element ST03 because it is not automatically generated
                        }
                        else if (sSegmentID == "AK9")
                        {
                            if (oSegment.get_DataElementValue(1, 0) == "A")
                            {
                                MessageBox.Show("Funtional Group accepted");
                            }
                            else
                            {
                                //You can modify the 999 and overwrite FREDI's default value 
                                oSegment.set_DataElementValue(1, 0,"P"); //Partially accepted.  At least one transaction set was rejected.
                            }
                        }
                    }    // sLoopSection == ""
                    else if (sLoopSection == "AK2")
                    {
                        if (sSegmentID == "IK5")
                        {
                            if (oSegment.get_DataElementValue(1, 0) == "R")
                            {
                                MessageBox.Show("Transaction set rejected");
                            }
                        }
                    }

                }    //nArea == 1

                ediDataSegment.Set(ref oSegment, (ediDataSegment) oSegment.Next());    //oSegment = (ediDataSegment) oSegment.Next();
            }    //oSegment != null

            //save the 999 acknowledgment
            oAck.Save(sPath + "999_" + sEdiFile);

            //display ack
            MessageBox.Show(oAck.GetEdiString(),"999 Ack file");

            Cursor = Cursors.Default;

            MessageBox.Show("Done. Output = " + sPath + "999_" + sEdiFile);

        }

    Click here to download a trial version of the Framework EDI