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