private void btnAck_Click(object sender, System.EventArgs e)
{
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.X12";
Cursor = Cursors.WaitCursor;
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.EnableFunctionalAcknowledgment = true;
//Property to enable TA1 acknowledgment in the 997
oAck.EnableInterchangeAcknowledgment = true;
//Option to combine the TA1 and 997 into one Interchange
oAck.set_Option(Edidev.FrameworkEDI.AcknowledgmentOptionIDConstants.OptAcknowledgment_Combine,1);
// 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 + "837_X098.SEF", 0); //for EDI (837) file
oEdiDoc.LoadSchema(sPath + "997_X12-4010.SEF", 0); //for Ack (997) 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
// This loop iterates though the EDI file a segment at a time
while ( oSegment != null )
{
// A segment is identified by its Area number, Loop section and segment id.
sSegmentID = oSegment.ID;
sLoopSection = oSegment.LoopSection;
nArea = oSegment.Area;
//get next data segment
ediDataSegment.Set(ref oSegment, (ediDataSegment) oSegment.Next()); //oSegment = (ediDataSegment) oSegment.Next();
}
// Checks the 997 acknowledgment file just created.
// The 997 file is an EDI file, so the logic to read the 997 Functional Acknowledgemnt file is similar
// to translating any other EDI file.
// Gets the first segment of the 997 acknowledgment file
ediDataSegment.Set(ref oSegment, (ediDataSegment) oAck.GetFirst997DataSegment()); //oSegment = (ediDataSegment) oAck.GetFirst997DataSegment();
while ( oSegment != null )
{
nArea = oSegment.Area;
sLoopSection = oSegment.LoopSection;
sSegmentID = oSegment.ID;
if (nArea == 1)
{
if (sLoopSection == "")
{
if (sSegmentID == "AK9")
{
if (oSegment.get_DataElementValue(1,0) == "R")
{
// reject EDI file
}
}
} // sLoopSection == ""
} //nArea == 1
ediDataSegment.Set(ref oSegment, (ediDataSegment) oSegment.Next()); //oSegment = (ediDataSegment) oSegment.Next();
} //oSegment != null
//save the acknowledgment
oAck.Save(sPath + "997_" + sEdiFile);
Cursor = Cursors.Default;
MessageBox.Show("Done. Output = " + sPath + "997_" + sEdiFile);