Also there is a common approach to use the root as a counter of the one-level array using $seq(uence) or $I(ncrement). E.g.

Class Test.Arrays {

ClassMethod ArrayExample()

{

 set a($seq(a))="blue"

set a($seq(a))="red"

set a($seq(a))="yellow"

write a,!    // will return 3

zwrite a // will out the full array to the device

}

}

And if we execute the following in terminal you'll get:

USER>d ##class(Test.Arrays).ArrayExample()

3

a=3
a(1)="blue"
a(2)="red"
a(3)="yellow"

Also see the good article on $seq vs $I by @Alexander.Koblov

HTH

Hi, Ed!

Thanks! 

I'll elaborate the problem a bit. Here is the $case everybody loves:

write $case(condition, 1:expression1, 2:expression2, expression3)

My problem is that with business logic change the expression1 and expression2 showed the need for multiline logic. And I was looking for something like:

write $case(condition,

1: {

New cool logic for expression 1 with line 1
and line 2


},

2:{

Perfect, better logic for expression2
maybe with 
few lines
more

},

expression3)

Hi, Jaqueline!

@Sam Duncan is right below, and please don't consider my example above!

See the updated version of the method for Cube class:

classmethod UnitLevel(unitID, level) as %String {

s unit=##class(Police.Unit).%OpenId(unitID)

if '$IsObject(unit) return ""

return $Case(level,

  1:unit.UNI_PADRE.UNI_PADRE.UNI_PADRE.%Id(),

  2:unit.UNI_PADRE.UNI_PADRE.%Id(),

  3:unit.UNI_PADRE.%Id(),

  4:unit.%id(),:"") }

Introduce the dimension with 4 levels, with expressions:

1 st level:

%cube.UnitLevel(%source.%ID,1)

2nd level:

%cube.UnitLevel(%source.%ID,2)

3 and 4 levels same idea.

AND!!! The key thing!

introduce a calculated or direct field in your class which will indicate a level of the row - say H_LEVEL with values 1,2,3,4 according to the level of administration.

and introduce a build restriction to the cube with:

H_LEVEL=4

So, there would be only 4th level records in the cube, but you'll gather all other needed calculations and values using your hierarchy.

Hi, Jaqueline!

Really interesting task. Do you have only 4 levels?

If so, you can introduce a method on a cube which would return a level of the unit.

Say:

classmethod UnitLevel(unitID as %Integer) as %String {

 s unit=##class(Police.Unit).%OpenId(unitID)

 if unit.UNI_PADRE="" return "Zone"

s padre=##class(Police.Unit).%OpenId(unit.UNI_PADRE)

if padre.UNI_PADRE="" return "Prefecrure"

/// continue here!

}

It's for 2 levels,  leave other two for you ;)

And use

%cube.UnitLevel(%source.UNI_CODIGO)

for the Dimension level expression.