| 1 | TMGMISC ;TMG/kst/Misc utility library ;03/25/06; 5/24/10 | 
|---|
| 2 | ;;1.0;TMG-LIB;**1**;07/12/05 | 
|---|
| 3 |  | 
|---|
| 4 | ;"TMG MISCELLANEOUS FUNCTIONS | 
|---|
| 5 | ;"Kevin Toppenberg MD | 
|---|
| 6 | ;"GNU General Public License (GPL) applies | 
|---|
| 7 | ;"7-12-2005 | 
|---|
| 8 |  | 
|---|
| 9 | ;"======================================================================= | 
|---|
| 10 | ;" API -- Public Functions. | 
|---|
| 11 | ;"======================================================================= | 
|---|
| 12 | ;"STARTRPC -- Start up RPCBroker on port 9210 | 
|---|
| 13 | ;"STOPRPC -- Stop RPCBroker on port 9210 | 
|---|
| 14 | ;"STOPTSKM -- Stop TaskMan non-interactively | 
|---|
| 15 | ;"EDITPT(AddOK) | 
|---|
| 16 | ;"GetPersonClass(PersonClass,ProviderType,Specialty) | 
|---|
| 17 | ;"$$DocLines(IEN,Chars) -- Count number of lines and chars in a 8925 WP field | 
|---|
| 18 | ;"$$WPChars(Ptr) | 
|---|
| 19 | ;"$$RoundUp(n) | 
|---|
| 20 | ;"$$RoundDn(n) | 
|---|
| 21 | ;"$$Round(n) | 
|---|
| 22 | ;"$$InList(Value,ArrayP) -- return if Value is in an array. | 
|---|
| 23 | ;"$$ListCt(pArray) | 
|---|
| 24 | ;"$$LISTCT(pArray) -- same as $$ListCt(pArray) | 
|---|
| 25 | ;"$$NodeCt(pArray) -- count all the nodes in an array | 
|---|
| 26 | ;"$$IndexOf(pArray,value) | 
|---|
| 27 | ;"ListPack(pArray,StartNum,IncValue) | 
|---|
| 28 | ;"ListAdd(pArray,index,value) | 
|---|
| 29 | ;"ListAnd(pArray1,pArray2,pResult) | 
|---|
| 30 | ;"ListNot(pArray1,pArray2,pResult) | 
|---|
| 31 | ;"$$DTFormat(FMDate,format) -- format fileman dates | 
|---|
| 32 | ;"$$CompDOB(DOB1,DOB2) -- compare two dates | 
|---|
| 33 | ;"BrowseBy(CompArray,ByTag) -- Allow a user to interact with dynamic text tree | 
|---|
| 34 | ;"$$CompName(Name1,Name2) -- compare two names | 
|---|
| 35 | ;"$$FormatName(Name) | 
|---|
| 36 | ;"$$HEXCHR(V) -- Take one BYTE and return HEX Values | 
|---|
| 37 | ;"$$HEXCHR2(n,digits) -- convert a number (of arbitrary length) to HEX digits | 
|---|
| 38 | ;"$$HEX2NUM(s) -- convert a string like this $10 to decimal number (e.g.) 16 | 
|---|
| 39 | ;"$$OR(a,b)   ; perform a bitwise OR on operands a and b | 
|---|
| 40 | ;"ParsePos(pos,label,offset,routine,dmod) | 
|---|
| 41 | ;"ScanMod(Module,pArray) | 
|---|
| 42 | ;"ConvertPos(Pos,pArray) | 
|---|
| 43 | ;"CompArray(pArray1,pArray2) return if two arrays are identical | 
|---|
| 44 | ;"$$CompABArray(pArrayA,pArrayB,pOutArray) -- FULL compare of two arrays, return diffArray | 
|---|
| 45 | ;"$$IterTemplate(Template,Prior) | 
|---|
| 46 | ;"$$NumPieces(s,delim,maxPoss) -- return number of pieces in string | 
|---|
| 47 | ;"$$LastPiece(s,delim,maxPoss) -- return the last piece of a string | 
|---|
| 48 | ;"$$ParseLast(s,remainS,delim,maxPoss) -- return the last piece AND the first part of the string | 
|---|
| 49 | ;"$$Trim1Node(pRef) -- To shorten a reference by one node. | 
|---|
| 50 | ;"BROWSEASK --  ask user for the name of an array, then display nodes | 
|---|
| 51 | ;"BRWSASK2 -- Improved... Ask user for the name of an array, then display nodes | 
|---|
| 52 | ;"BROWSENODES(current,Order,paginate,countNodes) -- display nodes of specified array | 
|---|
| 53 | ;"BRWSNOD2(curRef,Order,countNodes) -- display nodes of specified array, using Scroll box | 
|---|
| 54 | ;"ShowNodes(pArray,order,paginate,countNodes) -- display all the nodes of the given array | 
|---|
| 55 | ;"ShowNod2(pArray,order,countNodes) -- display all the nodes of the given array, using Scroll box | 
|---|
| 56 | ;"$$IsNumeric(value) -- determine if value is pure numeric. | 
|---|
| 57 | ;"$$ClipDDigits(Num,digits) -- clip number to specified number of digits | 
|---|
| 58 | ;"LaunchScreenman(File,FormIEN,RecIEN,Page) -- launching point screenman form | 
|---|
| 59 | ;"$$NumSigChs --determine how many characters are signficant in a variable name | 
|---|
| 60 | ;"MkMultList(input,List) -- create a list of entries, given a string containing a list of entries. | 
|---|
| 61 | ;"MkRangeList(Num,EndNum,List) -- create a list of entries, given a starting and ending number | 
|---|
| 62 | ;"$$Caller(Code) -- From call stack, return the location of the caller of the function | 
|---|
| 63 |  | 
|---|
| 64 | ;"======================================================================= | 
|---|
| 65 | ;"PRIVATE API FUNCTIONS | 
|---|
| 66 | ;"======================================================================= | 
|---|
| 67 | ;"GetPersonClass(PersonClass,ProviderType,Specialty) | 
|---|
| 68 | ;"ProcessToken(Token,Output) | 
|---|
| 69 | ;"$$IsSuffix(s) | 
|---|
| 70 | ;"$$IsTitle(s) | 
|---|
| 71 | ;"ShowBy(CompArray,ByTag,aOpen,bOpen,cOpen) | 
|---|
| 72 | ;"CtTemplate(Template) -- return the Count of IEN's stored in a SORT TEMPLATE | 
|---|
| 73 |  | 
|---|
| 74 | ;"======================================================================= | 
|---|
| 75 | ;"DEPENDENCIES | 
|---|
| 76 | ;"      TMGDBAPI | 
|---|
| 77 | ;"      TMGIOUTL | 
|---|
| 78 | ;"      TMGDEBUG | 
|---|
| 79 | ;"      TMGSTUTL | 
|---|
| 80 | ;"======================================================================= | 
|---|
| 81 | ;"======================================================================= | 
|---|
| 82 |  | 
|---|
| 83 | STARTRPC ; | 
|---|
| 84 | ;" -- Start up RPCBroker on port 9210 | 
|---|
| 85 | WRITE "Starting RPC Broker on port 9210",! | 
|---|
| 86 | DO STRT^XWBTCP(9210) | 
|---|
| 87 | WRITE ! | 
|---|
| 88 | QUIT | 
|---|
| 89 | ; | 
|---|
| 90 | STOPRPC ; | 
|---|
| 91 | ;" -- Stop RPC Broker on port 9210 | 
|---|
| 92 | WRITE "Stopping RPC Broker on port 9210",! | 
|---|
| 93 | DO STOP^XWBTCP(9210) | 
|---|
| 94 | WRITE ! | 
|---|
| 95 | QUIT | 
|---|
| 96 | ; | 
|---|
| 97 | STOPTSKM        ; | 
|---|
| 98 | ;"-- Shut Down Task Managers non-interactively | 
|---|
| 99 | ;" Taken from STOP^ZTMKU | 
|---|
| 100 | ; | 
|---|
| 101 | WRITE !,"Shutting down TaskMan and submanagers." | 
|---|
| 102 | DO GROUP^ZTMKU("SMAN^ZTMKU(NODE)") | 
|---|
| 103 | DO GROUP^ZTMKU("SSUB^ZTMKU(NODE)") | 
|---|
| 104 | WRITE !,"Okay!",! | 
|---|
| 105 | QUIT | 
|---|
| 106 | ; | 
|---|
| 107 | EDITPT(TMGADDOK) | 
|---|
| 108 | ;"Purpose: To ask for a patient name, and then allow editing | 
|---|
| 109 | ;"Input: TMGADDOK: if 1, then adding new patients is allowed | 
|---|
| 110 | ;"Result: none | 
|---|
| 111 | ; | 
|---|
| 112 | DO LO^DGUTL | 
|---|
| 113 | SET DGCLPR="" | 
|---|
| 114 | NEW DGDIV SET DGDIV=$$PRIM^VASITE | 
|---|
| 115 | ; | 
|---|
| 116 | IF DGDIV>0 SET %ZIS("B")=$PIECE($get(^DG(40.8,+DGDIV,"DEV")),U,1) | 
|---|
| 117 | ; | 
|---|
| 118 | KILL %ZIS("B") | 
|---|
| 119 | IF '$data(DGIO),$PIECE(^DG(43,1,0),U,30) do | 
|---|
| 120 | . SET %ZIS="N",IOP="HOME" | 
|---|
| 121 | . DO ^%ZIS | 
|---|
| 122 | ; | 
|---|
| 123 | A       DO ENDREG^DGREG($GET(DFN)) | 
|---|
| 124 | DO  IF (Y<0) GOTO EDITDONE | 
|---|
| 125 | . WRITE !! | 
|---|
| 126 | . IF $GET(TMGADDOK)=1 DO | 
|---|
| 127 | . . SET DIC=2,DIC(0)="ALEQM" | 
|---|
| 128 | . . SET DLAYGO=2 | 
|---|
| 129 | . ELSE  DO | 
|---|
| 130 | . . SET DIC=2,DIC(0)="AEQM" | 
|---|
| 131 | . . SET DLAYGO=0 | 
|---|
| 132 | . KILL DIC("S") | 
|---|
| 133 | . DO ^DIC | 
|---|
| 134 | . KILL DLAYGO | 
|---|
| 135 | . IF Y<0 QUIT | 
|---|
| 136 | . SET (DFN,DA)=+Y | 
|---|
| 137 | . SET DGNEW=$P(Y,"^",3) | 
|---|
| 138 | . NEW Y | 
|---|
| 139 | . DO PAUSE^DG10 | 
|---|
| 140 | . DO BEGINREG^DGREG(DFN) | 
|---|
| 141 | . IF DGNEW DO NEW^DGRP | 
|---|
| 142 | ; | 
|---|
| 143 | IF +$GET(DGNEW) DO | 
|---|
| 144 | . ;" query CMOR for Patient Record Flag Assignments if NEW patient and | 
|---|
| 145 | . ;" display results. | 
|---|
| 146 | . IF $$PRFQRY^DGPFAPI(DFN) DO DISPPRF^DGPFAPI(DFN) | 
|---|
| 147 | ; | 
|---|
| 148 | SET (DGFC,CURR)=0 | 
|---|
| 149 | SET DA=DFN | 
|---|
| 150 | SET DGFC="^1" | 
|---|
| 151 | SET VET=$SELECT($DATA(^DPT(DFN,"VET")):^("VET")'="Y",1:0) | 
|---|
| 152 | ; | 
|---|
| 153 | SET %ZIS="N",IOP="HOME" | 
|---|
| 154 | DO ^%ZIS | 
|---|
| 155 | SET DGELVER=0 | 
|---|
| 156 | ;"DO EN^DGRPD | 
|---|
| 157 | ;"IF $data(DGRPOUT) DO  GOTO A | 
|---|
| 158 | ;". DO ENDREG^DGREG($G(DFN)) | 
|---|
| 159 | ;". DO HL7A08^VAFCDD01 | 
|---|
| 160 | ;". KILL DFN,DGRPOUT | 
|---|
| 161 | ; | 
|---|
| 162 | ;"DO HINQ^DG10 | 
|---|
| 163 | IF $D(^DIC(195.4,1,"UP")) IF ^("UP") DO ADM^RTQ3 | 
|---|
| 164 | ; | 
|---|
| 165 | DO REG^IVMCQ($G(DFN))  ;" send financial query | 
|---|
| 166 | ; | 
|---|
| 167 | SET DGRPV=0 | 
|---|
| 168 | DO EN1^DGRP | 
|---|
| 169 | ; | 
|---|
| 170 | EDITDONE | 
|---|
| 171 | IF $PIECE($GET(^VA(200,DUZ,"TMG")),"^",1)="C" DO | 
|---|
| 172 | . WRITE @IOF,!  ;"clear screen if settings call for this. | 
|---|
| 173 | ; | 
|---|
| 174 | QUIT | 
|---|
| 175 |  | 
|---|
| 176 |  | 
|---|
| 177 | GetPersonClass(PersonClass,ProviderType,Specialty) | 
|---|
| 178 | ;"Purpose: To look through the PERSON CLASS file and find matching record | 
|---|
| 179 | ;"Input -- PersonClass -- a value to match against the .01 field (PROVIDER TYPE) | 
|---|
| 180 | ;"                Behavioral Health and Social Service | 
|---|
| 181 | ;"                Chiropractors | 
|---|
| 182 | ;"                Dental Service | 
|---|
| 183 | ;"                Dietary and Nutritional Service | 
|---|
| 184 | ;"                Emergency Medical Service | 
|---|
| 185 | ;"                Eye and Vision Services | 
|---|
| 186 | ;"                Nursing Service | 
|---|
| 187 | ;"                Nursing Service Related | 
|---|
| 188 | ;"                Physicians (M.D. and D.O.) | 
|---|
| 189 | ;"                etc. | 
|---|
| 190 | ;"        -- ProviderType -- a value to match against the 1 field (CLASSIFICATION) | 
|---|
| 191 | ;"                Physician/Osteopath | 
|---|
| 192 | ;"                Resident, Allopathic (includes Interns, Residents, Fellows) | 
|---|
| 193 | ;"                Psychologist | 
|---|
| 194 | ;"                Neuropsychologist | 
|---|
| 195 | ;"                etc. | 
|---|
| 196 | ;"        -- Specialty -- a value to match against the 2 field (AREA OF SPECIALIZATION) | 
|---|
| 197 | ;"Output -- (via results) | 
|---|
| 198 | ;"Result -- Returns record number in PERSON CLASS file, OR 0 if not found | 
|---|
| 199 |  | 
|---|
| 200 | new RecNum,Params | 
|---|
| 201 |  | 
|---|
| 202 | set Params(0,"FILE")="PERSON CLASS" | 
|---|
| 203 | set Params(".01")=$get(PersonClass) | 
|---|
| 204 | set Params("1")=$get(ProviderType) | 
|---|
| 205 | set Params("2")=$get(Specialty) | 
|---|
| 206 |  | 
|---|
| 207 | set RecNum=$$RecFind^TMGDBAPI(.Params) | 
|---|
| 208 |  | 
|---|
| 209 | GPCDone | 
|---|
| 210 | quit RecNum | 
|---|
| 211 |  | 
|---|
| 212 |  | 
|---|
| 213 | DocLines(IEN,Chars) | 
|---|
| 214 | ;"Purpose: To count the number of lines and characters in a WP field | 
|---|
| 215 | ;"        Initially it is targeted at entries in TIU DOCUMENT file. | 
|---|
| 216 | ;"Input:  IEN -- the record number in TIU DOCUMENT to count | 
|---|
| 217 | ;"          Chars -- and OUT parameter. PASS BY REFERENCE | 
|---|
| 218 | ;"Results: Returns number of lines, (with 1 decimal value) | 
|---|
| 219 | ;"        Also will return character count in Chars, if passed by reference | 
|---|
| 220 | ;"NOte: This uses the Characters per line parameter value stored in | 
|---|
| 221 | ;"        field .03 of TIU PARAMETERS (in ^TIU(8925.99)) | 
|---|
| 222 |  | 
|---|
| 223 | if $get(TMGDEBUG)>0 do DebugEntry^TMGDEBUG(.DBIndent,"DocLines^TMGMISC") | 
|---|
| 224 |  | 
|---|
| 225 | new CharsPerLine | 
|---|
| 226 | new LineCount set LineCount=0 | 
|---|
| 227 | set Chars=0 | 
|---|
| 228 | set CharsPerLine=+$piece($get(^TIU(8925.99,1,0)),"^",3) | 
|---|
| 229 |  | 
|---|
| 230 | if $get(TMGDEBUG)>0 do DebugMsg^TMGDEBUG(.DBIndent,"CharsPerLine=",CharsPerLine) | 
|---|
| 231 |  | 
|---|
| 232 | set WPPtr=$name(^TIU(8925,IEN,"TEXT")) | 
|---|
| 233 | set Chars=$$WPChars(WPPtr) | 
|---|
| 234 | if $get(TMGDEBUG)>0 do DebugMsg^TMGDEBUG(.DBIndent,"Chars=",Chars) | 
|---|
| 235 |  | 
|---|
| 236 | if CharsPerLine'=0 do | 
|---|
| 237 | . set LineCount=(((Chars/CharsPerLine)*10)\1)/10 | 
|---|
| 238 | . ;"new IntLC,LC,Delta | 
|---|
| 239 | . ;"set LC=Chars\CharsPerLine | 
|---|
| 240 | . ;"set IntLC=Chars\CharsPerLine  ;" \ is integer divide | 
|---|
| 241 | . ;"set Delta=(LC-IntLC)*10 | 
|---|
| 242 | . i;"f Delta>4 set IntLC=IntLC+1  ;"Round to closest integer value. | 
|---|
| 243 | . ;"set LineCount=IntLC | 
|---|
| 244 |  | 
|---|
| 245 | if $get(TMGDEBUG)>0 do DebugMsg^TMGDEBUG(.DBIndent,"LineCount=",LineCount) | 
|---|
| 246 |  | 
|---|
| 247 | if $get(TMGDEBUG)>0 do DebugExit^TMGDEBUG(.DBIndent,"DocLines^TMGMISC") | 
|---|
| 248 | quit LineCount | 
|---|
| 249 |  | 
|---|
| 250 |  | 
|---|
| 251 | WPChars(Ptr) | 
|---|
| 252 | ;"Purpose: To count the number of characters in the WP field | 
|---|
| 253 | ;"        pointed to by the name stored in Ptr | 
|---|
| 254 | ;"Results: Returns number of characters, including spaces | 
|---|
| 255 |  | 
|---|
| 256 | if $get(TMGDEBUG)>0 do DebugEntry^TMGDEBUG(.DBIndent,"WPChars^TMGMISC") | 
|---|
| 257 |  | 
|---|
| 258 | new index | 
|---|
| 259 | new Chars set Chars=0 | 
|---|
| 260 |  | 
|---|
| 261 | if $get(TMGDEBUG)>0 do DebugMsg^TMGDEBUG(.DBIndent,"Ptr=",Ptr) | 
|---|
| 262 | set index=$order(@Ptr@(0)) | 
|---|
| 263 | for  do  quit:(index="") | 
|---|
| 264 | . if index="" quit | 
|---|
| 265 | . if $get(TMGDEBUG)>0 do DebugMsg^TMGDEBUG(.DBIndent,"index='",index,"'") | 
|---|
| 266 | . ;"new s set s=$get(@Ptr@(index,0)) write "s=",s,! | 
|---|
| 267 | . set Chars=Chars+$length($get(@Ptr@(index,0))) | 
|---|
| 268 | . set index=$order(@Ptr@(index)) | 
|---|
| 269 |  | 
|---|
| 270 | if $get(TMGDEBUG)>0 do DebugExit^TMGDEBUG(.DBIndent,"WPChars^TMGMISC") | 
|---|
| 271 |  | 
|---|
| 272 | quit Chars | 
|---|
| 273 |  | 
|---|
| 274 |  | 
|---|
| 275 |  | 
|---|
| 276 | RoundUp(n) | 
|---|
| 277 | ;"SCOPE: PUBLIC | 
|---|
| 278 | ;"Purpose: find the next greatest integer after decimal value of n (round up) | 
|---|
| 279 | ;"        1.1 --> 2 | 
|---|
| 280 | ;"        1.0 --> 1 | 
|---|
| 281 | ;"        -2.8 --> 2 | 
|---|
| 282 | ;"input: n -- decimal or integer value | 
|---|
| 283 | ;"output an integer, rounded up. | 
|---|
| 284 |  | 
|---|
| 285 | new result | 
|---|
| 286 | set result=n\1 | 
|---|
| 287 | if result<n set result=result+1 | 
|---|
| 288 | quit result | 
|---|
| 289 |  | 
|---|
| 290 | RoundDn(n) | 
|---|
| 291 | ;"SCOPE: PUBLIC | 
|---|
| 292 | ;"Purpose: To round the  decimal value of n downward (towards 0) | 
|---|
| 293 | ;"        1.4 --> 1 | 
|---|
| 294 | ;"        -2.2 --> -2 | 
|---|
| 295 | ;"input: n -- decimal or integer value | 
|---|
| 296 | ;"output an integer, rounded down. | 
|---|
| 297 |  | 
|---|
| 298 | new result | 
|---|
| 299 | set result=n\1 | 
|---|
| 300 | quit result | 
|---|
| 301 |  | 
|---|
| 302 | Round(n) | 
|---|
| 303 | ;"SCOPE: PUBLIC | 
|---|
| 304 | ;"Purpose: find the nearest integer from decimal value of n | 
|---|
| 305 | ;"        for values 0.0-0.49 --> 0 | 
|---|
| 306 | ;"        for values 0.5-0.99 --> 1 | 
|---|
| 307 | ;"input: n -- decimal or integer value | 
|---|
| 308 | ;"output an integer, rounded to nearest integer | 
|---|
| 309 |  | 
|---|
| 310 | new result set result=n | 
|---|
| 311 | new decimal | 
|---|
| 312 |  | 
|---|
| 313 | set decimal=+(n-(n\1)) | 
|---|
| 314 | if decimal<0.5 do | 
|---|
| 315 | . set result=$$RoundDn(n) | 
|---|
| 316 | else  do | 
|---|
| 317 | . set result=$$RoundUp(n) | 
|---|
| 318 |  | 
|---|
| 319 | quit result | 
|---|
| 320 |  | 
|---|
| 321 |  | 
|---|
| 322 | InList(Value,ArrayP) | 
|---|
| 323 | ;"SCOPE: PUBLIC | 
|---|
| 324 | ;"Purpose: To return if Value is in an array. Match must be exact (i.e. '=') | 
|---|
| 325 | ;"Input: Value -- the value to test for. Should not be an array | 
|---|
| 326 | ;"         ArrayP -- the name of the array.  e.g. ArrayP="MyArray(""Title"")" | 
|---|
| 327 | ;"Format of Array:  It may be in one of two possible formats: | 
|---|
| 328 | ;"                1. MyArray("Title")=Value,   or | 
|---|
| 329 | ;"                2. MyArray("Title")="*"  <-- a signal that multiple values are given | 
|---|
| 330 | ;"                        MyArray("Title",1)=Value1 | 
|---|
| 331 | ;"                        MyArray("Title",2)=Value2 | 
|---|
| 332 | ;"                        The '1','2', etc may anything | 
|---|
| 333 | ;"Results: 1 if Value is in list, 0 if not | 
|---|
| 334 |  | 
|---|
| 335 | new result set result=0 | 
|---|
| 336 | new index | 
|---|
| 337 | if ($get(ArrayP)'="")&($data(Value)=1) do | 
|---|
| 338 | . if @ArrayP'="*" set result=(@ArrayP=$get(Value)) quit | 
|---|
| 339 | . set index=$order(@ArrayP@("")) quit:(index="") | 
|---|
| 340 | . for  do  quit:(index="")!(result=1) | 
|---|
| 341 | . . if @ArrayP@(index)=Value set result=1 quit | 
|---|
| 342 | . . set index=$order(@ArrayP@(index)) | 
|---|
| 343 |  | 
|---|
| 344 | ILDone | 
|---|
| 345 | quit result | 
|---|
| 346 |  | 
|---|
| 347 |  | 
|---|
| 348 | ;"IndexOf(pArray,value) | 
|---|
| 349 | ;"        ;"SCOPE: PUBLIC | 
|---|
| 350 | ;"        ;"Purpose: To scan array and return first index holding value | 
|---|
| 351 | ;"        ;"Input: pArray -- PASS BY NAME.  Array to scan, in format like this: | 
|---|
| 352 | ;"        ;"          @pArray@(1)=value1 | 
|---|
| 353 | ;"        ;"          @pArray@(2)=value2 | 
|---|
| 354 | ;"        ;"          @pArray@(3)=value3 | 
|---|
| 355 | ;"        ;"          @pArray@("some name index 1")=value4 | 
|---|
| 356 | ;"        ;"          @pArray@("some name index 2")=value5 | 
|---|
| 357 | ;"        ;"       value -- the value to search for | 
|---|
| 358 | ;"        ;"results: returns the index holding the value | 
|---|
| 359 | ;" | 
|---|
| 360 | ;"        new result set result="" | 
|---|
| 361 | ;"        new done set done=0 | 
|---|
| 362 | ;"        new index set index="" | 
|---|
| 363 | ;"        for  set index=$order(@pArray@(index)) quit:(index="")!(done=1)  do | 
|---|
| 364 | ;"        . set done=($get(@pArray@(index))=value) | 
|---|
| 365 | ;"        . if done set result=index | 
|---|
| 366 | ;" | 
|---|
| 367 | ;"IODone  quit result | 
|---|
| 368 |  | 
|---|
| 369 | LISTCT(pArray) ;" SAAC complient entry point. | 
|---|
| 370 | quit $$ListCt(pArray) | 
|---|
| 371 | ListCt(pArray) | 
|---|
| 372 | ;"SCOPE: PUBLIC | 
|---|
| 373 | ;"Purpose: to count the number of entries in an array | 
|---|
| 374 | ;"Input: pArray -- PASS BY NAME.  pointer to (name of) array to test. | 
|---|
| 375 | ;"Output: the number of entries at highest level | 
|---|
| 376 | ;"      e.g.  Array("TELEPHONE")=1234 | 
|---|
| 377 | ;"            Array("CAR")=4764 | 
|---|
| 378 | ;"            Array("DOG")=5213 | 
|---|
| 379 | ;"            Array("DOG","COLLAR")=5213  <-- not highest level,not counted. | 
|---|
| 380 | ;"        The above array would have a count of 3 | 
|---|
| 381 | ;"Results: returns count, or count up to point of any error | 
|---|
| 382 | new i,result set result=0 | 
|---|
| 383 |  | 
|---|
| 384 | do | 
|---|
| 385 | . new $etrap | 
|---|
| 386 | . set $etrap="write ""?? Error Trapped ??"",! set $ECODE="""" quit" | 
|---|
| 387 | . set i=$order(@pArray@("")) | 
|---|
| 388 | . if i="" quit | 
|---|
| 389 | . for  set result=result+1 set i=$order(@pArray@(i)) quit:i="" | 
|---|
| 390 |  | 
|---|
| 391 | quit result | 
|---|
| 392 |  | 
|---|
| 393 | NodeCt(pArray) | 
|---|
| 394 | ;"SCOPE: PUBLIC | 
|---|
| 395 | ;"Purpose: to count all the nodes in an array | 
|---|
| 396 | ;"Input: pArray -- PASS BY NAME.  pointer to (name of) array to test. | 
|---|
| 397 | ;"Output: the number of entries at highest level | 
|---|
| 398 | ;"      e.g.  Array("TELEPHONE")=1234 | 
|---|
| 399 | ;"            Array("CAR")=4764 | 
|---|
| 400 | ;"            Array("DOG")=5213 | 
|---|
| 401 | ;"            Array("DOG","COLLAR")=5213  <-- IS counted | 
|---|
| 402 | ;"        The above array would have a count of 4 | 
|---|
| 403 | ;"Results: returns count, or count up to point of any error | 
|---|
| 404 | new result set result=0 | 
|---|
| 405 | for  set pArray=$query(@pArray),result=result+1 quit:(pArray="") | 
|---|
| 406 | quit result | 
|---|
| 407 |  | 
|---|
| 408 | IndexOf(pArray,value) | 
|---|
| 409 | ;"SCOPE: PUBLIC: | 
|---|
| 410 | ;"Purpose: To search through an array of keys and values, and return 1st index (i.e. key) of value | 
|---|
| 411 | ;"Input: pArray -- NAME OF array to search, format: | 
|---|
| 412 | ;"                      @pArray@(key1)=value1 | 
|---|
| 413 | ;"                      @pArray@(key2)=value2 | 
|---|
| 414 | ;"                      @pArray@(key3)=value3 | 
|---|
| 415 | ;"       value -- the value to search for | 
|---|
| 416 | ;"Results: will return key for first found (based on $order sequence),or "" if not found | 
|---|
| 417 |  | 
|---|
| 418 | new result set result="" | 
|---|
| 419 | new i set i="" | 
|---|
| 420 | new done set done=0 | 
|---|
| 421 | for  set i=$order(@pArray@(i)) quit:(i="")!(done=1)  do | 
|---|
| 422 | . if $get(@pArray@(i))=value set result=i,done=1 | 
|---|
| 423 |  | 
|---|
| 424 | quit result | 
|---|
| 425 |  | 
|---|
| 426 | ListPack(pArray,StartNum,IncValue) | 
|---|
| 427 | ;"SCOPE: PUBLIC | 
|---|
| 428 | ;"Purpose: to take an array with numeric ordering and pack values. | 
|---|
| 429 | ;"      e.g. Array(3)="dog" | 
|---|
| 430 | ;"           Array(5)="cat" | 
|---|
| 431 | ;"           Array(75)="goat" | 
|---|
| 432 | ;"      Will be pack as follows: | 
|---|
| 433 | ;"           Array(1)="dog" | 
|---|
| 434 | ;"           Array(2)="cat" | 
|---|
| 435 | ;"           Array(3)="goat" | 
|---|
| 436 | ;"Input: pArray -- pointer to (NAME OF) array to pack. | 
|---|
| 437 | ;"       StartNum -- OPTIONAL, default=1.  Value to start numbering at | 
|---|
| 438 | ;"       IncValue -- OPTIONAL, default=1.  Amount to add to index value each time | 
|---|
| 439 | ;"Output: array will be altered | 
|---|
| 440 | ;"Results: none. | 
|---|
| 441 | ;"Notes: It is assumed that all of the indices are numeric | 
|---|
| 442 | ;"       Nodes that are ALPHA (non-numeric) will be KILLED!! | 
|---|
| 443 | ;"       If nodes have subnodes, they will be preserved. | 
|---|
| 444 |  | 
|---|
| 445 | new TMGlpArray | 
|---|
| 446 | new i | 
|---|
| 447 | new count set count=$get(StartNum,1) | 
|---|
| 448 | set i=$order(@pArray@("")) | 
|---|
| 449 | if +i=i for  do  quit:(+i'=i) | 
|---|
| 450 | . merge TMGlpArray(count)=@pArray@(i) | 
|---|
| 451 | . set count=count+$get(IncValue,1) | 
|---|
| 452 | . set i=$order(@pArray@(i)) | 
|---|
| 453 | kill @pArray | 
|---|
| 454 | merge @pArray=TMGlpArray | 
|---|
| 455 | quit | 
|---|
| 456 |  | 
|---|
| 457 |  | 
|---|
| 458 | ListTrim(pArray,startIndex,endIndex,CountName) | 
|---|
| 459 | ;"SCOPE: PUBLIC | 
|---|
| 460 | ;"Purpose: Take a list with numeric (integer) ordering, and trim (kill) entry | 
|---|
| 461 | ;"         items startIndex...endIndex | 
|---|
| 462 | ;"Input: pArray -- PASS BY NAME.  The array to trim | 
|---|
| 463 | ;"       startIndex -- the first index item to kill.  Default=1 | 
|---|
| 464 | ;"       endIndex -- the last index item to kill. Default=1 | 
|---|
| 465 | ;"       CountName -- OPTIONAL.  The name of a node that includes the | 
|---|
| 466 | ;"                  final count of remaining nodes.  Default is "COUNT" | 
|---|
| 467 | ;"Output:  Array items will be killed. Also, a node with the resulting count | 
|---|
| 468 | ;"         of remaining items will be created, with name of CountName.  e.g. | 
|---|
| 469 | ;"         INPUT:  startIndex=1, endIndex=4 | 
|---|
| 470 | ;"               @pArray@(2)="grape" | 
|---|
| 471 | ;"               @pArray@(3)="orange" | 
|---|
| 472 | ;"               @pArray@(5)="apple" | 
|---|
| 473 | ;"               @pArray@(7)="pear" | 
|---|
| 474 | ;"               @pArray@(9)="peach" | 
|---|
| 475 | ;" | 
|---|
| 476 | ;"         OUTPUT: | 
|---|
| 477 | ;"               @pArray@(5)="apple" | 
|---|
| 478 | ;"               @pArray@(7)="pear" | 
|---|
| 479 | ;"               @pArray@(9)="peach" | 
|---|
| 480 | ;"               @pArray@("COUNT")=3 | 
|---|
| 481 |  | 
|---|
| 482 | set startIndex=$get(startIndex,1) | 
|---|
| 483 | set endIndex=$get(endIndex,1) | 
|---|
| 484 | set CountName=$get(CountName,"COUNT") | 
|---|
| 485 | kill @pArray@(CountName) | 
|---|
| 486 | new i for i=startIndex:1:endIndex kill @pArray@(i) | 
|---|
| 487 | do ListPack(pArray) | 
|---|
| 488 | set @pArray@(CountName)=$$ListCt(pArray) | 
|---|
| 489 | quit | 
|---|
| 490 |  | 
|---|
| 491 |  | 
|---|
| 492 | ListAdd(pArray,index,value) | 
|---|
| 493 | ;"SCOPE: PUBLIC | 
|---|
| 494 | ;"Purpose: To take a simple list and add to end of ist | 
|---|
| 495 | ;"      e.g. Array("Apple")=75 | 
|---|
| 496 | ;"            Array("Pear")=19 | 
|---|
| 497 | ;" | 
|---|
| 498 | ;"        do ListAdd("Array","Grape",12)   --> | 
|---|
| 499 | ;" | 
|---|
| 500 | ;"      e.g. Array("Apple")=75 | 
|---|
| 501 | ;"            Array("Pear")=19 | 
|---|
| 502 | ;"            Array("Grape")=12 | 
|---|
| 503 |  | 
|---|
| 504 | ;"Note: function creation aborted, because there is no intrinsic ordering in arrays.  I.e. the above would actually | 
|---|
| 505 | ;"      be in this order, as returned by $order(): | 
|---|
| 506 | ;"      e.g. Array("Apple")=75 | 
|---|
| 507 | ;"            Array("Grape")=12        <-- "G" comes before "P" alphabetically | 
|---|
| 508 | ;"            Array("Pear")=19 | 
|---|
| 509 |  | 
|---|
| 510 | ;"I'll leave this here as a reminder to myself next time. | 
|---|
| 511 |  | 
|---|
| 512 | quit | 
|---|
| 513 |  | 
|---|
| 514 |  | 
|---|
| 515 | ListAnd(pArray1,pArray2,pResult) | 
|---|
| 516 | ;"Purpose: To take two lists, and create a third list that has only those entries that | 
|---|
| 517 | ;"      exist in Array1 AND Array2 | 
|---|
| 518 | ;"Input: pArray1 : NAME OF array for list 1 | 
|---|
| 519 | ;"       pArray2 : NAME OF array for list 2 | 
|---|
| 520 | ;"       pResult : NAME OF array to results -- any preexisting entries will be killed | 
|---|
| 521 | ;"Note: only TOP LEVEL nodes are considered, and *value* for pArray1 use for combined value | 
|---|
| 522 | ;"E.g. of Use | 
|---|
| 523 | ;"      @pArray1@("cat")="feline" | 
|---|
| 524 | ;"      @pArray1@("dog")="canine" | 
|---|
| 525 | ;"      @pArray1@("horse")="equinine" | 
|---|
| 526 | ;"      @pArray1@("bird")="avian" | 
|---|
| 527 | ;"      @pArray1@("bird","weight")=12  <--- will be ignored, not a top level node | 
|---|
| 528 | ;" | 
|---|
| 529 | ;"      @pArray2@("hog")="porcine" | 
|---|
| 530 | ;"      @pArray2@("horse")="equinine" | 
|---|
| 531 | ;"      @pArray2@("cow")="bovine" | 
|---|
| 532 | ;"      @pArray2@("bird")="flier"  <----- note different value for key="bird" | 
|---|
| 533 | ;" | 
|---|
| 534 | ;"      resulting list: | 
|---|
| 535 | ;"      @pResult@("horse")="equinine" | 
|---|
| 536 | ;"      @pResult@("bird")="avian"  <-- note value from pArray1 used. | 
|---|
| 537 |  | 
|---|
| 538 | new Result | 
|---|
| 539 |  | 
|---|
| 540 | new i set i=$order(@pArray1@("")) | 
|---|
| 541 | if i'="" for  do  quit:(i="") | 
|---|
| 542 | . if $data(@pArray2@(i))#10 do | 
|---|
| 543 | . . set Result(i)=$get(@pArray1@(i)) | 
|---|
| 544 | . set i=$order(@pArray1@(i)) | 
|---|
| 545 |  | 
|---|
| 546 | kill @pResult | 
|---|
| 547 | merge @pResult=Result | 
|---|
| 548 |  | 
|---|
| 549 | quit | 
|---|
| 550 |  | 
|---|
| 551 |  | 
|---|
| 552 | ListNot(pArray1,pArray2,Verbose) | 
|---|
| 553 | ;"Purpose: To take two lists, and remove all entries from list 2 from list 1 | 
|---|
| 554 | ;"      exist in Array1 NOT Array2 | 
|---|
| 555 | ;"Input: pArray1 : NAME OF array for list 1 | 
|---|
| 556 | ;"       pArray2 : NAME OF array for list 2 | 
|---|
| 557 | ;"       Verbose: OPTIONAL.  if 1 then verbose output, progress bar etc. | 
|---|
| 558 |  | 
|---|
| 559 | ;"Note: only TOP LEVEL nodes are considered, and | 
|---|
| 560 | ;"       *value* for pArray1 use for combined value | 
|---|
| 561 |  | 
|---|
| 562 | ;"E.g. of Use | 
|---|
| 563 | ;"     list 1: | 
|---|
| 564 | ;"     @pArray1@("cat")="feline" | 
|---|
| 565 | ;"     @pArray1@("dog")="canine" | 
|---|
| 566 | ;"     @pArray1@("horse")="equinine" | 
|---|
| 567 | ;"     @pArray1@("bird")="avian" | 
|---|
| 568 | ;"     @pArray1@("bird","weight")=12  <--- will be ignored, not a top level node | 
|---|
| 569 | ;" | 
|---|
| 570 | ;"     list 2: | 
|---|
| 571 | ;"     @pArray1@("cat")="feline" | 
|---|
| 572 | ;"     @pArray1@("horse")="equinine" | 
|---|
| 573 | ;" | 
|---|
| 574 | ;"     resulting list: | 
|---|
| 575 | ;"     @pArray1@("dog")="canine" | 
|---|
| 576 | ;"     @pArray1@("bird")="avian" | 
|---|
| 577 | ;"     @pArray1@("bird","weight")=12 | 
|---|
| 578 | ;" | 
|---|
| 579 |  | 
|---|
| 580 | new Itr,index | 
|---|
| 581 | set index=$$ItrAInit^TMGITR(pArray2,.Itr) | 
|---|
| 582 | if Verbose=1 do PrepProgress^TMGITR(.Itr,20,1,"index") | 
|---|
| 583 | if index'="" for  do  quit:($$ItrANext^TMGITR(.Itr,.index)="") | 
|---|
| 584 | . kill @pArray1@(i) | 
|---|
| 585 |  | 
|---|
| 586 | quit | 
|---|
| 587 |  | 
|---|
| 588 |  | 
|---|
| 589 | ;"Note: Sometime, compare this function to $$DATE^TIULS ... I didn't know about this function before! | 
|---|
| 590 | DTFormat(FMDate,format,Array) | 
|---|
| 591 | ;"SCOPE: PUBLIC | 
|---|
| 592 | ;"Purpose: to allow custom formating of fileman dates in to text equivalents | 
|---|
| 593 | ;"Input:   FMDate -- this is the date to work on, in Fileman Format | 
|---|
| 594 | ;"         format -- a formating string with codes as follows. | 
|---|
| 595 | ;"                yy -- 2 digit year | 
|---|
| 596 | ;"                yyyy --  4 digit year | 
|---|
| 597 | ;"                m - month number without a leading 0. | 
|---|
| 598 | ;"                mm -- 2 digit month number (01-12) | 
|---|
| 599 | ;"                mmm - abreviated months (Jan,Feb,Mar etc.) | 
|---|
| 600 | ;"                mmmm -- full names of months (January,February,March etc) | 
|---|
| 601 | ;"                d -- the number of the day of the month (1-31) without a leading 0 | 
|---|
| 602 | ;"                dd -- 2 digit number of the day of the month | 
|---|
| 603 | ;"                w -- the numeric day of the week (1-7) | 
|---|
| 604 | ;"                ww -- abreviated day of week (Mon,Tue,Wed) | 
|---|
| 605 | ;"                www -- day of week (Monday,Tuesday,Wednesday) | 
|---|
| 606 | ;"                h -- the number of the hour without a leading 0 (1-23) 24-hr clock mode | 
|---|
| 607 | ;"                hh -- 2 digit number of the hour.  24-hr clock mode | 
|---|
| 608 | ;"                H -- the number of the hour without a leading 0 (1-12) 12-hr clock mode | 
|---|
| 609 | ;"                HH -- 2 digit number of the hour.  12-hr clock mode | 
|---|
| 610 | ;"                # -- will display 'am' for hours 1-12 and 'pm' for hours 13-24 | 
|---|
| 611 | ;"                M - the number of minutes with out a leading 0 | 
|---|
| 612 | ;"                MM -- a 2 digit display of minutes | 
|---|
| 613 | ;"                s - the number of seconds without a leading 0 | 
|---|
| 614 | ;"                ss -- a 2 digit display of number of seconds. | 
|---|
| 615 | ;"                allowed punctuation symbols--   ' ' : , / @ .;- (space, colon, comma, forward slash, at symbol,semicolon,period,hyphen) | 
|---|
| 616 | ;"                'text' is included as is, even if it is same as a formatting code | 
|---|
| 617 | ;"                Other unexpected text will be ignored | 
|---|
| 618 | ;" | 
|---|
| 619 | ;"                If a date value of 0 is found for a code, that code is ignored (except for min/sec) | 
|---|
| 620 | ;" | 
|---|
| 621 | ;"                Examples:  with FMDate=3050215.183000  (i.e. Feb 5, 2005 @ 18:30  0 sec) | 
|---|
| 622 | ;"                "mmmm d,yyyy" --> "February 5,2005" | 
|---|
| 623 | ;"                "mm d,yyyy" --> "Feb 5,2005" | 
|---|
| 624 | ;"                "'Exactly' H:MM # 'on' mm/dd/yy" --> "Exactly 6:30 pm on 02/05/05" | 
|---|
| 625 | ;"                "mm/dd/yyyy" --> "02/05/2005" | 
|---|
| 626 | ;" | 
|---|
| 627 | ;"         Array -- OPTIONAL, if supplied, SHOULD BE PASSED BY REFERENCE | 
|---|
| 628 | ;"              The array will be filled with data as follows: | 
|---|
| 629 | ;"              Array(Token)=value for that token  (ignores codes such as '/',':' ect) | 
|---|
| 630 |  | 
|---|
| 631 | ;"Output: Text of date, as specified by above | 
|---|
| 632 |  | 
|---|
| 633 | new result set result="" | 
|---|
| 634 | new Token set Token="" | 
|---|
| 635 | new LastToken set LastToken="" | 
|---|
| 636 | new ch set ch="" | 
|---|
| 637 | new LastCh set LastCh="" | 
|---|
| 638 | new InStr set InStr=0 | 
|---|
| 639 | new done set done=0 | 
|---|
| 640 | new i | 
|---|
| 641 |  | 
|---|
| 642 | if $get(format)="" goto FDTDone | 
|---|
| 643 | if +$get(FMDate)=0 goto FDTDone | 
|---|
| 644 |  | 
|---|
| 645 | for i=1:1:$length(format) do  quit:done | 
|---|
| 646 | . set LastCh=ch | 
|---|
| 647 | . set ch=$extract(format,i)   ;"get next char of format string. | 
|---|
| 648 | . if (ch'=LastCh)&(LastCh'="")&(InStr=0) do ProcessToken(FMDate,.Token,.result,.Array) | 
|---|
| 649 | . set Token=Token_ch | 
|---|
| 650 | . if ch="'" do  quit | 
|---|
| 651 | . . if InStr do ProcessToken(FMDate,.Token,.result) | 
|---|
| 652 | . . set InStr='InStr  ;"toggle In-String mode | 
|---|
| 653 | . if (i=$length(format)) do ProcessToken(FMDate,.Token,.result,.Array) | 
|---|
| 654 |  | 
|---|
| 655 | FDTDone | 
|---|
| 656 | quit result | 
|---|
| 657 |  | 
|---|
| 658 |  | 
|---|
| 659 | ProcessToken(FMDate,Token,Output,Array) | 
|---|
| 660 | ;"SCOPE: PRIVATE | 
|---|
| 661 | ;"Purpose: To take tokens and build output following rules specified by DTFormat) | 
|---|
| 662 | ;"Input: FMDate -- the date to work with | 
|---|
| 663 | ;"          Token -- SHOULD BE PASSED BY REFERENCE.  The code as oulined in DTFormat | 
|---|
| 664 | ;"          Output -- SHOULD BE PASSED BY REFERENCE. The cumulative output | 
|---|
| 665 | ;"          Array -- OPTIONAL, if supplied, SHOULD BE PASSED BY REFERENCE | 
|---|
| 666 | ;"              The array will be filled with data as follows: | 
|---|
| 667 | ;"              Array(Token)=value for that token  (ignores codes such as '/') | 
|---|
| 668 |  | 
|---|
| 669 |  | 
|---|
| 670 | if $extract(Token,1,1)="'" do  goto PTDone | 
|---|
| 671 | . new Str set Str=$extract(Token,2,$length(Token)-1) | 
|---|
| 672 | . set Output=Output_Str | 
|---|
| 673 |  | 
|---|
| 674 | if Token=" " set Output=Output_Token goto PTDone | 
|---|
| 675 | if Token="." set Output=Output_Token goto PTDone | 
|---|
| 676 | if Token=":" set Output=Output_Token goto PTDone | 
|---|
| 677 | if Token="/" set Output=Output_Token goto PTDone | 
|---|
| 678 | if Token=";" set Output=Output_Token goto PTDone | 
|---|
| 679 | if Token="," set Output=Output_Token goto PTDone | 
|---|
| 680 | if Token="-" set Output=Output_Token goto PTDone | 
|---|
| 681 | if Token="@" set Output=Output_Token goto PTDone | 
|---|
| 682 |  | 
|---|
| 683 | if Token="yy" do  goto PTDone | 
|---|
| 684 | . new Year set Year=+$extract(FMDate,1,3) | 
|---|
| 685 | . if Year=0 quit | 
|---|
| 686 | . set Year=+$extract(FMDate,2,3) | 
|---|
| 687 | . if Year<10 set Year="0"_Year | 
|---|
| 688 | . set Output=Output_Year | 
|---|
| 689 | . set Array(Token)=Year; | 
|---|
| 690 |  | 
|---|
| 691 | if Token="yyyy" do  goto PTDone | 
|---|
| 692 | . new Year set Year=+$extract(FMDate,1,3) | 
|---|
| 693 | . if Year>0 do | 
|---|
| 694 | . . set Year=Year+1700 | 
|---|
| 695 | . . set Output=Output_Year | 
|---|
| 696 | . . set Array(Token)=Year | 
|---|
| 697 |  | 
|---|
| 698 | if Token="m" do  goto PTDone | 
|---|
| 699 | . new Month set Month=+$extract(FMDate,4,5) | 
|---|
| 700 | . if Month>0 do | 
|---|
| 701 | . . set Output=Output_Month | 
|---|
| 702 | . . set Array(Token)=Month | 
|---|
| 703 |  | 
|---|
| 704 | if Token="mm" do  goto PTDone | 
|---|
| 705 | . new Month set Month=+$extract(FMDate,4,5) | 
|---|
| 706 | . if Month=0 quit | 
|---|
| 707 | . if Month<10 set Month="0"_Month | 
|---|
| 708 | . set Output=Output_Month | 
|---|
| 709 | . set Array(Token)=Month | 
|---|
| 710 |  | 
|---|
| 711 | if Token="mmm" do  goto PTDone | 
|---|
| 712 | . new Month set Month=+$extract(FMDate,4,5) | 
|---|
| 713 | . if Month=0 quit | 
|---|
| 714 | . else  if Month=1 set Month="Jan" | 
|---|
| 715 | . else  if Month=2 set Month="Feb" | 
|---|
| 716 | . else  if Month=3 set Month="Mar" | 
|---|
| 717 | . else  if Month=4 set Month="Apr" | 
|---|
| 718 | . else  if Month=5 set Month="May" | 
|---|
| 719 | . else  if Month=6 set Month="Jun" | 
|---|
| 720 | . else  if Month=7 set Month="Jul" | 
|---|
| 721 | . else  if Month=8 set Month="Aug" | 
|---|
| 722 | . else  if Month=9 set Month="Sept" | 
|---|
| 723 | . else  if Month=10 set Month="Oct" | 
|---|
| 724 | . else  if Month=11 set Month="Nov" | 
|---|
| 725 | . else  if Month=12 set Month="Dec" | 
|---|
| 726 | . if +Month=0 do | 
|---|
| 727 | . . set Output=Output_Month | 
|---|
| 728 | . . set Array(Token)=Month | 
|---|
| 729 |  | 
|---|
| 730 | if Token="mmmm" do  goto PTDone | 
|---|
| 731 | . new Month set Month=+$extract(FMDate,4,5) | 
|---|
| 732 | . if Month=0 quit | 
|---|
| 733 | . else  if Month=1 set Month="January" | 
|---|
| 734 | . else  if Month=2 set Month="February" | 
|---|
| 735 | . else  if Month=3 set Month="March" | 
|---|
| 736 | . else  if Month=4 set Month="April" | 
|---|
| 737 | . else  if Month=5 set Month="May" | 
|---|
| 738 | . else  if Month=6 set Month="June" | 
|---|
| 739 | . else  if Month=7 set Month="July" | 
|---|
| 740 | . else  if Month=8 set Month="August" | 
|---|
| 741 | . else  if Month=9 set Month="September" | 
|---|
| 742 | . else  if Month=10 set Month="October" | 
|---|
| 743 | . else  if Month=11 set Month="November" | 
|---|
| 744 | . else  if Month=12 set Month="December" | 
|---|
| 745 | . else  if +Month=0 do | 
|---|
| 746 | . . set Output=Output_Month | 
|---|
| 747 | . . set Array(Token)=Month | 
|---|
| 748 |  | 
|---|
| 749 | if Token="d" do  goto PTDone | 
|---|
| 750 | . new Day set Day=+$extract(FMDate,6,7) | 
|---|
| 751 | . if Day>0 do | 
|---|
| 752 | . . set Output=Output_Day | 
|---|
| 753 | . . set Array(Token)=Day | 
|---|
| 754 |  | 
|---|
| 755 | if Token="dd" do  goto PTDone | 
|---|
| 756 | . new Day set Day=+$extract(FMDate,6,7) | 
|---|
| 757 | . if Day=0 quit | 
|---|
| 758 | . if Day<10 set Day="0"_Day | 
|---|
| 759 | . set Output=Output_Day | 
|---|
| 760 | . set Array(Token)=Day | 
|---|
| 761 |  | 
|---|
| 762 | if Token="w" do  goto PTDone | 
|---|
| 763 | . new DOW set DOW=$$DOW^XLFDT(FMDate,1) | 
|---|
| 764 | . if DOW>0 do | 
|---|
| 765 | . . set Output=Output_DOW | 
|---|
| 766 | . . set Array(Token)=DOW | 
|---|
| 767 |  | 
|---|
| 768 | if Token="ww" do  goto PTDone | 
|---|
| 769 | . new DOW set DOW=$$DOW^XLFDT(FMDate,1) | 
|---|
| 770 | . if (DOW<0)!(DOW>6) quit | 
|---|
| 771 | . if DOW=0 set DOW="Sun" | 
|---|
| 772 | . if DOW=1 set DOW="Mon" | 
|---|
| 773 | . if DOW=2 set DOW="Tue" | 
|---|
| 774 | . if DOW=3 set DOW="Wed" | 
|---|
| 775 | . if DOW=4 set DOW="Thur" | 
|---|
| 776 | . if DOW=5 set DOW="Fri" | 
|---|
| 777 | . if DOW=6 set DOW="Sat" | 
|---|
| 778 | . set Output=Output_DOW | 
|---|
| 779 | . set Array(Token)=DOW | 
|---|
| 780 |  | 
|---|
| 781 | if Token="www" do  goto PTDone | 
|---|
| 782 | . new DOW set DOW=$$DOW^XLFDT(FMDate) | 
|---|
| 783 | . if DOW'="day" do | 
|---|
| 784 | . . set Output=Output_DOW | 
|---|
| 785 | . . set Array(Token)=DOW | 
|---|
| 786 |  | 
|---|
| 787 | if Token="h" do  goto PTDone | 
|---|
| 788 | . new Hour set Hour=+$extract(FMDate,9,10) | 
|---|
| 789 | . if Hour>0 do | 
|---|
| 790 | . . set Output=Output_Hour | 
|---|
| 791 | . . set Array(Token)=Hour | 
|---|
| 792 |  | 
|---|
| 793 | if Token="hh" do  goto PTDone | 
|---|
| 794 | . new Hour set Hour=+$extract(FMDate,9,10) | 
|---|
| 795 | . if Hour=0 quit | 
|---|
| 796 | . if Hour<10 set Hour="0"_Hour | 
|---|
| 797 | . set Output=Output_Hour | 
|---|
| 798 | . set Array(Token)=Hour | 
|---|
| 799 |  | 
|---|
| 800 | if Token="H" do  goto PTDone | 
|---|
| 801 | . new Hour set Hour=+$extract(FMDate,9,10) | 
|---|
| 802 | . if Hour>12 set Hour=Hour-12 | 
|---|
| 803 | . if Hour>0 do | 
|---|
| 804 | . . set Output=Output_Hour | 
|---|
| 805 | . . set Array(Token)=Hour | 
|---|
| 806 |  | 
|---|
| 807 | if Token="HH" do  goto PTDone | 
|---|
| 808 | . new Hour set Hour=+$extract(FMDate,9,10) | 
|---|
| 809 | . if Hour=0 quit | 
|---|
| 810 | . if Hour>12 set Hour=Hour-12 | 
|---|
| 811 | . if Hour<10 set Hour="0"_Hour | 
|---|
| 812 | . set Output=Output_Hour | 
|---|
| 813 | . set Array(Token)=Hour | 
|---|
| 814 |  | 
|---|
| 815 | if Token="#" do  goto PTDone | 
|---|
| 816 | . new Hour set Hour=+$extract(FMDate,9,10) | 
|---|
| 817 | . new code | 
|---|
| 818 | . if Hour=0 quit | 
|---|
| 819 | . if Hour>12 set code="pm" | 
|---|
| 820 | . else  set code="am" | 
|---|
| 821 | . set Output=Output_code | 
|---|
| 822 | . set Array(Token)=code | 
|---|
| 823 |  | 
|---|
| 824 | new Min set Min=+$extract(FMDate,11,12) | 
|---|
| 825 |  | 
|---|
| 826 | if Token="M" do  goto PTDone | 
|---|
| 827 | . new Min set Min=+$extract(FMDate,11,12) | 
|---|
| 828 | . set Output=Output_Min | 
|---|
| 829 | . set Array(Token)=Min | 
|---|
| 830 |  | 
|---|
| 831 | if Token="MM" do  goto PTDone | 
|---|
| 832 | . new Min set Min=+$extract(FMDate,11,12) | 
|---|
| 833 | . if Min<10 set Min="0"_Min | 
|---|
| 834 | . set Output=Output_Min | 
|---|
| 835 | . set Array(Token)=Min | 
|---|
| 836 |  | 
|---|
| 837 | if Token="s" do  goto PTDone | 
|---|
| 838 | . new Sec set Sec=+$extract(FMDate,13,14) | 
|---|
| 839 | . set Output=Output_Sec | 
|---|
| 840 | . set Array(Token)=Sec | 
|---|
| 841 |  | 
|---|
| 842 | if Token="ss" do  goto PTDone | 
|---|
| 843 | . new Sec set Sec=+$extract(FMDate,13,14) | 
|---|
| 844 | . if Sec<10 set Sec="0"_Sec | 
|---|
| 845 | . set Output=Output_Sec | 
|---|
| 846 | . set Array(Token)=Sec | 
|---|
| 847 |  | 
|---|
| 848 | PTDone | 
|---|
| 849 | set Token="" | 
|---|
| 850 | quit | 
|---|
| 851 |  | 
|---|
| 852 |  | 
|---|
| 853 |  | 
|---|
| 854 |  | 
|---|
| 855 | CompDOB(DOB1,DOB2) | 
|---|
| 856 | ;"Purpose: to compare two DOB and return if they match, or are similar | 
|---|
| 857 | ;"Input: DOB1,DOB2 -- the two values to compare (in external format) | 
|---|
| 858 | ;"Result: 0 - no similarity or equality | 
|---|
| 859 | ;"        0.25  - doubt similarity | 
|---|
| 860 | ;"        0.50  - possible similarity | 
|---|
| 861 | ;"        0.75  - probable similarity | 
|---|
| 862 | ;"        1 - exact match | 
|---|
| 863 | ;"Note: I made this function because during lookups, I would get failures with data such as: | 
|---|
| 864 | ;"      WILLIAM,JOHN G JR  05-21-60 | 
|---|
| 865 | ;"      WILLIAM,JOHN G JR  05-11-60   <-- date differs by one digit. | 
|---|
| 866 | ;"Rules for comparision | 
|---|
| 867 | ;"      if dates differ by 1 digit --> score of 0.75 | 
|---|
| 868 | ;"      if dates differ by an absolute difference of < 1 months   --> 0.75 | 
|---|
| 869 | ;"      if dates differ by an absolute difference of < 6 months   --> 0.50 | 
|---|
| 870 | ;"      if dates differ by an absolute difference of < 1 year   --> 0.25 | 
|---|
| 871 | ;"      if dates differ by 2 digits --> 0.25 | 
|---|
| 872 |  | 
|---|
| 873 | new DT1,DT2 | 
|---|
| 874 | new result set result=0 | 
|---|
| 875 |  | 
|---|
| 876 | new %DT | 
|---|
| 877 | set X=DOB1 do ^%DT set DT1=Y   ;"convert into internal format to avoid format snafu's | 
|---|
| 878 | set X=DOB2 do ^%DT set DT2=Y | 
|---|
| 879 |  | 
|---|
| 880 | new DT1array,DT2array | 
|---|
| 881 | new temp | 
|---|
| 882 | if DT1=DT2 set result=1 goto CDOBDone | 
|---|
| 883 |  | 
|---|
| 884 | set temp=$$DTFormat^TMGMISC(DT1,"mm/dd/yy",.DT1array) ;"parse date parts into array. | 
|---|
| 885 | set temp=$$DTFormat^TMGMISC(DT2,"mm/dd/yy",.DT2array) | 
|---|
| 886 |  | 
|---|
| 887 | ;"Compare digits | 
|---|
| 888 | new NumDif set NumDif=0 | 
|---|
| 889 | new dg1,dg2 | 
|---|
| 890 |  | 
|---|
| 891 | set dg1=$extract($get(DT1array("dd")),1,1)  set dg2=$extract($get(DT2array("dd")),1,1) | 
|---|
| 892 | if dg1'=dg2 set NumDif=NumDif+1 | 
|---|
| 893 | set dg1=$extract($get(DT1array("dd")),2,2)  set dg2=$extract($get(DT2array("dd")),2,2) | 
|---|
| 894 | if dg1'=dg2 set NumDif=NumDif+1 | 
|---|
| 895 |  | 
|---|
| 896 | set dg1=$extract($get(DT1array("mm")),1,1)  set dg2=$extract($get(DT2array("mm")),1,1) | 
|---|
| 897 | if dg1'=dg2 set NumDif=NumDif+1 | 
|---|
| 898 | set dg1=$extract($get(DT1array("mm")),2,2)  set dg2=$extract($get(DT2array("mm")),2,2) | 
|---|
| 899 | if dg1'=dg2 set NumDif=NumDif+1 | 
|---|
| 900 |  | 
|---|
| 901 | set dg1=$extract($get(DT1array("yy")),1,1)  set dg2=$extract($get(DT2array("yy")),1,1) | 
|---|
| 902 | if dg1'=dg2 set NumDif=NumDif+1 | 
|---|
| 903 | set dg1=$extract($get(DT1array("yy")),2,2)  set dg2=$extract($get(DT2array("yy")),2,2) | 
|---|
| 904 | if dg1'=dg2 set NumDif=NumDif+1 | 
|---|
| 905 |  | 
|---|
| 906 | if NumDif=1 set result=0.75 goto CDOBDone | 
|---|
| 907 | if NumDif=2 set result=0.50 | 
|---|
| 908 |  | 
|---|
| 909 | ;"Compare absolute date | 
|---|
| 910 | new H1,H2,DateDif | 
|---|
| 911 | set H1=$$FMTH^XLFDT(DT1,1) | 
|---|
| 912 | set H2=$$FMTH^XLFDT(DT2,1) | 
|---|
| 913 | set DateDif=$$HDIFF^XLFDT(H1,H2,1) ;"1=results in 'days' | 
|---|
| 914 | if $$HDIFF^XLFDT(H2,H1)>DateDif set DateDif=$$HDIFF^XLFDT(H2,H1) | 
|---|
| 915 |  | 
|---|
| 916 | new score set score=0 | 
|---|
| 917 | if DateDif<30 set score=0.75 | 
|---|
| 918 | if DateDif<(30*6) set score=0.50 | 
|---|
| 919 | if DateDif<365 set score=0.25 | 
|---|
| 920 |  | 
|---|
| 921 | if score>result set result=score | 
|---|
| 922 |  | 
|---|
| 923 | CDOBDone | 
|---|
| 924 | quit result | 
|---|
| 925 |  | 
|---|
| 926 |  | 
|---|
| 927 |  | 
|---|
| 928 | BrowseBy(CompArray,ByTag) | 
|---|
| 929 | ;"Purpose: Allow a user to interact with dynamic text tree | 
|---|
| 930 | ;"              that will open and close nodes. | 
|---|
| 931 | ;"Input:        CompArray -- array to browse.  Should be in this format | 
|---|
| 932 | ;"                      CompArray("opening tag",a,b,c,d) | 
|---|
| 933 | ;"               ByTag -- the name to use in for "opening tag") | 
|---|
| 934 |  | 
|---|
| 935 | new aOpen set aOpen=0 | 
|---|
| 936 | new bOpen set bOpen=0 | 
|---|
| 937 | new cOpen set cOpen=0 | 
|---|
| 938 |  | 
|---|
| 939 | new done set done=0 | 
|---|
| 940 | new input | 
|---|
| 941 |  | 
|---|
| 942 | for  do  quit:(done=1) | 
|---|
| 943 | . do ShowBy(.CompArray,ByTag,aOpen,bOpen,cOpen) | 
|---|
| 944 | . read "Enter option:",input:$get(DTIME,3600),! | 
|---|
| 945 | . if input="" set input=0 | 
|---|
| 946 | . if +input>0 do | 
|---|
| 947 | . . if aOpen=0 do | 
|---|
| 948 | . . . set aOpen=input,bOpen=0,cOpen=0 | 
|---|
| 949 | . . else  if bOpen=0 do | 
|---|
| 950 | . . . set bOpen=input,cOpen=0 | 
|---|
| 951 | . . else  if cOpen=0 set cOpen=input | 
|---|
| 952 | . else  if input=0 do | 
|---|
| 953 | . . if cOpen'=0 set cOpen=0 quit | 
|---|
| 954 | . . if bOpen'=0 set bOpen=0 quit | 
|---|
| 955 | . . set aOpen=0 | 
|---|
| 956 | . else  if input="^" set done=1 | 
|---|
| 957 |  | 
|---|
| 958 | quit | 
|---|
| 959 |  | 
|---|
| 960 |  | 
|---|
| 961 | ShowBy(CompArray,ByTag,aOpen,bOpen,cOpen) | 
|---|
| 962 |  | 
|---|
| 963 | new a,b,c,d | 
|---|
| 964 | new acount set acount=0 | 
|---|
| 965 | new bcount set bcount=0 | 
|---|
| 966 | new ccount set ccount=0 | 
|---|
| 967 | new dcount set dcount=0 | 
|---|
| 968 |  | 
|---|
| 969 | write # | 
|---|
| 970 |  | 
|---|
| 971 | set a=$order(CompArray(ByTag,"")) | 
|---|
| 972 | if a'="" for  do  quit:(a="") | 
|---|
| 973 | . set acount=acount+1 | 
|---|
| 974 | . new nexta set nexta=$order(CompArray(ByTag,a)) | 
|---|
| 975 | . new Aindent | 
|---|
| 976 | . if (aOpen=0) do | 
|---|
| 977 | . . if acount<10 write "0" | 
|---|
| 978 | . . write acount,". " | 
|---|
| 979 | . else  write "... " | 
|---|
| 980 | . write a,! | 
|---|
| 981 | . set b=$order(CompArray(ByTag,a,"")) | 
|---|
| 982 | . if (aOpen=acount)&(b'="") for  do  quit:(b="") | 
|---|
| 983 | . . set bcount=bcount+1 | 
|---|
| 984 | . . new nextb set nextb=$order(CompArray(ByTag,a,b)) | 
|---|
| 985 | . . new Bindent | 
|---|
| 986 | . . write "    +--" | 
|---|
| 987 | . . if (bOpen=0) do | 
|---|
| 988 | . . . if bcount<10 write "0" | 
|---|
| 989 | . . . write bcount,". " | 
|---|
| 990 | . . else  write "... " | 
|---|
| 991 | . . write b,! | 
|---|
| 992 | . . if nextb'="" set Aindent="    |  " | 
|---|
| 993 | . . else  set Aindent="       " | 
|---|
| 994 | . . set c=$order(CompArray(ByTag,a,b,"")) | 
|---|
| 995 | . . if (bOpen=bcount)&(c'="") for  do  quit:(c="") | 
|---|
| 996 | . . . set ccount=ccount+1 | 
|---|
| 997 | . . . new nextc set nextc=$order(CompArray(ByTag,a,b,c)) | 
|---|
| 998 | . . . if nextc'="" set Bindent="    |  " | 
|---|
| 999 | . . . else  set Bindent="       " | 
|---|
| 1000 | . . . write Aindent,"    +--" | 
|---|
| 1001 | . . . if (cOpen=0) do | 
|---|
| 1002 | . . . . if ccount<10 write "0" | 
|---|
| 1003 | . . . . write ccount,". " | 
|---|
| 1004 | . . . else  write "... " | 
|---|
| 1005 | . . . write c,! | 
|---|
| 1006 | . . . set d=$order(CompArray(ByTag,a,b,c,"")) | 
|---|
| 1007 | . . . if (cOpen=ccount)&(d'="") for  do  quit:(d="") | 
|---|
| 1008 | . . . . set dcount=dcount+1 | 
|---|
| 1009 | . . . . write Aindent,Bindent,"    +-- " | 
|---|
| 1010 | . . . . if dcount<10 write "0" | 
|---|
| 1011 | . . . . write dcount,". " | 
|---|
| 1012 | . . . . write d,! | 
|---|
| 1013 | . . . . set d=$order(CompArray(ByTag,a,b,c,d)) | 
|---|
| 1014 | . . . set c=nextc | 
|---|
| 1015 | . . set b=nextb | 
|---|
| 1016 | . set a=nexta | 
|---|
| 1017 |  | 
|---|
| 1018 | SBDone | 
|---|
| 1019 | quit | 
|---|
| 1020 |  | 
|---|
| 1021 |  | 
|---|
| 1022 |  | 
|---|
| 1023 | CompName(Name1,Name2) | 
|---|
| 1024 | ;"Purpose: To compare two names, to see if they are the name, or compatible. | 
|---|
| 1025 | ;"              e.g. WILLIAMS,J BILL   vs. WILLAMS,JOHN BILL,  vs. WILLIAMS,JOHN B | 
|---|
| 1026 | ;"Input: Two names to compare | 
|---|
| 1027 | ;"Result:  0 --   if entries conflict | 
|---|
| 1028 | ;"         0.5 -- if entries are consistent (i.e. in example above) | 
|---|
| 1029 | ;"         1 --   if entries completely match | 
|---|
| 1030 | ;"Note: This function WILL IGNORE a suffix.  This is because | 
|---|
| 1031 | ;"              WILLIAM,BILL    5-1-1950 | 
|---|
| 1032 | ;"              WILLIAM,BILL SR 5-1-1950 | 
|---|
| 1033 | ;"      would be considered the same person (the date is the determining factor) | 
|---|
| 1034 | ;"Rules: Last names must completely match or --> 0 | 
|---|
| 1035 | ;"       If name is exactly the same, then --> 1 | 
|---|
| 1036 | ;"       Initial must be same as first letters in name (e.g. N vs. NEWTON) --> 0.5 | 
|---|
| 1037 |  | 
|---|
| 1038 | new result set result=1 | 
|---|
| 1039 |  | 
|---|
| 1040 | new NArray1,NArray2,TMGMsg | 
|---|
| 1041 |  | 
|---|
| 1042 | set Name1=$$FormatName(Name1,1) ;"should convert to standard format. | 
|---|
| 1043 | set Name2=$$FormatName(Name2,1) | 
|---|
| 1044 |  | 
|---|
| 1045 | do STDNAME^XLFNAME(.Name1,"C",.TMGMsg) | 
|---|
| 1046 | do STDNAME^XLFNAME(.Name1,"C",.TMGMsg) ;"Doing a second time will ensure Array not in initial format. | 
|---|
| 1047 |  | 
|---|
| 1048 | do STDNAME^XLFNAME(.Name2,"C",.TMGMsg) | 
|---|
| 1049 | do STDNAME^XLFNAME(.Name2,"C",.TMGMsg) ;"Doing a second time will ensure Array not in initial format. | 
|---|
| 1050 |  | 
|---|
| 1051 | if Name1=Name2 set result=1 goto CompNDone | 
|---|
| 1052 | if Name1("FAMILY")'=Name2("FAMILY") do  goto:(result=0) CompNDone | 
|---|
| 1053 | . if $$EN^XUA4A71(Name1("FAMILY"))'=$$EN^XUA4A71(Name2("FAMILY")) set result=0  ;"check soundex equality | 
|---|
| 1054 |  | 
|---|
| 1055 | if Name1("GIVEN")'=Name2("GIVEN") do | 
|---|
| 1056 | . if $$EN^XUA4A71(Name1("GIVEN"))=$$EN^XUA4A71(Name2("GIVEN")) quit   ;"check soundex equality | 
|---|
| 1057 | . new n1,n2 | 
|---|
| 1058 | . set n1=Name1("GIVEN") | 
|---|
| 1059 | . set n2=Name2("GIVEN") | 
|---|
| 1060 | . if $length(n2)<$length(n1) do   ;"ensure length n2>n1 | 
|---|
| 1061 | . . new temp set temp=n2 | 
|---|
| 1062 | . . set n2=n1,n1=temp | 
|---|
| 1063 | . if $extract(n2,1,$length(n1))=n1 set result=0.5 | 
|---|
| 1064 | . else  set result=0 | 
|---|
| 1065 | if result=0 goto CompNDone | 
|---|
| 1066 |  | 
|---|
| 1067 | if Name1("MIDDLE")'=Name2("MIDDLE") do | 
|---|
| 1068 | . if $$EN^XUA4A71(Name1("MIDDLE"))=$$EN^XUA4A71(Name2("MIDDLE")) quit   ;"check soundex equality | 
|---|
| 1069 | . new n1,n2 | 
|---|
| 1070 | . set n1=Name1("MIDDLE") | 
|---|
| 1071 | . set n2=Name2("MIDDLE") | 
|---|
| 1072 | . if $length(n2)<$length(n1) do   ;"ensure length n2>n1 | 
|---|
| 1073 | . . new temp set temp=n2 | 
|---|
| 1074 | . . set n2=n1,n1=temp | 
|---|
| 1075 | . if $extract(n2,1,$length(n1))=n1 set result=0.5 | 
|---|
| 1076 | . else  set result=0 | 
|---|
| 1077 | if result=0 goto CompNDone | 
|---|
| 1078 |  | 
|---|
| 1079 | CompNDone | 
|---|
| 1080 | quit result | 
|---|
| 1081 |  | 
|---|
| 1082 |  | 
|---|
| 1083 |  | 
|---|
| 1084 | FormatName(Name,CutTitle) | 
|---|
| 1085 | ;"Purpose:  To ensure patient name is properly formated. | 
|---|
| 1086 | ;"        i.e. John G. Doe --> DOE,JOHN G | 
|---|
| 1087 | ;"             John G. Doe III --> DOE,JOHN G III | 
|---|
| 1088 | ;"             John G. Doe,III --> DOE,JOHN G III | 
|---|
| 1089 | ;"           Doe,  John G --> DOE,JOHN G | 
|---|
| 1090 | ;"             Doe,John g.,III,  phd  --> DOE,JOHN G III PHD | 
|---|
| 1091 | ;"Input: Name -- the name to be reformated | 
|---|
| 1092 | ;"        CutTitle -- OPTIONAL -- if 1, then titles (e.g. MD, PhD etc) will be cut | 
|---|
| 1093 | ;"Results: returns properly formated name | 
|---|
| 1094 | ;"Note: If Name is passed by reference, it will be changed | 
|---|
| 1095 | ;"        Also, NO lookup is done in database to ensure name exists | 
|---|
| 1096 |  | 
|---|
| 1097 | ;"Note: this function malfunctioned on a patient with name like this: | 
|---|
| 1098 | ;"            JOHN A VAN DER BON --> BON,JOHN A VAN DER (should be VAN DER BON,JOHN A) | 
|---|
| 1099 | ;"      I don't have a quick for this right now... | 
|---|
| 1100 | ;"Also, Sue St. Clair --> CLAIR,SUE ST  this is also wrong. | 
|---|
| 1101 |  | 
|---|
| 1102 | ;"FYI: do STDNAME^XLFNAME(.NAME,FLAGS,.ERRARRAY) can also do standardization, | 
|---|
| 1103 | ;"      and also parse to component parts.  It specifically address the St. Clair issue. | 
|---|
| 1104 |  | 
|---|
| 1105 | if $get(TMGDEBUG)>0 do DebugEntry^TMGDEBUG(.DBIndent,"FormatName^TMGGDFN") | 
|---|
| 1106 |  | 
|---|
| 1107 | new NameArray | 
|---|
| 1108 | new MaxNode | 
|---|
| 1109 | new Suffix set Suffix="" | 
|---|
| 1110 | new i,s,lname | 
|---|
| 1111 | new fname set fname="" | 
|---|
| 1112 | new result set result="" | 
|---|
| 1113 | if $data(Name)#10=0 goto FormatNDone | 
|---|
| 1114 |  | 
|---|
| 1115 | if $get(TMGDEBUG)>0 do DebugMsg^TMGDEBUG(.DBIndent,"Person's name initially is: '",Name,"'") | 
|---|
| 1116 | set Name=$translate(Name,"*.","")  ;"cleans off any *'s or .'s from initials etc. | 
|---|
| 1117 | if Name[", " do | 
|---|
| 1118 | . new s1,s2 | 
|---|
| 1119 | . set s1=$piece(Name,", ",1) | 
|---|
| 1120 | . set s2=$piece(Name,", ",2) | 
|---|
| 1121 | . if $$IsTitle($$UP^XLFSTR(s2))&($get(CutTitle)=1) do | 
|---|
| 1122 | . . set Name=s1 | 
|---|
| 1123 | . else  do | 
|---|
| 1124 | . . set Name=s1_","_s2 | 
|---|
| 1125 | . ;"set Name=$translate(Name,", ",",") ;"Convert 'Doe, John'  into 'Doe,John' | 
|---|
| 1126 | set Name=$$UP^XLFSTR(Name)  ;"convert to upper case | 
|---|
| 1127 | if $get(TMGDEBUG)>0 do DebugMsg^TMGDEBUG(.DBIndent,"After translations, name is: '",Name,"'") | 
|---|
| 1128 | set result=$$FORMAT^DPTNAME(Name,3,30) ;"Convert to 'internal' format | 
|---|
| 1129 | if $get(TMGDEBUG)>0 do DebugMsg^TMGDEBUG(.DBIndent,"After $$FORMAT^DPTNAME, name is: '",result,"'") | 
|---|
| 1130 |  | 
|---|
| 1131 | ;"Now, test if FORMAT^DPTNAME caused empty name, i.e. | 
|---|
| 1132 | ;"   John G Doe --> ""  (it wanted Doe,John G) | 
|---|
| 1133 | set lname=$piece(result,",",2) | 
|---|
| 1134 | if $$IsTitle(lname)&($get(CutTitle)=1) do           ;"trim off title if not wanted. | 
|---|
| 1135 | . set result=$piece(result,",",1) | 
|---|
| 1136 | . set lname="" | 
|---|
| 1137 | if $$IsSuffix(lname)=1 do | 
|---|
| 1138 | . ;"Here we have 'JOHN DOE,III' --> must be changed to 'DOE,JOHN III' | 
|---|
| 1139 | . set Name=$translate(Name,","," ") ;"First change 'JOHN DOE,III' --> 'JOHN DOE III' | 
|---|
| 1140 | . set result=""  ;"signal need to rearrange letters. | 
|---|
| 1141 | if (result="")&(Name'[",") do | 
|---|
| 1142 | . set s=Name | 
|---|
| 1143 | . do CleaveToArray^TMGSTUTL(s," ",.NameArray,1) | 
|---|
| 1144 | . set MaxNode=+$get(NameArray("MAXNODE")) | 
|---|
| 1145 | . if MaxNode=0 quit | 
|---|
| 1146 | . if $get(CutTitle)=1 do | 
|---|
| 1147 | . . if $$IsTitle(NameArray(MaxNode)) do | 
|---|
| 1148 | . . . kill NameArray(MaxNode) | 
|---|
| 1149 | . . . set MaxNode=MaxNode-1 | 
|---|
| 1150 | . . . set NameArray("MAXNODE")=MaxNode | 
|---|
| 1151 | . set lname=NameArray(MaxNode) | 
|---|
| 1152 | . if ($$IsSuffix(lname)=1)!($$IsTitle(lname)) do | 
|---|
| 1153 | . . ;"Change JOHN G DOE III --> JOHN G III DOE (order change in array) | 
|---|
| 1154 | . . set lname=NameArray(MaxNode-1)  ;"i.e. DOE | 
|---|
| 1155 | . . set Suffix=NameArray(MaxNode)   ;"i.e. III | 
|---|
| 1156 | . . set NameArray(MaxNode)=lname | 
|---|
| 1157 | . . set NameArray(MaxNode-1)=Suffix | 
|---|
| 1158 | . set result=lname_"," | 
|---|
| 1159 | . for i=1:1:MaxNode-1 do | 
|---|
| 1160 | . . set result=result_NameArray(i)_" " | 
|---|
| 1161 |  | 
|---|
| 1162 | ;"convert potential 'DOE,JOHN G,III, PHD' --> 'DOE,JOHN G III PHD' | 
|---|
| 1163 | set lname=$piece(result,",",1) | 
|---|
| 1164 | set fname=$piece(result,",",2,99) | 
|---|
| 1165 | set fname=$translate(fname,","," ") | 
|---|
| 1166 | set result=lname_","_fname | 
|---|
| 1167 |  | 
|---|
| 1168 | set result=$$Trim^TMGSTUTL(result) | 
|---|
| 1169 |  | 
|---|
| 1170 | ;"One last run through, after all custom alterations made. | 
|---|
| 1171 | ;"convert potential 'DOE,JOHN G III    PHD' --> 'DOE,JOHN G III PHD' | 
|---|
| 1172 | set result=$$FORMAT^DPTNAME(result,3,30) ;"Convert to 'internal' format | 
|---|
| 1173 |  | 
|---|
| 1174 | FormatNDone | 
|---|
| 1175 | if $get(TMGDEBUG)>0 do DebugExit^TMGDEBUG(.DBIndent,"FormatName^TMGGDFN") | 
|---|
| 1176 | quit result | 
|---|
| 1177 |  | 
|---|
| 1178 |  | 
|---|
| 1179 | IsSuffix(s) | 
|---|
| 1180 | ;"Purpose: to return whether s is a suffix (i.e. I,II,Jr.,Sr. etc.) | 
|---|
| 1181 | ;"Input: s : the string to check | 
|---|
| 1182 | ;"Result 0 if NOT a suffix, 1 if IS a suffix. | 
|---|
| 1183 |  | 
|---|
| 1184 | new result set result=0 | 
|---|
| 1185 |  | 
|---|
| 1186 | if (s="I")!(s="II")!(s="III")!(s="JR")!(s="SR") set result=1 | 
|---|
| 1187 |  | 
|---|
| 1188 | quit result | 
|---|
| 1189 |  | 
|---|
| 1190 |  | 
|---|
| 1191 | IsTitle(s) | 
|---|
| 1192 | ;"Purpose: to return whether s is a title (i.e. MD,PHD,JD,DDS etc.) | 
|---|
| 1193 | ;"Input: s : the string to check | 
|---|
| 1194 | ;"Result 0 if NOT a suffix, 1 if IS a suffix. | 
|---|
| 1195 |  | 
|---|
| 1196 | new result set result=0 | 
|---|
| 1197 |  | 
|---|
| 1198 | if (s="MD")!(s="PHD")!(s="JD")!(s="DDS") set result=1 | 
|---|
| 1199 | if (s="FNP")!(s="GNP")!(s="NP")!(s="PA") set result=1 | 
|---|
| 1200 | if (s="RN")!(s="LPN") set result=1 | 
|---|
| 1201 |  | 
|---|
| 1202 | quit result | 
|---|
| 1203 |  | 
|---|
| 1204 |  | 
|---|
| 1205 |  | 
|---|
| 1206 | HEXCHR(V) | 
|---|
| 1207 | ;"Scope: PUBLIC | 
|---|
| 1208 | ;"Take one BYTE and return HEX Values | 
|---|
| 1209 | ;"(from Chris Richardson -- thanks!) | 
|---|
| 1210 | new NV,B1,B2 | 
|---|
| 1211 | set NV="0123456789ABCDEF" | 
|---|
| 1212 | set B1=(V#16)+1  ; "0 to 15 becomes 1 to 16 | 
|---|
| 1213 | set B2=(V\16)+1 | 
|---|
| 1214 | quit $E(NV,B2)_$E(NV,B1) | 
|---|
| 1215 |  | 
|---|
| 1216 |  | 
|---|
| 1217 | HEXCHR2(n,digits) | 
|---|
| 1218 | ;"SCOPE: PUBLIC | 
|---|
| 1219 | ;"Purpose: convert n to hex characters | 
|---|
| 1220 | ;"Input: n -- the number to convert | 
|---|
| 1221 | ;"         digits: (optional) number of digits in output.  Leading 0's padded to | 
|---|
| 1222 | ;"                      front of answer to set number of digits. | 
|---|
| 1223 | ;"                      e.g. if answer is "A", then | 
|---|
| 1224 | ;"                      2 -> mandates at least 2 digits ("0A") | 
|---|
| 1225 | ;"                      3->3 digits ("00A") | 
|---|
| 1226 | ;"Note: This function is not as fast as HEXCHR(V) | 
|---|
| 1227 |  | 
|---|
| 1228 | new lo | 
|---|
| 1229 | new result set result="" | 
|---|
| 1230 | new ch | 
|---|
| 1231 | set digits=$get(digits,1) | 
|---|
| 1232 |  | 
|---|
| 1233 | for  do  quit:(n=0) | 
|---|
| 1234 | . set lo=n#16 | 
|---|
| 1235 | . if (lo<10) set ch=+lo | 
|---|
| 1236 | . else  set ch=$char(55+lo) | 
|---|
| 1237 | . set result=ch_result | 
|---|
| 1238 | . set n=n\16 | 
|---|
| 1239 |  | 
|---|
| 1240 | if $length(result)<digits do | 
|---|
| 1241 | . new i | 
|---|
| 1242 | . for i=1:1:digits-$length(result) do | 
|---|
| 1243 | . . set result="0"_result | 
|---|
| 1244 |  | 
|---|
| 1245 | quit result | 
|---|
| 1246 |  | 
|---|
| 1247 | HEX2NUM(s) | 
|---|
| 1248 | ;"Scope: PUBLIC | 
|---|
| 1249 | ;"Purpose: to convert a string like this $10 --> 16 | 
|---|
| 1250 |  | 
|---|
| 1251 | new multiplier set multiplier=1 | 
|---|
| 1252 | new result set result=0 | 
|---|
| 1253 |  | 
|---|
| 1254 | if $extract(s,1)="$" set s=$extract(s,2,$length(s)) | 
|---|
| 1255 |  | 
|---|
| 1256 | for  do  quit:(s="") | 
|---|
| 1257 | . new sStart,sEnd,n | 
|---|
| 1258 | . set sStart=$extract(s,1,$length(s)-1) | 
|---|
| 1259 | . set sEnd=$extract(s,$length(s)) | 
|---|
| 1260 | . if +sEnd=sEnd set n=sEnd | 
|---|
| 1261 | . else  set n=($ascii(sEnd)-65)+16 | 
|---|
| 1262 | . set result=result+(n*multiplier) | 
|---|
| 1263 | . set multiplier=multiplier*16 | 
|---|
| 1264 | . set s=sStart | 
|---|
| 1265 |  | 
|---|
| 1266 | quit result | 
|---|
| 1267 |  | 
|---|
| 1268 |  | 
|---|
| 1269 | OR(a,b) | 
|---|
| 1270 | ;"Scope: PUBLIC | 
|---|
| 1271 | ;"Purpose: to perform a bitwise OR on operands a and b | 
|---|
| 1272 |  | 
|---|
| 1273 | new result set result=0 | 
|---|
| 1274 | new mult set mult=1 | 
|---|
| 1275 | for  do  quit:(a'>0)&(b'>0) | 
|---|
| 1276 | . set result=result+(((a#2)!(b#2))*mult) | 
|---|
| 1277 | . set a=a\2,b=b\2,mult=mult*2 | 
|---|
| 1278 |  | 
|---|
| 1279 | quit result | 
|---|
| 1280 |  | 
|---|
| 1281 |  | 
|---|
| 1282 | ParsePos(pos,label,offset,routine,dmod) | 
|---|
| 1283 | ;"Purpose: to convert a pos string (e.g. X+2^ROUTINE$DMOD) into componant parts | 
|---|
| 1284 | ;"Input: pos -- the string, as example above | 
|---|
| 1285 | ;"         label -- OUT PARAM, PASS BY REF, would return "x" | 
|---|
| 1286 | ;"         offset  -- OUT PARAM, PASS BY REF, would return "+2" | 
|---|
| 1287 | ;"         routine -- OUT PARAM, PASS BY REF, would return "ROUTINE" | 
|---|
| 1288 | ;"         dmod -- OUT PARAM, PASS BY REF, would return "DMOD" | 
|---|
| 1289 | ;"Results: none | 
|---|
| 1290 | ;"Note: results are shortened to 8 characters. | 
|---|
| 1291 |  | 
|---|
| 1292 | new s | 
|---|
| 1293 | set s=$get(pos) | 
|---|
| 1294 | set dmod=$piece(s,"$",1) ;"e.g. X+2^ROUTINE$DMOD-->X+2^ROUTINE | 
|---|
| 1295 | set routine=$piece(s,"^",2) | 
|---|
| 1296 | set routine=$extract(routine,1,8) | 
|---|
| 1297 | set label=$piece(s,"^",1) | 
|---|
| 1298 | set offset=$piece(label,"+",2) | 
|---|
| 1299 | set label=$piece(label,"+",1) | 
|---|
| 1300 | set label=$extract(label,1,8) | 
|---|
| 1301 |  | 
|---|
| 1302 | quit | 
|---|
| 1303 |  | 
|---|
| 1304 |  | 
|---|
| 1305 | ScanMod(Module,pArray) | 
|---|
| 1306 | ;"Purpose: To scan a module and find all the labels/entry points/Entry points | 
|---|
| 1307 | ;"Input: Module -- The name of the module, like "XGF" (not "XGF.m" or "^XGF") | 
|---|
| 1308 | ;"         pArray -- pointer to (NAME OF) array Will be filled like this | 
|---|
| 1309 | ;"              pArray(1,"TAG")="Label1" | 
|---|
| 1310 | ;"              pArray(1,"OFFSET")=1 | 
|---|
| 1311 | ;"              pArray(2,"TAG")="Label2" | 
|---|
| 1312 | ;"              pArray(2,"OFFSET")=9 | 
|---|
| 1313 | ;"              pArray(3,"TAG")="Label3"  etc. | 
|---|
| 1314 | ;"              pArray(3,"OFFSET")=15 | 
|---|
| 1315 | ;"              pArray("Label1")=1 | 
|---|
| 1316 | ;"              pArray("Label2")=2 | 
|---|
| 1317 | ;"              pArray("Label3")=3 | 
|---|
| 1318 | ;" | 
|---|
| 1319 | ;"              NOTE: there seems to be a problem if the passed pArray value is "pArray", | 
|---|
| 1320 | ;"                      so use another name. | 
|---|
| 1321 | ;" | 
|---|
| 1322 | ;"Output: Results are put into array | 
|---|
| 1323 | ;"Result: none | 
|---|
| 1324 |  | 
|---|
| 1325 | new smIdx set smIdx=1 | 
|---|
| 1326 | new LabelNum set LabelNum=0 | 
|---|
| 1327 | new smLine set smLine="" | 
|---|
| 1328 | if $get(Module)="" goto SMDone | 
|---|
| 1329 |  | 
|---|
| 1330 | for  do  quit:(smLine="") | 
|---|
| 1331 | . new smCh | 
|---|
| 1332 | . set smLine=$text(+smIdx^@Module) | 
|---|
| 1333 | . if smLine="" quit | 
|---|
| 1334 | . set smLine=$$Substitute^TMGSTUTL(smLine,$Char(9),"        ") ;"replace tabs for 8 spaces | 
|---|
| 1335 | . set smCh=$extract(smLine,1) | 
|---|
| 1336 | . if (smCh'=" ")&(smCh'=";") do | 
|---|
| 1337 | . . new label | 
|---|
| 1338 | . . set label=$piece(smLine," ",1) | 
|---|
| 1339 | . . set LabelNum=LabelNum+1 | 
|---|
| 1340 | . . set @pArray@(LabelNum,"TAG")=label | 
|---|
| 1341 | . . set @pArray@(LabelNum,"OFFSET")=smIdx | 
|---|
| 1342 | . . set @pArray@(label)=LabelNum | 
|---|
| 1343 | . set smIdx=smIdx+1 | 
|---|
| 1344 |  | 
|---|
| 1345 | SMDone | 
|---|
| 1346 | quit | 
|---|
| 1347 |  | 
|---|
| 1348 |  | 
|---|
| 1349 | ConvertPos(Pos,pArray) | 
|---|
| 1350 | ;"Purpose: to convert a text positioning line from one that is relative to the last tag/label, into | 
|---|
| 1351 | ;"              one that is relative to the start of the file | 
|---|
| 1352 | ;"              e.g. START+8^MYFUNCT --> +32^MYFUNCT | 
|---|
| 1353 | ;"Input: Pos -- a position, as returned from $ZPOS | 
|---|
| 1354 | ;"        pArray -- pointer to (name of).  Array holding  holding tag offsets | 
|---|
| 1355 | ;"              pArray will be in this format: | 
|---|
| 1356 | ;"              pArray("ModuleA",1,"TAG")="ALabel1" | 
|---|
| 1357 | ;"              pArray("ModuleA",1,"OFFSET")=1 | 
|---|
| 1358 | ;"              pArray("ModuleA",2,"TAG")="ALabel2" | 
|---|
| 1359 | ;"              pArray("ModuleA",2,"OFFSET")=9 | 
|---|
| 1360 | ;"              pArray("ModuleA","Label1")=1 | 
|---|
| 1361 | ;"              pArray("ModuleA","Label2")=2 | 
|---|
| 1362 | ;"              pArray("ModuleA","Label3")=3 | 
|---|
| 1363 | ;"              pArray("ModuleB",1,"TAG")="BLabel1" | 
|---|
| 1364 | ;"              pArray("ModuleB",1,"OFFSET")=4 | 
|---|
| 1365 | ;"              pArray("ModuleB",2,"TAG")="BLabel2" | 
|---|
| 1366 | ;"              pArray("ModuleB",2,"OFFSET")=23 | 
|---|
| 1367 | ;"              pArray("ModuleB","Label1")=1 | 
|---|
| 1368 | ;"              pArray("ModuleB","Label2")=2 | 
|---|
| 1369 | ;"              pArray("ModuleB","Label3")=3 | 
|---|
| 1370 | ;"            NOTE: -- if array passed is empty, then this function will call ScanModule to fill it | 
|---|
| 1371 | ;"Result: returns the new position line, relative to the start of the file/module | 
|---|
| 1372 | ;" | 
|---|
| 1373 |  | 
|---|
| 1374 | new cpS | 
|---|
| 1375 | new cpResult set cpResult="" | 
|---|
| 1376 | new cpRoutine,cpLabel,cpOffset | 
|---|
| 1377 |  | 
|---|
| 1378 | set cpS=$piece(Pos,"$",1)  ;"e.g. X+2^ROUTINE$DMOD-->X+2^ROUTINE | 
|---|
| 1379 | if cpS="" goto CPDone | 
|---|
| 1380 |  | 
|---|
| 1381 | set cpRoutine=$piece(cpS,"^",2) | 
|---|
| 1382 | if cpRoutine="" goto CPDone | 
|---|
| 1383 |  | 
|---|
| 1384 | set cpS=$piece(cpS,"^",1) | 
|---|
| 1385 | set cpOffset=+$piece(cpS,"+",2) | 
|---|
| 1386 | ;"if cpOffset="" set cpOffset=1 | 
|---|
| 1387 | ;"else  set cpOffset=+cpOffset | 
|---|
| 1388 | set cpLabel=$piece(cpS,"+",1) | 
|---|
| 1389 |  | 
|---|
| 1390 | if $data(@pArray@(cpRoutine))=0 do | 
|---|
| 1391 | . new p2Array set p2Array=$name(@pArray@(cpRoutine)) | 
|---|
| 1392 | . do ScanMod(cpRoutine,p2Array) | 
|---|
| 1393 |  | 
|---|
| 1394 | new cpIdx set cpIdx=+$get(@pArray@(cpRoutine,cpLabel)) | 
|---|
| 1395 | if cpIdx=0 goto CPDone | 
|---|
| 1396 | new cpGOffset set cpGOffset=@pArray@(cpRoutine,cpIdx,"OFFSET") | 
|---|
| 1397 | set cpResult="+"_+(cpGOffset+cpOffset)_"^"_cpRoutine | 
|---|
| 1398 |  | 
|---|
| 1399 | CPDone | 
|---|
| 1400 | quit cpResult | 
|---|
| 1401 |  | 
|---|
| 1402 |  | 
|---|
| 1403 |  | 
|---|
| 1404 |  | 
|---|
| 1405 | CompArray(pArray1,pArray2) | 
|---|
| 1406 | ;"Purpose: To return if two arrays are identical | 
|---|
| 1407 | ;"      Equality means that all nodes and values are present and equal | 
|---|
| 1408 | ;"Input: Array1 -- PASS BY NAME.  The *name of* the first array to be compared | 
|---|
| 1409 | ;"       Array1 -- PASS BY NAME.  The *name of* the second array to be compared | 
|---|
| 1410 | ;"Output: 1 if two are identical, 0 if not | 
|---|
| 1411 |  | 
|---|
| 1412 | new result set result=1 | 
|---|
| 1413 | new index1,index2 | 
|---|
| 1414 | set index1=$order(@pArray1@("")) | 
|---|
| 1415 | set index2=$order(@pArray2@("")) | 
|---|
| 1416 | if (index1="")!(index2="") set result=0 goto CADone | 
|---|
| 1417 | for  do  quit:(result=0)!(index1="")!(index2="") | 
|---|
| 1418 | . if index2'=index2 set result=0 quit | 
|---|
| 1419 | . if $get(@pArray1@(index1))'=$get(@pArray2@(index2)) set result=0 quit | 
|---|
| 1420 | . if ($data(@pArray1@(index1))'<10)!($data(@pArray2@(index2))'<10) do | 
|---|
| 1421 | . . set result=$$CompArray($name(@pArray1@(index1)),$name(@pArray2@(index2))) | 
|---|
| 1422 | . set index1=$order(@pArray1@(index1)) | 
|---|
| 1423 | . set index2=$order(@pArray2@(index2)) | 
|---|
| 1424 |  | 
|---|
| 1425 | CADone quit result | 
|---|
| 1426 |  | 
|---|
| 1427 |  | 
|---|
| 1428 |  | 
|---|
| 1429 | IterTemplate(Template,Prior) | 
|---|
| 1430 | ;"Purpose: To iterate through a SORT TEMPLATE (i.e. provide record numbers held in the template | 
|---|
| 1431 | ;"          one at a time.  For each time this function is called, one record number (IEN) is returned. | 
|---|
| 1432 | ;"Input: Template:  the IEN of an entry from file SORT TEMPLATE (file# .401) | 
|---|
| 1433 | ;"       Prior -- OPTIONAL (default is to return first record), an IEN as returned from this | 
|---|
| 1434 | ;"                      function during the last call. | 
|---|
| 1435 | ;"Result: Returns the next record found in list, occuring after Prior, or -1 if error or not found | 
|---|
| 1436 | ;"        Returns "" if end of list (no next record) | 
|---|
| 1437 |  | 
|---|
| 1438 | ;"Example of use:  This will list all records held in SORT TEMPLATE record# 809 | 
|---|
| 1439 | ;"  set IEN="" | 
|---|
| 1440 | ;"  for  s IEN=$$IterTemplate^TMGMISC(809,IEN) w IEN,! q:(+IEN'>0) | 
|---|
| 1441 |  | 
|---|
| 1442 | set Prior=$get(Prior) | 
|---|
| 1443 | set result=-1 | 
|---|
| 1444 | if +$get(Template)'>0 goto ItTDone | 
|---|
| 1445 |  | 
|---|
| 1446 | set result=$order(^DIBT(Template,1,Prior)) | 
|---|
| 1447 |  | 
|---|
| 1448 | ItTDone quit result | 
|---|
| 1449 |  | 
|---|
| 1450 | CtTemplate(Template) | 
|---|
| 1451 | ;"Purpose: To return the Count of IEN's stored in a SORT TEMPLATE | 
|---|
| 1452 | ;"Input: Template:  the IEN of an entry from file SORT TEMPLATE (file# .401) | 
|---|
| 1453 | ;"Result: Returns the count of records held | 
|---|
| 1454 |  | 
|---|
| 1455 | new name set name=$name(^DIBT(Template,1)) | 
|---|
| 1456 | quit $$ListCt(name) | 
|---|
| 1457 |  | 
|---|
| 1458 |  | 
|---|
| 1459 | NumPieces(s,delim,maxPoss) | 
|---|
| 1460 | ;"Purpose: to return the number of pieces in s, using delim as a delimiter | 
|---|
| 1461 | ;"Input: s -- the string to test | 
|---|
| 1462 | ;"       delim -- OPTIONAL -- the delimiter (e.g. ',' or ';' or ' ' etc), default=" " | 
|---|
| 1463 | ;"       maxPoss -- OPTIONAL the maximum number of possible pieces, default=32 | 
|---|
| 1464 | ;"              the function counts DOWN from this number, so if s has more than default, must specify | 
|---|
| 1465 | ;"Result: Returns the number of pieces | 
|---|
| 1466 | ;"              e.g. 'this is a test', space delimiter --> returns 4 | 
|---|
| 1467 | ;"Note:  ("this is a test",";") --> 1 | 
|---|
| 1468 | ;"       ("",";") --> 0 | 
|---|
| 1469 |  | 
|---|
| 1470 | ;"NOTICE!!! | 
|---|
| 1471 | ;"After writing this function, I was told that $length(s,delim) will do this. | 
|---|
| 1472 | ;" I will leave this here as a reminder, but it probably shouldn't be used.... | 
|---|
| 1473 | quit $length(s,$get(delim," ")) | 
|---|
| 1474 |  | 
|---|
| 1475 |  | 
|---|
| 1476 | new i,result set result=0 | 
|---|
| 1477 | if $get(s)="" goto NPsDone | 
|---|
| 1478 | set delim=$get(delim," ") | 
|---|
| 1479 | set maxPoss=+$get(maxPoss,32) | 
|---|
| 1480 |  | 
|---|
| 1481 | for result=maxPoss:-1:1 quit:($piece(s,delim,result)'="") | 
|---|
| 1482 |  | 
|---|
| 1483 | quit result | 
|---|
| 1484 |  | 
|---|
| 1485 | LastPiece(s,delim,maxPoss) | 
|---|
| 1486 | ;"Purpose: to return the last piece of a string | 
|---|
| 1487 | ;"Input: s -- the string to use | 
|---|
| 1488 | ;"       delim -- OPTIONAL -- the delimiter (e.g. ',' or ';' or ' ' etc), default=" " | 
|---|
| 1489 | ;"       maxPoss -- OPTIONAL the maximum number of possible pieces, default=32 (see NumPieces function) | 
|---|
| 1490 | ;"Results : returns the LAST piece in the string | 
|---|
| 1491 |  | 
|---|
| 1492 | new result set result="" | 
|---|
| 1493 | if $get(s)="" goto LPDone | 
|---|
| 1494 | set delim=$get(delim," ") | 
|---|
| 1495 | new n | 
|---|
| 1496 | set n=$length(s,delim) | 
|---|
| 1497 | set result=$piece(s,delim,n) | 
|---|
| 1498 |  | 
|---|
| 1499 | LPDone | 
|---|
| 1500 | quit result | 
|---|
| 1501 |  | 
|---|
| 1502 | ParseLast(s,remainS,delim,maxPoss) | 
|---|
| 1503 | ;"Purpose: to return the last piece of a string, AND return the first part of the string in remainS | 
|---|
| 1504 | ;"Input: s -- the string to use | 
|---|
| 1505 | ;"       remainS -- an OUT parameter.  PASS BY REFERENCE.  Returns the part of the string up to result | 
|---|
| 1506 | ;"       delim -- OPTIONAL -- the delimiter (e.g. ',' or ';' or ' ' etc), default=" " | 
|---|
| 1507 | ;"       maxPoss -- OPTIONAL the maximum number of possible pieces, default=32 (see NumPieces function) | 
|---|
| 1508 | ;"Results : returns the LAST piece in the string | 
|---|
| 1509 |  | 
|---|
| 1510 | new result set result="" | 
|---|
| 1511 | new tempS set tempS=s  ;"in case s passed by reference, and remainS=s (i.e. w $$ParseLast(s,.s) | 
|---|
| 1512 | set remainS="" | 
|---|
| 1513 | set delim=$get(delim," ") | 
|---|
| 1514 |  | 
|---|
| 1515 | if $get(tempS)="" goto PLDone | 
|---|
| 1516 | new n | 
|---|
| 1517 | set n=$length(s,delim) | 
|---|
| 1518 | set result=$piece(tempS,delim,n) | 
|---|
| 1519 | if n>1 set remainS=$piece(tempS,delim,1,n-1) | 
|---|
| 1520 |  | 
|---|
| 1521 | PLDone | 
|---|
| 1522 | quit result | 
|---|
| 1523 |  | 
|---|
| 1524 |  | 
|---|
| 1525 |  | 
|---|
| 1526 | NPsDone | 
|---|
| 1527 | quit result | 
|---|
| 1528 |  | 
|---|
| 1529 |  | 
|---|
| 1530 | Trim1Node(pRef) | 
|---|
| 1531 | ;"Purpose: To shorten a reference by one node. | 
|---|
| 1532 | ;"         e.g. "Array(567,2342,123)" --> "Array(567,2342)" | 
|---|
| 1533 | ;"Input: pRef -- the NAME OF an array. | 
|---|
| 1534 | ;"Result: will return shortened reference, or "" if problem | 
|---|
| 1535 | ;"        If no nodes to trim, just array name will be returnes. | 
|---|
| 1536 |  | 
|---|
| 1537 | new result set result=pRef | 
|---|
| 1538 | if pRef="" goto T1NDone | 
|---|
| 1539 |  | 
|---|
| 1540 | if $qlength(pRef)>0 set result=$name(@pRef,$qlength(pRef)-1) | 
|---|
| 1541 | goto T1NDone | 
|---|
| 1542 |  | 
|---|
| 1543 | ;"Below is an old way I came up with (not as effecient!) | 
|---|
| 1544 | ;"NOT USED. | 
|---|
| 1545 | set result=$qsubscript(pRef,0) | 
|---|
| 1546 |  | 
|---|
| 1547 | new numNodes,i | 
|---|
| 1548 | set numNodes=$qlength(pRef) | 
|---|
| 1549 | for i=1:1:(numNodes-1) do | 
|---|
| 1550 | . new node set node=$qsubscript(pRef,i) | 
|---|
| 1551 | . set result=$name(@result@(node)) | 
|---|
| 1552 |  | 
|---|
| 1553 | T1NDone | 
|---|
| 1554 | quit result | 
|---|
| 1555 |  | 
|---|
| 1556 |  | 
|---|
| 1557 | BROWSEASK | 
|---|
| 1558 | ;"Purpose: to ask user for the name of an array, then display nodes | 
|---|
| 1559 |  | 
|---|
| 1560 | new current | 
|---|
| 1561 | new order set order=1 ;"default = forward display. | 
|---|
| 1562 | new paginate set paginate=0 ;"no pagination | 
|---|
| 1563 | new countNodes set countNodes=0 ;"no counting | 
|---|
| 1564 | write ! | 
|---|
| 1565 | read "Enter name of array (or File number) to display nodes in: ",current:$get(DTIME,3600),! | 
|---|
| 1566 | if +current=current do | 
|---|
| 1567 | . set current=$get(^DIC(+current,0,"GL")) | 
|---|
| 1568 | . if current="" write "File number not found. Quitting.",! quit | 
|---|
| 1569 | . write "Browsing array: ",current,! | 
|---|
| 1570 | if current="" set current="^" | 
|---|
| 1571 | if current="^" goto BADone | 
|---|
| 1572 |  | 
|---|
| 1573 | new % set %=2 ;" default= NO | 
|---|
| 1574 | write "Display in REVERSE order? " | 
|---|
| 1575 | do YN^DICN write ! | 
|---|
| 1576 | if %=1 set order=-1 | 
|---|
| 1577 | if %=-1 goto BADone | 
|---|
| 1578 |  | 
|---|
| 1579 | set %=2 | 
|---|
| 1580 | write "Pause after each page? " | 
|---|
| 1581 | do YN^DICN write ! | 
|---|
| 1582 | if %=1 set paginate=1 | 
|---|
| 1583 | if %=-1 goto BADone | 
|---|
| 1584 |  | 
|---|
| 1585 | set %=2 | 
|---|
| 1586 | write "Show number of subnodes? " | 
|---|
| 1587 | do YN^DICN write ! | 
|---|
| 1588 | if %=1 set countNodes=1 | 
|---|
| 1589 | if %=-1 goto BADone | 
|---|
| 1590 |  | 
|---|
| 1591 | do BROWSENODES(current,order,paginate,countNodes) | 
|---|
| 1592 | BADone | 
|---|
| 1593 | quit | 
|---|
| 1594 |  | 
|---|
| 1595 |  | 
|---|
| 1596 | BROWSENODES(current,Order,paginate,countNodes) | 
|---|
| 1597 | ;"Purpose: to display nodes of specified array | 
|---|
| 1598 | ;"Input: Current -- The reference to display | 
|---|
| 1599 | ;"       order -- OPTIONAL, default=1; 1 for forward, -1 for backwards order | 
|---|
| 1600 | ;"       paginate -- OPTIONAL, default=0;  0=no pagination, 1=pause after each page | 
|---|
| 1601 | ;"       countNodes -- OPTIONAL, default=0; 1=show number of child nodes. | 
|---|
| 1602 |  | 
|---|
| 1603 | new parent,child | 
|---|
| 1604 | set parent="" | 
|---|
| 1605 | set order=$get(order,1) | 
|---|
| 1606 | set paginate=$get(paginate,0) | 
|---|
| 1607 | set countNodes=$get(countNodes,0) | 
|---|
| 1608 |  | 
|---|
| 1609 | new len set len=$length(current) | 
|---|
| 1610 | new lastChar set lastChar=$extract(current,len) | 
|---|
| 1611 | if lastChar'=")" do | 
|---|
| 1612 | . if current'["(" quit | 
|---|
| 1613 | . if lastChar="," set current=$extract(current,1,len-1) | 
|---|
| 1614 | . if lastChar="(" set current=$extract(current,1,len-1) quit | 
|---|
| 1615 | . set current=current_")" | 
|---|
| 1616 |  | 
|---|
| 1617 | BNLoop | 
|---|
| 1618 | if current="" goto BNDone | 
|---|
| 1619 | set child=$$ShowNodes(current,order,paginate,countNodes) | 
|---|
| 1620 | if child'="" do | 
|---|
| 1621 | . set parent(child)=current | 
|---|
| 1622 | . set current=child | 
|---|
| 1623 | else  set current=$get(parent(current)) | 
|---|
| 1624 | goto BNLoop | 
|---|
| 1625 | BNDone | 
|---|
| 1626 | quit | 
|---|
| 1627 |  | 
|---|
| 1628 |  | 
|---|
| 1629 | ShowNodes(pArray,order,paginate,countNodes) | 
|---|
| 1630 | ;"Purpose: To display all the nodes of the given array | 
|---|
| 1631 | ;"Input: pArray -- NAME OF array to display | 
|---|
| 1632 | ;"       order -- OPTIONAL, default=1; 1 for forward, -1 for backwards order | 
|---|
| 1633 | ;"       paginate -- OPTIONAL, default=0;  0=no pagination, 1=pause after each page | 
|---|
| 1634 | ;"       countNodes -- OPTIONAL, default=0; 1=show number of child nodes. | 
|---|
| 1635 | ;"Results: returns NAME OF next node to display (or "" if none) | 
|---|
| 1636 |  | 
|---|
| 1637 | new TMGi | 
|---|
| 1638 | new count set count=1 | 
|---|
| 1639 | new Answers | 
|---|
| 1640 | new someShown set someShown=0 | 
|---|
| 1641 | new abort set abort=0 | 
|---|
| 1642 | set paginate=$get(paginate,0) | 
|---|
| 1643 | new pageCount set pageCount=0 | 
|---|
| 1644 | new pageLen set pageLen=20 | 
|---|
| 1645 | set countNodes=$get(countNodes,0) | 
|---|
| 1646 |  | 
|---|
| 1647 | write pArray,! | 
|---|
| 1648 | set TMGi=$order(@pArray@(""),order) | 
|---|
| 1649 | if TMGi'="" for  do  quit:(TMGi="")!(abort=1) | 
|---|
| 1650 | . write count,".  +--[",TMGi,"]" | 
|---|
| 1651 | . if countNodes=1 write "(",$$ListCt($name(@pArray@(TMGi))),")" | 
|---|
| 1652 | . write "=",$extract($get(@pArray@(TMGi)),1,40),! | 
|---|
| 1653 | . set someShown=1 | 
|---|
| 1654 | . set Answers(count)=$name(@pArray@(TMGi)) | 
|---|
| 1655 | . set count=count+1 | 
|---|
| 1656 | . new temp read *temp:0 | 
|---|
| 1657 | . if temp'=-1 set abort=1 | 
|---|
| 1658 | . set pageCount=pageCount+1 | 
|---|
| 1659 | . if (paginate=1)&(pageCount>pageLen) do | 
|---|
| 1660 | . . new temp | 
|---|
| 1661 | . . read "Press [ENTER] to continue (^ to stop list)...",temp:$get(DTIME,3600),! | 
|---|
| 1662 | . . if temp="^" set abort=1 | 
|---|
| 1663 | . . set pageCount=0 | 
|---|
| 1664 | . set TMGi=$order(@pArray@(TMGi),order) | 
|---|
| 1665 |  | 
|---|
| 1666 | if someShown=0 write "   (no data)",! | 
|---|
| 1667 | write !,"Enter # to browse (^ to backup): ^//" | 
|---|
| 1668 | new temp read temp:$get(DTIME,3600),! | 
|---|
| 1669 |  | 
|---|
| 1670 | new result set result=$get(Answers(temp)) | 
|---|
| 1671 |  | 
|---|
| 1672 | quit result | 
|---|
| 1673 |  | 
|---|
| 1674 |  | 
|---|
| 1675 | BRWSASK2 | 
|---|
| 1676 | ;"Purpose: Improved... Ask user for the name of an array, then display nodes | 
|---|
| 1677 |  | 
|---|
| 1678 | new current | 
|---|
| 1679 | new order set order=1 ;"default = forward display. | 
|---|
| 1680 | new countNodes set countNodes=0 ;"no counting | 
|---|
| 1681 | write ! | 
|---|
| 1682 | read "Enter name of array (or File number) to display nodes in: ",current:$get(DTIME,3600),! | 
|---|
| 1683 | if +current=current do | 
|---|
| 1684 | . set current=$get(^DIC(+current,0,"GL")) | 
|---|
| 1685 | . if current="" write "File number not found. Quitting.",! quit | 
|---|
| 1686 | . write "Browsing array: ",current,! | 
|---|
| 1687 | if current="" set current="^" | 
|---|
| 1688 | if current="^" goto BA2Done | 
|---|
| 1689 |  | 
|---|
| 1690 | new % set %=2 ;" default= NO | 
|---|
| 1691 | write "Display in REVERSE order? " do YN^DICN write ! | 
|---|
| 1692 | if %=1 set order=-1 | 
|---|
| 1693 | if %=-1 goto BA2Done | 
|---|
| 1694 |  | 
|---|
| 1695 | set %=2 | 
|---|
| 1696 | write "Show number of subnodes? " do YN^DICN write ! | 
|---|
| 1697 | if %=1 set countNodes=1 | 
|---|
| 1698 | if %=-1 goto BA2Done | 
|---|
| 1699 |  | 
|---|
| 1700 | do BRWSNOD2(current,order,countNodes) | 
|---|
| 1701 | BA2Done | 
|---|
| 1702 | quit | 
|---|
| 1703 |  | 
|---|
| 1704 | BRWSNOD2(curRef,Order,countNodes) | 
|---|
| 1705 | ;"Purpose: to display nodes of specified array | 
|---|
| 1706 | ;"Input: curRef -- The reference to display | 
|---|
| 1707 | ;"       order -- OPTIONAL, default=1; 1 for forward, -1 for backwards order | 
|---|
| 1708 | ;"       paginate -- OPTIONAL, default=0;  0=no pagination, 1=pause after each page | 
|---|
| 1709 | ;"       countNodes -- OPTIONAL, default=0; 1=show number of child nodes. | 
|---|
| 1710 | set curRef=$$CREF^DILF(curRef) | 
|---|
| 1711 | if curRef="" goto BN2Done | 
|---|
| 1712 | new TMGBRWORDER set TMGBRWORDER=$get(order,1) | 
|---|
| 1713 | new TMGBRWCN set TMGBRWCN=$get(countNodes,0) | 
|---|
| 1714 | if $$ShowNod2(curRef,TMGBRWORDER,TMGBRWCN) | 
|---|
| 1715 | BN2Done quit | 
|---|
| 1716 |  | 
|---|
| 1717 | ShowNod2(pArray,order,countNodes) | 
|---|
| 1718 | ;"Purpose: To display all the nodes of the given array | 
|---|
| 1719 | ;"         UPDATED function to use Scroller box. | 
|---|
| 1720 | ;"Input: pArray -- NAME OF array to display | 
|---|
| 1721 | ;"       order -- OPTIONAL, default=1; 1 for forward, -1 for backwards order | 
|---|
| 1722 | ;"       countNodes -- OPTIONAL, default=0; 1=show number of child nodes. | 
|---|
| 1723 | ;"Results: returns NAME OF next node to display (or "" if none) | 
|---|
| 1724 |  | 
|---|
| 1725 | new TMGi,Option | 
|---|
| 1726 | new dispArray,dispI set dispI=1 | 
|---|
| 1727 | set order=$get(order,1) | 
|---|
| 1728 | set countNodes=$get(countNodes,0) | 
|---|
| 1729 | ; | 
|---|
| 1730 | set TMGi="" for  set TMGi=$order(@pArray@(TMGi),order) quit:(TMGi="")  do | 
|---|
| 1731 | . new s set s=" +---["_TMGi_"]" | 
|---|
| 1732 | . if countNodes=1 set s=s_"("_$$ListCt($name(@pArray@(TMGi)))_")" | 
|---|
| 1733 | . new s2 set s2=$extract($get(@pArray@(TMGi)),1,40) | 
|---|
| 1734 | . if s2'="" set s=s_"="_s2 | 
|---|
| 1735 | . if $data(@pArray@(TMGi))>9 set s=s_"   ..." | 
|---|
| 1736 | . set dispArray(dispI,s)=$name(@pArray@(TMGi)),dispI=dispI+1 | 
|---|
| 1737 | if $data(dispArray)=0 set dispArray(dispI,"<NO DATA>")="",dispI=dispI+1 | 
|---|
| 1738 | ; | 
|---|
| 1739 | set Option("HEADER",1)="Data for "_pArray | 
|---|
| 1740 | set Option("FOOTER",1,1)="? Help" | 
|---|
| 1741 | set Option("FOOTER",1,2)="LEFT Backup" | 
|---|
| 1742 | set Option("FOOTER",1,3)="RIGHT Browse IN" | 
|---|
| 1743 | set Option("ON SELECT")="HndOnSel^TMGMISC" | 
|---|
| 1744 | set Option("ON CMD")="HndOnCmd^TMGMISC" | 
|---|
| 1745 | ; | 
|---|
| 1746 | write # | 
|---|
| 1747 | do Scroller^TMGUSRIF("dispArray",.Option) | 
|---|
| 1748 | quit pArray | 
|---|
| 1749 |  | 
|---|
| 1750 | HndOnSel(pArray,Option,Info) | 
|---|
| 1751 | ;"Purpose: handle ON SELECT event from Scroller^TMGUSRIF, launched by ShowNod2 | 
|---|
| 1752 | ;"Input: pArray,Option,Info -- see documentation in Scroller^TMGUSRIF | 
|---|
| 1753 | ;"       Info has this: | 
|---|
| 1754 | ;"          Info("CURRENT LINE","NUMBER")=number currently highlighted line | 
|---|
| 1755 | ;"          Info("CURRENT LINE","TEXT")=Text of currently highlighted line | 
|---|
| 1756 | ;"          Info("CURRENT LINE","RETURN")=return value of currently highlighted line | 
|---|
| 1757 | ; | 
|---|
| 1758 | new ref set ref=$get(Info("CURRENT LINE","RETURN")) | 
|---|
| 1759 | if ref'="" if $$ShowNod2(ref,TMGBRWORDER,TMGBRWCN) | 
|---|
| 1760 | quit | 
|---|
| 1761 |  | 
|---|
| 1762 |  | 
|---|
| 1763 | HndOnCmd(pArray,Option,Info) | 
|---|
| 1764 | ;"Purpose: handle ON SELECT event from Scroller, launched by ShowNod2 | 
|---|
| 1765 | ;"Input: pArray,Option,Info -- see documentation in Scroller | 
|---|
| 1766 | ;"       Info has this: | 
|---|
| 1767 | ;"          Info("USER INPUT")=input | 
|---|
| 1768 | ;"          Info("CURRENT LINE","NUMBER")=number currently highlighted line | 
|---|
| 1769 | ;"          Info("CURRENT LINE","TEXT")=Text of currently highlighted line | 
|---|
| 1770 | ;"          Info("CURRENT LINE","RETURN")=return value of currently highlighted line | 
|---|
| 1771 | ;"       TMGSCLRMSG,TMGBRWORDER,TMGBRWCN - globally scoped variables that are used. | 
|---|
| 1772 | ;"results: none (required to have none) | 
|---|
| 1773 |  | 
|---|
| 1774 | new input set input=$$UP^XLFSTR($get(Info("USER INPUT"))) | 
|---|
| 1775 | if input["LEFT" do | 
|---|
| 1776 | . set TMGSCLRMSG="^" | 
|---|
| 1777 | else  if input["RIGHT" do | 
|---|
| 1778 | . new ref set ref=$get(Info("CURRENT LINE","RETURN")) | 
|---|
| 1779 | . if ref'="" if $$ShowNod2(ref,TMGBRWORDER,TMGBRWCN) | 
|---|
| 1780 | else  if input="?" do | 
|---|
| 1781 | . write !,"Use UP and DOWN cursor keys to select global node",! | 
|---|
| 1782 | . write "LEFT will back up, and RIGHT or ENTER will browse node",! | 
|---|
| 1783 | . write "^ at the ':' prompt will cause a back up of one level",! | 
|---|
| 1784 | . do PressToCont^TMGUSRIF | 
|---|
| 1785 | else  if input'="" do | 
|---|
| 1786 | . write !,"Input ",$get(Info("USER INPUT"))," not recognized.",! | 
|---|
| 1787 | . do PressToCont^TMGUSRIF | 
|---|
| 1788 | ; | 
|---|
| 1789 | write # | 
|---|
| 1790 | quit | 
|---|
| 1791 |  | 
|---|
| 1792 |  | 
|---|
| 1793 | IsNumeric(value) | 
|---|
| 1794 | ;"Purpose: to determine if value is pure numeric. | 
|---|
| 1795 | ;"Note: This will be a more involved test than simply: if +value=value, because | 
|---|
| 1796 | ;"      +"00001" is not the same as "1" or 1.  Also +"123abc"--> 123, but is not pure numeric | 
|---|
| 1797 | set value=$$Trim^TMGSTUTL(value)  ;" trim whitespace | 
|---|
| 1798 | set value=$$TrimL^TMGSTUTL(value,"0") ;"trim leading zeros | 
|---|
| 1799 | quit (value=+value) | 
|---|
| 1800 |  | 
|---|
| 1801 |  | 
|---|
| 1802 | ClipDDigits(Num,digits) | 
|---|
| 1803 | ;"Purpose: to clip number to specified number of decimal digits | 
|---|
| 1804 | ;"         e.g. 1234.9876543 --> 1234.9876  if digits=4 | 
|---|
| 1805 | ;"Input: Num -- the number to process | 
|---|
| 1806 | ;"       digits -- the number of allowed decimal digits after the decimal point | 
|---|
| 1807 | ;"Result: returns the number clipped to the specified number of decimals | 
|---|
| 1808 | ;"      note: this is a CLIP, not a ROUND function | 
|---|
| 1809 |  | 
|---|
| 1810 | new result set result=Num | 
|---|
| 1811 | new decimals set decimals=$extract($piece(Num,".",2),1,digits) | 
|---|
| 1812 | set result=$piece(Num,".",1) | 
|---|
| 1813 | if decimals'="" set result=result_"."_decimals | 
|---|
| 1814 | CDgDone | 
|---|
| 1815 | quit result | 
|---|
| 1816 |  | 
|---|
| 1817 |  | 
|---|
| 1818 | Diff(File,IENS1,IENS2,Result) | 
|---|
| 1819 | ;"Purpose: to determine how two records differ in a given file | 
|---|
| 1820 | ;"Input: File -- file name or number of file containing records to be compared | 
|---|
| 1821 | ;"       IENS1 -- the IEN (or IENS if file is a subfile) of the first record to be compared | 
|---|
| 1822 | ;"       IENS2 -- the IEN (or IENS if file is a subfile) of the second record to be compared | 
|---|
| 1823 | ;"       Result -- PASS BE REFERENCE, and OUT PARAMETER | 
|---|
| 1824 | ;"              Format of output Result array.  Will only hold differences | 
|---|
| 1825 | ;"              e.g. Result(FieldNum,"EXTRA",1)=valueOfField | 
|---|
| 1826 | ;"              e.g. Result(FieldNum,"EXTRA",2)=valueOfField | 
|---|
| 1827 | ;"              e.g. Result(FieldNum,"CONFLICT",1)=valueOfField | 
|---|
| 1828 | ;"              e.g. Result(FieldNum,"CONFLICT",2)=valueOfField | 
|---|
| 1829 | ;"              e.g. Result(FieldNum,"FIELD NAMES")=FieldName | 
|---|
| 1830 | ;"Note: this will consider only the first 1024 characters of  WP fields | 
|---|
| 1831 | ;"Note: For now, multiples (subfiles) will be IGNORED | 
|---|
| 1832 |  | 
|---|
| 1833 | new fileNum set fileNum=+$get(File) | 
|---|
| 1834 | if fileNum=0 set fileNum=$$GetFileNum^TMGDBAPI(.File) | 
|---|
| 1835 | new subFileNum | 
|---|
| 1836 |  | 
|---|
| 1837 | new field set field=$order(^DD(fileNum,0)) | 
|---|
| 1838 | if +field>0 for  do  quit:(+field'>0) | 
|---|
| 1839 | . set subFileNum=+$piece($get(^DD(fileNum,field,0)),"^",2) ;"get subfile number, or 0 if not subfile | 
|---|
| 1840 | . if subFileNum>0 do  ;"finish later... | 
|---|
| 1841 | . . ;"Here I need to somehow cycle through each record of the subfile and compare THOSE | 
|---|
| 1842 | . . new subResult | 
|---|
| 1843 | . . do DiffSubFile(subFileNum,.IENS1,.IENS2,.subResult) ;"null function for now | 
|---|
| 1844 | . . ;"do some merge between Result and subResult | 
|---|
| 1845 | . else  do Diff1Field(fileNum,field,.IENS1,.IENS2,.Result) | 
|---|
| 1846 | . set field=$order(^DD(fileNum,field)) | 
|---|
| 1847 |  | 
|---|
| 1848 | quit | 
|---|
| 1849 |  | 
|---|
| 1850 |  | 
|---|
| 1851 | Diff1Field(File,Field,IENS1,IEN2,Result) | 
|---|
| 1852 | ;"Purpose: to determine how two records differ for one given field | 
|---|
| 1853 | ;"Input: File -- file NUMBER of file containing records to be compared | 
|---|
| 1854 | ;"       Field -- Field NUMBER to be evaluated | 
|---|
| 1855 | ;"       IENS1 -- the IEN (or IENS if file is a subfile) of the first record to be compared | 
|---|
| 1856 | ;"       IENS2 -- the IEN (or IENS if file is a subfile) of the second record to be compared | 
|---|
| 1857 | ;"       Result -- PASS BE REFERENCE, and OUT PARAMETER | 
|---|
| 1858 | ;"              Format of output Result array.  Will only hold differences | 
|---|
| 1859 | ;"              e.g. Result(FieldNum,"EXTRA",1)=valueOfField | 
|---|
| 1860 | ;"              e.g. Result(FieldNum,"EXTRA",2)=valueOfField | 
|---|
| 1861 | ;"              e.g. Result(FieldNum,"CONFLICT",1)=valueOfField | 
|---|
| 1862 | ;"              e.g. Result(FieldNum,"CONFLICT",2)=valueOfField | 
|---|
| 1863 | ;"              e.g. Result(FieldNum,"FIELD NAMES")=FieldName | 
|---|
| 1864 | ;"Results: none (data returned in Result out parameter) | 
|---|
| 1865 | ;"Note: only first 1023 characters of a WP field will be compared | 
|---|
| 1866 |  | 
|---|
| 1867 | new value1,value2,TMGWP1,TMGWP2 | 
|---|
| 1868 | new fieldName set fieldName=$piece($get(^DD(File,Field,0)),"^",1) | 
|---|
| 1869 |  | 
|---|
| 1870 | set value1=$$GET1^DIQ(File,IENS1,Field,"","TMGWP1") | 
|---|
| 1871 | set value2=$$GET1^DIQ(File,IENS2,Field,"","TMGWP2") | 
|---|
| 1872 |  | 
|---|
| 1873 | if $data(TMGWP1)!$data(TMGWP2) do | 
|---|
| 1874 | . set value1=$$WPToStr^TMGSTUTL("TMGWP1"," ",1023)  ;"Turn first 1023 characters into one long string | 
|---|
| 1875 | . set value2=$$WPToStr^TMGSTUTL("TMGWP2"," ",1023)  ;"Turn first 1023 characters into one long string | 
|---|
| 1876 |  | 
|---|
| 1877 | if value1=value2 goto D1FDone ;"default is no conflict | 
|---|
| 1878 | if (value2="")&(value1'="") do | 
|---|
| 1879 | . set Result(Field,"EXTRA",1)=value1 | 
|---|
| 1880 | . set Result(Field,"FIELD NAME")=fieldName | 
|---|
| 1881 | if (value1="")&(value2'="") do | 
|---|
| 1882 | . set Result(Field,"EXTRA",2)=value2 | 
|---|
| 1883 | . set Result(Field,"FIELD NAME")=fieldName | 
|---|
| 1884 | if (value1'="")&(value2'="") do | 
|---|
| 1885 | . set Result(Field,"CONFLICT",1)=value1 | 
|---|
| 1886 | . set Result(Field,"CONFLICT",2)=value2 | 
|---|
| 1887 | . set Result(Field,"FIELD NAME")=fieldName | 
|---|
| 1888 |  | 
|---|
| 1889 | D1FDone | 
|---|
| 1890 | quit | 
|---|
| 1891 |  | 
|---|
| 1892 | DiffSubFile(SubFile,IENS1,IENS2,Result) | 
|---|
| 1893 |  | 
|---|
| 1894 | quit | 
|---|
| 1895 |  | 
|---|
| 1896 |  | 
|---|
| 1897 |  | 
|---|
| 1898 | Array2XML(pArray,pResult,indent) | 
|---|
| 1899 | ;"Purpose: to convert an array into XML format | 
|---|
| 1900 | ;"Input: pArray -- the NAME OF the array to convert (array can be any format) | 
|---|
| 1901 | ;"       pResult -- the NAME OF the output array. | 
|---|
| 1902 | ;"              format: | 
|---|
| 1903 | ;"                Result(0)="<?xml version='1.0'?>" | 
|---|
| 1904 | ;"                Result(1)="<Node id="Node Name">Node Value</Node> | 
|---|
| 1905 | ;"                Result(2)="  <Node id="Node Name">Node Value</Node> | 
|---|
| 1906 | ;"                Result(3)="  <Node id="Node Name">Node Value</Node> | 
|---|
| 1907 | ;"                Result(4)="  <Node id="Node Name">Node Value          ;"<--- start subnode | 
|---|
| 1908 | ;"                Result(5)="    <Node id="Node Name">Node Value</Node> | 
|---|
| 1909 | ;"                Result(6)="    <Node id="Node Name">Node Value</Node> | 
|---|
| 1910 | ;"                Result(7)="  </Node>                                  ;"<---- end subnode | 
|---|
| 1911 | ;"                Result(8)="  <Node id="Node Name">Node Value</Node> | 
|---|
| 1912 | ;"       indent -- OPTIONAL.  if 1, then subnodes have whitespace indent for pretty viewing | 
|---|
| 1913 | ;"Output: pResult is filled | 
|---|
| 1914 | ;"Result: none. | 
|---|
| 1915 | ;"Note: example call  do Array2XML("MyArray","MyOutput",1) | 
|---|
| 1916 |  | 
|---|
| 1917 | kill @pResult | 
|---|
| 1918 | set @pResult@(0)=0 | 
|---|
| 1919 | if $get(indent)=1 set indent="" | 
|---|
| 1920 | else  set indent=-1 | 
|---|
| 1921 | do A2XNode(pArray,pResult,.indent) | 
|---|
| 1922 | set @pResult@(0)=$$XMLHDR^MXMLUTL | 
|---|
| 1923 |  | 
|---|
| 1924 | quit | 
|---|
| 1925 |  | 
|---|
| 1926 |  | 
|---|
| 1927 | A2XNode(pArray,pResult,indent) | 
|---|
| 1928 | ;"Purpose: To do the output for Array2XML | 
|---|
| 1929 | ;"Input: pArray - the NAME OF the array to convert | 
|---|
| 1930 | ;"       pResult - the NAME OF the output array. | 
|---|
| 1931 | ;"              Format to be as described in Array2XML, which one exception: Result(0)=MaxLine | 
|---|
| 1932 | ;"       indent -- OPTIONAL.  if numeric value, then subnodes WON't whitespace indent for pretty viewing | 
|---|
| 1933 | ;"                              otherwise, indent is string holding space to indent | 
|---|
| 1934 | ;"Result: none | 
|---|
| 1935 |  | 
|---|
| 1936 | new i,s | 
|---|
| 1937 | set indent=$get(indent) | 
|---|
| 1938 | set i=$order(@pArray@("")) | 
|---|
| 1939 | if i'="" for  do  quit:(i="") | 
|---|
| 1940 | . set s="" if indent'=-1 set s=indent | 
|---|
| 1941 | . set s=s_"<Node id="""_i_""">"_$get(@pArray@(i)) | 
|---|
| 1942 | . set s=$$SYMENC^MXMLUTL(s) | 
|---|
| 1943 | . if $data(@pArray@(i))>1 do | 
|---|
| 1944 | . . set @pResult@(0)=+$get(@pResult@(0))+1  ;"Increment maxline | 
|---|
| 1945 | . . set @pResult@(@pResult@(0))=s | 
|---|
| 1946 | . . new subIndent set subIndent=-1 | 
|---|
| 1947 | . . if indent'=-1 set subIndent=indent_"  " | 
|---|
| 1948 | . . do A2XNode($name(@pArray@(i)),pResult,subIndent) | 
|---|
| 1949 | . . set s="" if indent'=-1 set s=indent | 
|---|
| 1950 | . . set s=s_"</Node>" | 
|---|
| 1951 | . else  do | 
|---|
| 1952 | . . set s=s_"</Node>" | 
|---|
| 1953 | . set @pResult@(0)=+$get(@pResult@(0))+1  ;"Increment maxline | 
|---|
| 1954 | . set @pResult@(@pResult@(0))=s | 
|---|
| 1955 | . set i=$order(@pArray@(i)) | 
|---|
| 1956 |  | 
|---|
| 1957 | quit | 
|---|
| 1958 |  | 
|---|
| 1959 |  | 
|---|
| 1960 | Up(pArray) | 
|---|
| 1961 | ;"Purpose: Return a NAME of an array that is one level 'up' from the | 
|---|
| 1962 | ;"         the current array.  This really means one node shorter. | 
|---|
| 1963 | ;"         e.g. '^MyVar('plant','tree','apple tree')' --> '^MyVar('plant','tree')' | 
|---|
| 1964 | ;"Results: returns shorten array as above, or "" if error | 
|---|
| 1965 |  | 
|---|
| 1966 | new result set result="" | 
|---|
| 1967 | if $get(pArray)="" goto UpDone | 
|---|
| 1968 | set result=$qsubscript(pArray,0) | 
|---|
| 1969 | new i | 
|---|
| 1970 | for i=1:1:$qlength(pArray)-1 do | 
|---|
| 1971 | . set result=$name(@result@($qsubscript(pArray,i))) | 
|---|
| 1972 |  | 
|---|
| 1973 | UpDone  quit result | 
|---|
| 1974 |  | 
|---|
| 1975 |  | 
|---|
| 1976 | LaunchScreenman(File,FormIEN,RecIEN,Page) | 
|---|
| 1977 | ;"Purpose: to provide a programatic launching point for displaying a | 
|---|
| 1978 | ;"         screenman form for editing a record | 
|---|
| 1979 | ;"Input: File -- the IEN of file to be edited | 
|---|
| 1980 | ;"       FormIEN -- the IEN in file FORM (.403) | 
|---|
| 1981 | ;"       RecIEN -- the IEN in File to edit | 
|---|
| 1982 | ;"       Page -- OPTIONAL, default=1.  The starting page of form. | 
|---|
| 1983 | ;"Note: Form should be compiled before calling the function.  This can be | 
|---|
| 1984 | ;"      achieved by running the form once from ^DDSRUN (or viat Fileman menu) | 
|---|
| 1985 |  | 
|---|
| 1986 | new DDSFILE set DDSFILE=File | 
|---|
| 1987 | new DDSRUNDR set DDSRUNDR=FormIEN | 
|---|
| 1988 | new DDSPAGE set DDSPAGE=+$get(Page,1) | 
|---|
| 1989 | new DA set DA=RecIEN | 
|---|
| 1990 |  | 
|---|
| 1991 | do REC+9^DDSRUN  ;"this goes against SAC conventions. | 
|---|
| 1992 |  | 
|---|
| 1993 | quit | 
|---|
| 1994 |  | 
|---|
| 1995 |  | 
|---|
| 1996 | NumSigChs() | 
|---|
| 1997 | ;"Purpose: To determine how many characters are signficant in a variable name | 
|---|
| 1998 | ;"         I.e. older versions of GT.M had only the first 8 characters as | 
|---|
| 1999 | ;"         significant.  Newer versions allow more characters to be significant. | 
|---|
| 2000 |  | 
|---|
| 2001 | new pVar1,pVar2,i | 
|---|
| 2002 | set pVar1="zb",i=2 | 
|---|
| 2003 | new done set done=0 | 
|---|
| 2004 | for  do  quit:done | 
|---|
| 2005 | . set i=i+1 | 
|---|
| 2006 | . set pVar2=pVar1_"b" | 
|---|
| 2007 | . set pVar1=pVar1_"a" | 
|---|
| 2008 | . new @pVar2,@pVar1 | 
|---|
| 2009 | . set @pVar1=7 | 
|---|
| 2010 | . if $get(@pVar2)=@pVar1 set done=1 | 
|---|
| 2011 |  | 
|---|
| 2012 | quit (i-1) | 
|---|
| 2013 |  | 
|---|
| 2014 |  | 
|---|
| 2015 | SrchReplace(File,Field,Caption) | 
|---|
| 2016 | ;"Purpose: To do a text-based search and replace in all record of | 
|---|
| 2017 | ;"         specified file, in the text of the specified file. | 
|---|
| 2018 | ;"         Note: this does not work with pointer fields.  It would | 
|---|
| 2019 | ;"         fail to find the matching text in the pointer value and ignore it. | 
|---|
| 2020 | ;"         It does not support subfiles. | 
|---|
| 2021 | ;"Input: File -- the file name or number to work with. | 
|---|
| 2022 | ;"       Field -- the field name or number to work with | 
|---|
| 2023 | ;"       Caption -- OPTIONAL.  A descriptive text of action. | 
|---|
| 2024 | ;"Output: Data in records will be changed via Fileman and errors (if found) | 
|---|
| 2025 | ;"        will be written to console. | 
|---|
| 2026 | ;"Results: none. | 
|---|
| 2027 |  | 
|---|
| 2028 | if $get(File)="" goto SRDone | 
|---|
| 2029 | if $get(Field)="" goto SRDone | 
|---|
| 2030 | new OKToCont set OKToCont=1 | 
|---|
| 2031 | if +Field'=Field set OKToCont=$$SetFileFldNums^TMGDBAPI(File,Field,.File,.Field) | 
|---|
| 2032 | if OKToCont=0 goto SRDone | 
|---|
| 2033 |  | 
|---|
| 2034 | if $get(Caption)'="" do | 
|---|
| 2035 | . write !,!,Caption,! | 
|---|
| 2036 | . write "----------------------------------------------------",!! | 
|---|
| 2037 |  | 
|---|
| 2038 | new searchS,replaceS,% | 
|---|
| 2039 | SR1 | 
|---|
| 2040 | write "Enter characters/words to SEARCH for (^ to abort): " | 
|---|
| 2041 | read searchS:$get(DTIME,3600),! | 
|---|
| 2042 | if (searchS="")!(searchS="^") goto SRDone | 
|---|
| 2043 | write "REPLACE with (^ to abort): " | 
|---|
| 2044 | read replaceS:$get(DTIME,3600),! | 
|---|
| 2045 | if (replaceS="^") goto SRDone | 
|---|
| 2046 | write "'",searchS,"'-->'",replaceS,"'",! | 
|---|
| 2047 | set %=1 | 
|---|
| 2048 | write "OK" do YN^DICN write ! | 
|---|
| 2049 | if %=1 goto SR2 | 
|---|
| 2050 | if %=-1 goto SRDone | 
|---|
| 2051 | goto SR1 | 
|---|
| 2052 |  | 
|---|
| 2053 | SR2 | 
|---|
| 2054 | new Itr,IEN,CurValue,abort,count | 
|---|
| 2055 | new ref set ref=$get(^DIC(File,0,"GL")) | 
|---|
| 2056 | set ref=$$CREF^DILF(ref) | 
|---|
| 2057 | if ref="" goto SRDone | 
|---|
| 2058 | new node set node=$piece($get(^DD(File,Field,0)),"^",4) | 
|---|
| 2059 | new piece set piece=$piece(node,";",2) | 
|---|
| 2060 | set node=$piece(node,";",1) | 
|---|
| 2061 |  | 
|---|
| 2062 | set abort=0,count=0 | 
|---|
| 2063 | set IEN=$$ItrInit^TMGITR(File,.Itr) | 
|---|
| 2064 | do PrepProgress^TMGITR(.Itr,20,0,"IEN") | 
|---|
| 2065 | if IEN'="" for  do  quit:($$ItrNext^TMGITR(.Itr,.IEN)'>0)!abort | 
|---|
| 2066 | . if $$UserAborted^TMGUSRIF() set abort=1 quit | 
|---|
| 2067 | . set CurValue=$piece($get(@ref@(IEN,node)),"^",piece) | 
|---|
| 2068 | . if CurValue'[searchS quit | 
|---|
| 2069 | SR3     . new newValue set newValue=$$Substitute^TMGSTUTL(CurValue,searchS,replaceS) | 
|---|
| 2070 | . new TMGFDA,TMGMSG | 
|---|
| 2071 | . set TMGFDA(File,IEN_",",Field)=newValue | 
|---|
| 2072 | . do FILE^DIE("K","TMGFDA","TMGMSG") | 
|---|
| 2073 | . do ShowIfDIERR^TMGDEBUG(.TMGMSG) | 
|---|
| 2074 | . set count=count+1 | 
|---|
| 2075 | do ProgressDone^TMGITR(.Itr) | 
|---|
| 2076 |  | 
|---|
| 2077 | write count," records changed",! | 
|---|
| 2078 | do PressToCont^TMGUSRIF | 
|---|
| 2079 |  | 
|---|
| 2080 | SRDone | 
|---|
| 2081 | quit | 
|---|
| 2082 |  | 
|---|
| 2083 |  | 
|---|
| 2084 | MkMultList(input,List) | 
|---|
| 2085 | ;"Purpose: To create a list of entries, given a string containing a list of entries. | 
|---|
| 2086 | ;"Input: input -- a string of user input.  E.g.: '345,3,12678,78-85,2' or '78-93' or '15' | 
|---|
| 2087 | ;"       List -- PASS BY REFERENCE.  An OUT PARAMETER. | 
|---|
| 2088 | ;"Output: List will be filled as follows: | 
|---|
| 2089 | ;"              List(Entry number)="" | 
|---|
| 2090 | ;"              List(Entry number)="" | 
|---|
| 2091 | ;"              List(Entry number)="" | 
|---|
| 2092 | ;"Result: 1 if values found, 0 none found, or error encountered | 
|---|
| 2093 |  | 
|---|
| 2094 | new result set result=0 | 
|---|
| 2095 |  | 
|---|
| 2096 | new i | 
|---|
| 2097 | for i=1:1:$length(input,",") do | 
|---|
| 2098 | . new value set value=$piece(input,",",i) | 
|---|
| 2099 | . if +value=value do | 
|---|
| 2100 | . . set List(value)="" | 
|---|
| 2101 | . . set result=1 | 
|---|
| 2102 | . else  if value["-" do | 
|---|
| 2103 | . . new n1,n2 | 
|---|
| 2104 | . . set n1=+$piece(value,"-",1) | 
|---|
| 2105 | . . set n2=+$piece(value,"-",2) | 
|---|
| 2106 | . . set result=$$MkRangeList(n1,n2,.List) | 
|---|
| 2107 |  | 
|---|
| 2108 | quit result | 
|---|
| 2109 |  | 
|---|
| 2110 |  | 
|---|
| 2111 | MkRangeList(Num,EndNum,List) | 
|---|
| 2112 | ;"Purpose: To create a list of entries, given a starting and ending number | 
|---|
| 2113 | ;"Input: Num -- the start entry number | 
|---|
| 2114 | ;"       EndNum -- OPTIONAL, the last entry number (if supplied then all values | 
|---|
| 2115 | ;"              between Num and Endnum will be added to list | 
|---|
| 2116 | ;"       List -- PASS BY REFERENCE.  An OUT PARAMETER. | 
|---|
| 2117 | ;"Output: List will be filled as follows: | 
|---|
| 2118 | ;"              List(Entry number)="" | 
|---|
| 2119 | ;"              List(Entry number)="" | 
|---|
| 2120 | ;"              List(Entry number)="" | 
|---|
| 2121 | ;"Result: 1 if value input found, otherwise 0 | 
|---|
| 2122 |  | 
|---|
| 2123 | new result set result=0 | 
|---|
| 2124 | set EndNum=$get(EndNum,Num) | 
|---|
| 2125 | if (+Num'=Num)!(+EndNum'=EndNum) goto MkRLDone | 
|---|
| 2126 |  | 
|---|
| 2127 | new i | 
|---|
| 2128 | for i=Num:1:EndNum do | 
|---|
| 2129 | . set List(i)="" | 
|---|
| 2130 | . set result=1 | 
|---|
| 2131 |  | 
|---|
| 2132 | MkRLDone | 
|---|
| 2133 | quit result | 
|---|
| 2134 |  | 
|---|
| 2135 |  | 
|---|
| 2136 | Flags(Var,Flag,Mode) | 
|---|
| 2137 | ;"Purpose: To set,delete,or toggle a flag stored in Var | 
|---|
| 2138 | ;"Input: Var -- PASS BY REFERENCE.  The variable holding the flags | 
|---|
| 2139 | ;"       Flag -- a single character flag to be stored in Var | 
|---|
| 2140 | ;"       Mode: should be: 'SET','DEL',or 'TOGGLE'.  Default is 'SET' | 
|---|
| 2141 | ;"Results: none | 
|---|
| 2142 |  | 
|---|
| 2143 | set Flag=$get(Flag,"SET") | 
|---|
| 2144 | set Var=$get(Var) | 
|---|
| 2145 | if $get(Mode)="TOGGLE" do | 
|---|
| 2146 | . if Var[Flag set Mode="DEL" | 
|---|
| 2147 | . else  set Mode="SET" | 
|---|
| 2148 | if $get(Mode)="SET" do | 
|---|
| 2149 | . if Var[Flag quit | 
|---|
| 2150 | . set Var=Var_Flag | 
|---|
| 2151 | if $get(Mode)="DEL" do | 
|---|
| 2152 | . if Var'[Flag quit | 
|---|
| 2153 | . set Var=$piece(Var,Flag,1)_$piece(Var,Flag,2) | 
|---|
| 2154 |  | 
|---|
| 2155 | quit | 
|---|
| 2156 |  | 
|---|
| 2157 |  | 
|---|
| 2158 | CompABArray(pArrayA,pArrayB,pExtraB,pMissingB,pDiff,ProgressFn,IncVar) | 
|---|
| 2159 | ;"Purpose: To compare two arrays, A & B, and return results in OutArray | 
|---|
| 2160 | ;"         that specifies how ArrayB differs from ArrayA | 
|---|
| 2161 | ;"Input: pArrayA -- PASS BY NAME. Baseline array to be compared against | 
|---|
| 2162 | ;"       pArrayB -- PASS BY NAME. Array to be compare against ArrayA | 
|---|
| 2163 | ;"       pExtraB -- PASS BY NAME. An OUT PARAMETER.  Array of extra info from B | 
|---|
| 2164 | ;"                      OPTIONAL.  If not provided, then data not filled. | 
|---|
| 2165 | ;"       pMissingB -- PASS BY NAME. An OUT PARAMETER.  Array of missing info | 
|---|
| 2166 | ;"                      OPTIONAL.  If not provided, then data not filled. | 
|---|
| 2167 | ;"       pDiff -- PASS BY NAME. An OUT PARAMETER.  Output as below. | 
|---|
| 2168 | ;"                      OPTIONAL.  If not provided, then data not filled. | 
|---|
| 2169 | ;"          @pOutArray@("A",node,node,node,...)=different value | 
|---|
| 2170 | ;"          @pOutArray@("B",node,node,node,...)=different value | 
|---|
| 2171 | ;"       ProgressFn -- OPTIONAL -- M code to exec as a progress indicator | 
|---|
| 2172 | ;"       IncVar -- OPTIONAL -- a counter that can be referenced by ProgressFn | 
|---|
| 2173 | ;"Results: 0=OK, 1=aborted | 
|---|
| 2174 |  | 
|---|
| 2175 | new indexA,indexB | 
|---|
| 2176 |  | 
|---|
| 2177 | set IncVar=+$get(IncVar) | 
|---|
| 2178 | set ProgressFn=$get(ProgressFn) | 
|---|
| 2179 | set pExtraB=$get(pExtraB) | 
|---|
| 2180 | set pMissingB=$get(pMissingB) | 
|---|
| 2181 | set pdiff=$get(pDiff) | 
|---|
| 2182 | new abort set abort=0 | 
|---|
| 2183 | new Compared | 
|---|
| 2184 |  | 
|---|
| 2185 | set indexA="" | 
|---|
| 2186 | for  set indexA=$order(@pArrayA@(indexA)) quit:(indexA="")!abort  do | 
|---|
| 2187 | . set IncVar=IncVar+1 | 
|---|
| 2188 | . if (IncVar#10=1),(ProgressFn'="") do  quit:(abort) | 
|---|
| 2189 | . . new $etrap set $etrap="set $etrap="""",$ecode=""""" | 
|---|
| 2190 | . . xecute ProgressFn | 
|---|
| 2191 | . . write !,pArrayA,"(",indexA,")        ",!  do CUU^TMGTERM(2)  ;"temp | 
|---|
| 2192 | . . if $$UserAborted^TMGUSRIF() set abort=1 quit | 
|---|
| 2193 | . if $data(@pArrayB@(indexA))=0 do  quit | 
|---|
| 2194 | . . if (pMissingB'="") merge @pMissingB@(pArrayA,indexA)=@pArrayA@(indexA) | 
|---|
| 2195 | . new s1,s2 | 
|---|
| 2196 | . set s1=$get(@pArrayA@(indexA)) | 
|---|
| 2197 | . set s2=$get(@pArrayB@(indexA)) | 
|---|
| 2198 | . if s1'=s2 do | 
|---|
| 2199 | . . if pDiff="" quit | 
|---|
| 2200 | . . if $$TRIM^XLFSTR(s1)=$$TRIM^XLFSTR(s2) quit | 
|---|
| 2201 | . . set @pDiff@("A",pArrayA,indexA)=s1 | 
|---|
| 2202 | . . set @pDiff@("B",pArrayA,indexA)=s2 | 
|---|
| 2203 | . set abort=$$CompABArray($name(@pArrayA@(indexA)),$name(@pArrayB@(indexA)),.pExtraB,.pMissingB,.pDiff,.ProgressFn,.IncVar) | 
|---|
| 2204 | . set Compared($name(@pArrayA@(indexA)),$name(@pArrayB@(indexA)))=1 | 
|---|
| 2205 |  | 
|---|
| 2206 | new temp set temp=1 | 
|---|
| 2207 | set indexB="" | 
|---|
| 2208 | for  set indexB=$order(@pArrayB@(indexB)) quit:(indexB="")!abort  do | 
|---|
| 2209 | . set temp=temp+1 | 
|---|
| 2210 | . if (temp#10=1) do  quit:(abort) | 
|---|
| 2211 | . . write !,pArrayA,"(",indexB,")        ",!  do CUU^TMGTERM(2)  ;"temp | 
|---|
| 2212 | . . if $$UserAborted^TMGUSRIF() set abort=1 quit | 
|---|
| 2213 | . if $data(@pArrayA@(indexB))=0 do  quit | 
|---|
| 2214 | . . if (pExtraB'="") merge @pExtraB@(pArrayA,indexB)=@pArrayB@(indexB) | 
|---|
| 2215 | . if $get(Compared($name(@pArrayA@(indexB)),$name(@pArrayB@(indexB))))=1 do  quit ;"already checked | 
|---|
| 2216 | . . new temp | 
|---|
| 2217 | . set abort=$$CompABArray($name(@pArrayA@(indexB)),$name(@pArrayB@(indexB)),.pExtraB,.pMissingB,.pDiff) | 
|---|
| 2218 |  | 
|---|
| 2219 | quit abort | 
|---|
| 2220 |  | 
|---|
| 2221 |  | 
|---|
| 2222 | FixArray(ref) | 
|---|
| 2223 | ;"Purpose: Convert an array like this: | 
|---|
| 2224 | ;"        @ref@("^DD(2,.362)",21,1,0)  --> @ref@("^DD",2,.362,21,1,0) | 
|---|
| 2225 | ;"        @ref@("^DD(2,.362)",21,2,0)  --> @ref@("^DD",2,.362,21,2,0) | 
|---|
| 2226 | ;"        @ref@("^DD(2,.362)",23,0)  --> @ref@("^DD",2,.362,23,0) | 
|---|
| 2227 | ;"        @ref@("^DD(2,.362)",23,1,0)  --> @ref@("^DD",2,.362,23,1,0) | 
|---|
| 2228 | ;"        @ref@("^DD(2,0,""IX"")","ACFL2",2,.312)  --> @ref@("^DD",2,0,"IX","ACFL2",2,.312) | 
|---|
| 2229 | ;"        @ref@("^DD(2,0,""IX"")","AEXP",2,.351)  --> @ref@("^DD",2,0,"IX","AEXP",2,.351) | 
|---|
| 2230 | ;"        @ref@("^DD(2,0,""IX"")","TMGS",2,22701)  --> @ref@("^DD",2,0,"IX","TMGS",2,22701) | 
|---|
| 2231 | ;"        @ref@("^DD(2,0,""PT"")",228.1,.02)  --> @ref@("^DD",2,0,"PT",228.1,.02) | 
|---|
| 2232 | ;"        @ref@("^DD(2,0,""PT"")",228.2,.02)  --> @ref@("^DD",2,0,"PT",228.2,.02) | 
|---|
| 2233 | ;"        @ref@("^DD(2,0,""PT"")",19620.92,.08)  --> @ref@("^DD",2,0,"PT",19620.92,.08) | 
|---|
| 2234 | ;"        @ref@("^DD(2,0,""PT"",115)",.01)  --> @ref@("^DD",2,0,"PT",115,.01) | 
|---|
| 2235 | ;"Input: ref -- PASS BY NAME | 
|---|
| 2236 | ;"Output: contents of @ref are converted as above. | 
|---|
| 2237 | ;"Results: none | 
|---|
| 2238 |  | 
|---|
| 2239 | new origRef set origRef=ref | 
|---|
| 2240 | new output,s1,i | 
|---|
| 2241 | for  set ref=$query(@ref) quit:(ref="")  do | 
|---|
| 2242 | . set s1=$qsubscript(ref,1) | 
|---|
| 2243 | . new newRef set newRef="output" | 
|---|
| 2244 | . new startI set startI=1 | 
|---|
| 2245 | . if s1["(" do | 
|---|
| 2246 | . . set startI=2 | 
|---|
| 2247 | . . set newRef=newRef_"("""_$qs(s1,0)_""")" | 
|---|
| 2248 | . . if $qlength(s1)>1 for i=1:1:$qlength(s1) do | 
|---|
| 2249 | . . . set newRef=$name(@newRef@($qsubscript(s1,i))) | 
|---|
| 2250 | . for i=startI:1:$qlength(ref) do | 
|---|
| 2251 | . . new s3 set s3=$qsubscript(ref,i) | 
|---|
| 2252 | . . set newRef=$name(@newRef@(s3)) | 
|---|
| 2253 | . merge @newRef=@ref | 
|---|
| 2254 |  | 
|---|
| 2255 | kill @origRef | 
|---|
| 2256 | merge @origRef=output  ;"put changes back into original array | 
|---|
| 2257 |  | 
|---|
| 2258 | quit | 
|---|
| 2259 |  | 
|---|
| 2260 |  | 
|---|
| 2261 | Caller(Code) | 
|---|
| 2262 | ;"Purpose: From call stack, return the location of the caller of the function | 
|---|
| 2263 | ;"         Note this will not return the address of the function calling | 
|---|
| 2264 | ;"         Caller, but instead, the address of the function before that | 
|---|
| 2265 | ;"         in the stack. | 
|---|
| 2266 | ;"         So a function (A) can call this routine to find out who called it (A). | 
|---|
| 2267 | ;"Input: Code -- OPTIONAL.  PASS BY REFERANCE, AN OUT PARAMETER | 
|---|
| 2268 | ;"                      Filled with line of calling code. | 
|---|
| 2269 | set Code=$STACK($STACK-2,"MCODE") | 
|---|
| 2270 | new result set result=$STACK($STACK-2,"PLACE") | 
|---|
| 2271 | if result="" set result="?" | 
|---|
| 2272 | quit result | 
|---|
| 2273 |  | 
|---|