Question Mikhail (VetsEZ) Akselrod · May 11

Failure to use multi-line code in *inc file macro definition

What is wrong with the *inc file code below:

#define ArrayToString(%array,%out,%del)      set %out="" for { ##continue
                                                                                   set key=$order(%array("")) quit:key="" ##continue
                                                                                   set %out=%out_%del_key ##continue
                                                                               } quit

Compilation at calling classmethod as : Set tQStr = $$$ArrayToString(pQArray,tQStr,"##") brings error as:

Product version: IRIS 2022.1
$ZV: 2022.1.2 Build 574 Server IRIS for Windows (x86-64) 2022.1.2

Comments

Julius Kavay · May 11

I would say, a little bit to much "set" command.

Instead   of: Set tQStr = $$$ArrayToString(pQArray,tQStr,"##") 

try this  one: $$$ArrayToString(pQArray,tQStr,"##") 

Your version gives something like: Set tQStr = set %out="" for { ...

as you see, %out isn't a command (and set would be undefined, but that isn't the problem)

By the way, the second line of your macro should be:

set key=$order(%array(key)) quit:key="" ##continue

else you have the perfect endless loop

0
Mikhail (VetsEZ) Akselrod  May 11 to Julius Kavay

Upon change:

set %out="" for { ##continue
         set key=$order(%array(key)) quit:key="" ##continue
        set %out=%out_%del_key}

Call is: $$$ArrayToString(pQArray,tQStr,"##")

ERROR #5002: ObjectScript error: <UNDEFINED>zTrans+22^HS.Local.VA.Util.SQLHub.1 *key

0
Julius Kavay  May 11 to Mikhail (VetsEZ) Akselrod

Sometimes, like now, it's a good idea to give a variable an initial value...

set %out="", key="" for {...

0
Julius Kavay · May 11

One more comment, I'm not sure about the "quit" command after the closing curly brace,  I think you don't need it (because it's outside of the FOR loop, hence it will stop the flow of your application)!

0
Robert Cemper · May 11
  1. With your #define, you create a sequence of lines. NOT a method !!
  2. So the final quit is wrong.
0
Mikhail (VetsEZ) Akselrod  May 11 to Robert Cemper

Upon change:

set %out="" for { ##continue
         set key=$order(%array("")) quit:key="" ##continue
        set %out=%out_%del_key}

Call is: $$$ArrayToString(pQArray,tQStr,"##")

Just for 3 rows array, it creates infinitive string ending in MAXSTRING error

0
Yaron Munz  May 12 to Mikhail (VetsEZ) Akselrod

the $order(%array("")) is causing endless loop.
You should have: $order(%array(key)) with set key="" outside the loop.

0