Question
· 23 hr ago

Using Variables in Foreach within Rules

Hi Community

I'm working on a complex piece of rules that needs to check each OBX and evaluate if 3 of the fields match certain criteria. I've tried to achieve this using a Foreach loop, which does work, however it is not as clean as I wanted it. I was hoping I could assign temp variables inside the foreach loop to make the rules more easier to read, for example @testCode @resultText. This is not support as you can only assign inside a when condition. Before I raise this as an idea, i wondered if there was an alternative way to achieve the same thing?

Product version: IRIS 2024.1
Discussion (1)2
Log in or sign up to continue

To assign temporary variables within a foreach loop in ObjectScript, you may consider alternatives that enhance readability and maintainability:

  1. Using Macros for foreach Iteration:
    You can define and use macros for looping over arrays and performing actions on each element. A macro can abstract the repetitive code required for array traversal. For example:

    ##; Macro definitions
    #define foreach(%key,%arr,%do) set %key="" for  set %key=$o(%arr(%key)) q:%key=""  do %do
    

    Example usage:

    #include ZFOREACHMACRO
    test $$$foreach(key,^rcc,show)
       quit
    show zwrite @$zr,!
       quit
    

    This approach simplifies the loop logic and makes it more modular [1][2].

  2. Extended Command:
    Another option is creating an extended command ZZFOREACH for iteration. This allows deployment across namespaces and provides flexibility such as starting at a specific subscript or reversing the direction. Example command definition:

    ZZFOREACH(%par) public {
       set %par=$lfs(%par,";")
       new %array,%do,%fwd,%key,%val
       set %array=$lg(%par,1),%do=$lg(%par,2),%fwd=$lg(%par,3),%key=$lg(%par,4)
       if '%fwd set %fwd=1
       if %key]"" set %key=$o(@%array@(%key),$s(%fwd<1:-1,1:1))
       for  set %key=$o(@%array@(%key),%fwd,%val) quit:%key=""  do @%do
       quit 1
    }
    

    Example usage:

    DEMO>zzforeach "^rcc;show^dump(%array,%key,%val)"
    ^rcc(1) = 1
    ^rcc(2) = 2
    ^rcc(3) = 3
    ^rcc(4) = 4
    ^rcc(5) = 5
    

    This method condenses the loop logic and embeds control features [1][2].

  3. Using the ObjectScript foreach Library:
    ObjectScript libraries such as the one in Foreach's GitHub repository enable modular iteration. The library supports dynamic arrays, objects, and other constructs. The syntax for using this is as follows:

    USER>set YOUR_VARIABLE = ["sample","data"]
    USER>do ##class(Iteration.Loop).Foreach(YOUR_VARIABLE,"METHODNAME")
    

    Inside the method (METHODNAME), actions for each element can be defined:

    ClassMethod METHODNAME(pMes) As %Status {
       write pMes, !
       return $$$OK
    }
    

    This library provides flexibility for defining custom methods for element handling [3].

These solutions provide alternatives to for-each loops in ObjectScript that improve code readability and may allow variable assignments during iterations, adhering to your goal [1][3][2].

Sources: