if-statementconditional-statementsboo

Boo Language Calculation on Web Drop Down List


The software we use LanDesk Service Desk uses Boo Language calculations to allow for dynamic windows.

I have a drop down list on a form that has one of two options. "Acute" and "Ambulatory". Based on which is chosen, one of two possible fields will no longer be hidden and will be set to mandatory. I have managed to get this to work, but I'm afraid if the number of options grows on future forms that the code will get a little wordy. Do any of you have any suggestions for alternatives. Thank you,

import System

static def GetAttributeValue(Request):
    isAcuteHidden = true
    isAcuteMandatory = false
    isAmbulatoryHidden = true
    isAmbulatoryMandatory = false


    if Request._PharmacyType != null and Request._PharmacyType._Name == "Acute":
        isAcuteHidden = false
        isAcuteMandatory = true

    elif Request._PharmacyType != null and Request._PharmacyType._Name == "Ambulatory":
        isAmbulatoryHidden = false
        isAmbulatoryMandatory = true

    return String.Format(":SetHidden(_AcutePharmacy, {0});:SetMandatory(_AcutePharmacy, {1});:SetHidden(_AmbulatoryPharmacy, {2});:SetMandatory(_AmbulatoryPharmacy, {3});", isAcuteHidden, isAcuteMandatory,  isAmbulatoryHidden, isAmbulatoryMandatory)   

Solution

  • A few pointers:

    It appears that for both pairs, the is?????Hidden and corresponding is?????Mandatory will always be opposite values. If so, you don't need two separate boolean variables to track them.

    If you're going to end up with a lot of blocks that look basically like this one, the proper way to handle it in Boo is with a macro, like so:

    macro HiddenOrRequiredValues:
       ControlStrings = List[of String]()
       ArgVarNames = List[of ReferenceExpression]()
       counter = 0
       for arg as ReferenceExpression in HiddenOrRequiredValues.Arguments:
          argVariable = ReferenceExpression("is$(arg)Hidden")
          yield [|$argVariable = true|]
          yield [|
             if Request._PharmacyType != null and Request._PharmacyType._Name == $(arg.ToString()):
            $argVariable = false
          |]
          ControlStrings.Add(":SetHidden(_$(arg)Pharmacy, {$(counter)});:$(arg)Mandatory(_AcutePharmacy, {$(counter + 1)})")
          ArgVarNames.Add(argVariable)
          counter += 2
       resultString = join(ControlStrings, '')
       resultCmd as MethodInvocationExpression = [|String.Format($resultString)|]
       for varName in ArgVarNames:
          resultCmd.Arguments.Add([|$varName|])
          resultCmd.Arguments.Add([|not $varName|])
       yield [|return $resultCmd|]
    

    Then the entirety of your method becomes:

    static def GetAttributeValue(Request):
        HiddenOrRequiredValues Acute, Ambulatory
    

    It's more work to set it up, but once you have the macro in place, adding in more values becomes much, much easier. Feel free to modify the macro to suit your needs. This should be enough to get you started, though.