This post is part of an ongoing series, the
explanation of which can be found here.

This
one should be of more use to our friends using BizTalk Server 2006.  Today we
tackle a problem that anyone who has ever mapped an EDI 837 I/P/D has had to deal
with, and probably solved with hundreds of “Value Mapping” functoids and Logical Not
(if you are on 2006) functoids.

The out of the box functoid set gives you a very nice “Value Mapping” functoid which
is great because it compiles to an xsl:if tag.  But if you want to do a simple
If A then B else C type logic you are left with either two value map functoids and
a Logical Not (or Logical Equal in 2004) functoids, or you are writing a scripting
functoid.  Either way you have hampered the readability of your map, and in the
case of the value map solution you’ve netted yourself a compiler warning for two links
to one node for each and every node you had to do this with.  If it is an 837
that you’re doing this with, that is a TON of nodes in the 2300 and
2400 loops.

The solution?  IfElseFunctiod of course!  This class, added to the TimRayburn.CustomFunctoids
project, takes three parameters.  The first is a boolean, the second is the value
returned if true, the third is the value returned if false.  It is important
to note that in any case, if connected directly to the output schema this will produce
a node.  It is not a XSLT functoid and cannot suppress the output node. 
For now if you need to do that, you’re still stuck with putting in a Value Mapping
functoid.

The newly added class can be found below.  It is nearly identical to last night’s
functoid of course.  Interestingly, I tried to refactor this class and the other
to create a base class that handled assigning the ID and resources.  When I did
so, BizTalk stopped recognizing that the assembly contained any functoids.  Apparently
your custom functoids must not simply inherit from BaseFunctoid, they must be
direct children of BaseFunctoid.

Download
v1.1 of TimRayburn.CustomFunctoids

   10     class IfElseFunctoid : BaseFunctoid
   11    
{
   12     
   public IfElseFunctoid()
   13     
   {
   14     
       // Assign a "unique" id
to this functiod
   15     
       this.ID = 24602;
   16 
   17     
       // Setup the resource assembly
to use.
   18     
       SetupResourceAssembly(
   19     
          "TimRayburn.CustomFunctoids.CustomFunctoidsResources",
   20     
          Assembly.GetExecutingAssembly());
   21 
   22     
       SetName("IDS_IFELSEFUNCTOID_NAME");
   23     
       SetTooltip("IDS_IFELSEFUNCTOID_TOOLTIP");
   24     
       SetDescription("IDS_IFELSEFUNCTOID_DESCRIPTION");
   25     
       SetBitmap("IDB_IFELSEFUNCTOID_BITMAP");
   26 
   27     
       this.SetMinParams(3);
   28     
       this.SetMaxParams(3);
   29 
   30     
       SetExternalFunctionName(this.GetType().Assembly.FullName,
   31     
          "TimRayburn.CustomFunctoids.IfElseFunctoid",
   32     
          "IfElse");
   33 
   34     
       this.Category = FunctoidCategory.ValueMapping;
   35     
       this.OutputConnectionType
= ConnectionType.AllExceptRecord;
   36 
   37     
       AddInputConnectionType(ConnectionType.AllExceptRecord);
   38     
       AddInputConnectionType(ConnectionType.AllExceptRecord);
   39     
       AddInputConnectionType(ConnectionType.AllExceptRecord);
   40     
   }
   41 
   42     
   public string IfElse(string booleanValue, string trueValue, string falseValue)
   43     
   {
   44     
       bool bVal = System.Convert.ToBoolean(booleanValue);
   45     
       if (bVal)
   46     
          return trueValue;
   47     
       else
   48     
          return falseValue;
   49     
   }
   50    
}