Background

As you know the EDIValidator component uses rules files to validate EDI data.  You can specify rather complex conditions.  For example

+SegPos[322] = if ((SegPos[316:1] == "R") or (SegPos[316:1] == "S")) then Usage[Required] else Usage[Optional] end

This rules says that segment number 322’s usage depends on whether the condition in the if statement is true.  The following example also contains else if clauses and creates an error if any condition is met

+SegPos[275:2]=if ( SegPos[275:2] !=  SegPos[3:2] ) then Error[ElementHasWrongValue,"ST02 must be equal to SE02"] end elseif ( SegPos[275:2] !=  SegPos[3:3] ) then Error[ElementHasWrongValue,"ST02 must be equal to SE03"] end else Error[ElementHasWrongValue,"ST02 must be equal to SE05"] end

But what if you need more powerful conditions that the rules file language doesn’t support?  Let me introduce Code Conditions

Introduction

Code Conditions allow you harness the power of .Net to validate data.  When the EDIValidator encounters a code condition it throws an event.  You guys still with me?  OK, I’ll show you how it’s done.

Scenario 1

Your Boss: “Steve, we need to make sure that all of our Interchange Control Numbers in segment IEA does not start with ‘0000‘ or YOU’RE FIRED!”

You: “No prob boss dude, I’ll use a code condition”

You Boss: “This better work Steve!”

Solution

OK, so we need to target element 2 of the IEA segment

codecond1

Step 1: Update our rules file

We’ll add the following rule

+SegPos[277:2]=if ( CodeCondition["shouldStartWithZeros"] ) then Error[ElementHasWrongValue,"Yeah, I have a job"]  end

We can see from the image above that segment 277 is the IEA segment.  What we’ve done is add a code condition that will call our .Net code.  We named this code condition ‘shouldStartWithZeros‘ so that we can identify it in our code.

Step 2: Register for the OnCodeCondition event

Register for the appropriate event on the EDIValidator

ediValidator.OnCodeCondition += new EDIValidator.CodeConditionEvent(ediValidator_CustomCondition);

Step 3: Write our own condition check

private void ediValidator_CustomCondition(object sender, CodeConditionEventArgs e){
  if (e.CodeCondition.Id == "shouldStartWithZeros"){
     if (e.CurrentSegment.Elements[1].DataValue.StartsWith("0000")){
      e.ConditionValid = true;
     }
  }
}

When you run the validator you now see the error

codecondition2

Scenario 2

Your Boss: “Steve, you are not fired yet.  I also need to check if the ISA segment element 1 is equal to ’00’ in that condition.  Don’t ask why”

You: “No prob boss dude, I can use the same code condition”

You Boss: “This better work!”

Step 1: Just use the FoundSegments collections

private void ediValidator_CustomCondition(object sender, CodeConditionEventArgs e){
  if (e.CodeCondition.Id == "shouldStartWithZeros"){
     if (e.CurrentSegment.Elements[1].DataValue.StartsWith("0000") && e.FoundSegments[0].Elements[0].DataValue=="00"){
      e.ConditionValid = true;
     }
  }
}

You: “Boss dude, there are a few properties I can use to take care of all the scenarios”

Your Boss: “You’re fired! WAIT, what did you say?”

You: “I can use the CurrentSegmentSchema to check what our current segment structure should look like. I can use the DataLoop property to see all the loops and segments that were loaded so far.  This can enable us to validate against any data we want!

Your Boss:”Wow, you can go home early today.  Just kidding.  But you’re not fired”

Take Charge Of EDI

RDPCrystal EDI Library

trial2