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