2015-06-03 5 views
1

Программное обеспечение, которое мы используем LanDesk Service Desk использует вычисления языка Boo для динамических окон.Boo Language Calculation on Web Выпадающий список

У меня есть раскрывающийся список в форме, которая имеет один из двух вариантов. «Острый» и «Амбулаторный». Исходя из выбранного, одно из двух возможных полей больше не будет скрыто и будет установлено как обязательное. Мне удалось заставить это работать, но я боюсь, если количество вариантов будет расти в будущих формах, что код станет немного многословным. У кого-нибудь из вас есть предложения по альтернативам. Спасибо,

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) 

ответ

0

Несколько указателей:

Оказывается, что для обеих пар, то is?????Hidden и соответствующие is?????Mandatory всегда будут противоположные значения. Если это так, вам не нужны две отдельные логические переменные для их отслеживания.

Если вы собираетесь в конечном итоге с большим количеством блоков, которые выглядят в основном как этот, правильный способ справиться с этим в Boo это с помощью макроса, например, так:

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|] 

Тогда цельность ваш метод становится:

static def GetAttributeValue(Request): 
    HiddenOrRequiredValues Acute, Ambulatory 

Это больше работы, чтобы установить его, но как только у вас есть макрос на месте, добавляя в более значениях становится намного проще. Не стесняйтесь изменять макрос в соответствии с вашими потребностями. Однако этого должно быть достаточно, чтобы вы начали.

+0

Спасибо, Мейсон. Я рассмотрю это, но я не уверен, поддерживает ли родительское ПО LanDesk Service Desk концепцию макросов в вычислениях. В основном вы ограничиваетесь набором этих сценариев в маленькие окна. – johnsonr