//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);
}