1 | TMGXINST ;TMG/kst/XML Configuration Scripting System ;03/25/06
|
---|
2 | ;;1.0;TMG-LIB;**1**;07/12/04
|
---|
3 |
|
---|
4 | ;" XML Configuration Scripting System
|
---|
5 | ;"
|
---|
6 | ;" K. Toppenberg, MD
|
---|
7 | ;" 7-12-04
|
---|
8 | ;"
|
---|
9 | ;"Purpose: Intrepret a specially-prepaired XML file, designed
|
---|
10 | ;" for configuring VistA
|
---|
11 |
|
---|
12 | ;"Dependancy: Requires TMGXDLG.m, TMGSTUTL.m, TMGDEBUG.m
|
---|
13 |
|
---|
14 | ;"-------------------------------------------------------------
|
---|
15 | ;"CHANGE LOG
|
---|
16 | ;"10-17-04: Got WP fields to upload properly. Created FormatArray function.
|
---|
17 | ;"10-15-04: Forgot to log several days. Created <FileUtility>. Ensured data substitution
|
---|
18 | ;" more widely implemented. Worked more on script. Tracked down modal dialog
|
---|
19 | ;" box bug (conflicting globals in two different modules).
|
---|
20 | ;"10-5-04: Learned that WP fields must be treated differently, so worked on support.
|
---|
21 | ;" Had trouble with a locked record after a crash. Learn about GTM lke utility.
|
---|
22 | ;"10-4-04: Tracked down apparent bug in FILE^DIE that doesn't allow upload to a word
|
---|
23 | ;" processor field. Also allowed redirection of debug output to a file or to
|
---|
24 | ;" an X graphic tail box.
|
---|
25 | ;"10-2-05: Changed record node divider character from "/" to "|" because I could not
|
---|
26 | ;" ever remember to protect the / as // and I'm sure others wouldn't remember
|
---|
27 | ;" either. Fixed bug that caused crash when showing error box before XML
|
---|
28 | ;" parse was complete, and datanode contained valid data. Changed UploadFile
|
---|
29 | ;" to UploadRecord with <Record></Record> syntax
|
---|
30 | ;"10-1-04: Fixed bug with line wrapping disordering in dialog boxes. Fixed bug
|
---|
31 | ;" preventing non-modal dialog boxes ("&"-->" &") NOTE: ??working?
|
---|
32 | ;"9-30-04: Allowed data substitution {{...}} to be used in Show and message boxes.
|
---|
33 | ;" Fixed bug to allow multiple data substitutions on one line.
|
---|
34 | ;"9-27-04:
|
---|
35 | ;" Ran a test menu upload and got Adam and TMG Text menu to upload
|
---|
36 | ;" Cleaned up error reporting. Discovered that including the ` character
|
---|
37 | ;" in upload data causes an error... haven't tracked down reason yet.
|
---|
38 | ;"9-26-04:
|
---|
39 | ;" Started this change log
|
---|
40 | ;" Change parameter system so that unlimited number of params allowed
|
---|
41 | ;" Cleaned up command execution and passing of parameters
|
---|
42 | ;" Got X graphic dialogs working -- can call from XML script.
|
---|
43 | ;" Added options for a variety of user interfaces: GUI,CHUI,Roll
|
---|
44 | ;" Changed log in process so that user #1 is used (MGR,IRM on my system)
|
---|
45 | ;"2/9/2008: Moved some functions out into TMGXMLT for reuse by other code.
|
---|
46 |
|
---|
47 |
|
---|
48 | ;"-------------------------------------------------------------
|
---|
49 | ;"Public Functions
|
---|
50 |
|
---|
51 | ;"Run(DispMode,DebugMode,UserPath,UserFName)
|
---|
52 |
|
---|
53 | ;"-------------------------------------------------------------
|
---|
54 | ;"Private Functions
|
---|
55 | ;"
|
---|
56 | ;"ShowWelcome()
|
---|
57 | ;"GetFName(Path,Filename)
|
---|
58 | ;"LoadFile(Path,Filename)
|
---|
59 | ;"ShutDown
|
---|
60 | ;"InitVars()
|
---|
61 | ;"CMDProcess(Command,Params)
|
---|
62 | ;"DoComment(Params)
|
---|
63 | ;"DoShow(Params)
|
---|
64 | ;"DoM(Params)
|
---|
65 | ;"DoMenu(Params)
|
---|
66 | ;"DoLookup(Params) -- take data from XML file, and look up if it is already in database
|
---|
67 | ;"DoValueLookup(Params) -- look for a value of a given value in a given record in given file.
|
---|
68 | ;"DoFileUtility(Params)
|
---|
69 | ;"DoSearchRec(Params)
|
---|
70 | ;"DoUpload(Params)
|
---|
71 | ;"GetRInfo(ID,Data) -- get record info from the <DATA> section and store it in the Data variable.
|
---|
72 | ;"ProcessRNode(DataP,Field,Text,EntryNumber,FileNumber,DoingSubNodes,Flags) -- Allow for recursive calling when doing GetRInfo
|
---|
73 | ;"WPHandle(DataP,EntryNumber,FieldNumber,Text) -- process word-processing fields for ProcessRNode()
|
---|
74 | ;"CheckArraySubst(TextArray)
|
---|
75 | ;"ParamSubstitute(Params)
|
---|
76 | ;"CheckSubstituteData(Text)
|
---|
77 | ;"DoJump(Params)
|
---|
78 | ;"GetLabelNode(Label)
|
---|
79 | ;"GetData(Ref)
|
---|
80 | ;"ParseSeg(Ref,ID)
|
---|
81 | ;"GetDescIDNode(ParentNode,Name,ID)
|
---|
82 | ;"GetCMDLine(ExecNode,Command,Params)
|
---|
83 | ;"GetNextCMD(ExecNode)
|
---|
84 | ;"RunScript(ExecNode)
|
---|
85 | ;"GetDispMode()
|
---|
86 | ;"DoMsgBox(Params)
|
---|
87 | ;"=================================================================
|
---|
88 | ;"=================================================================
|
---|
89 |
|
---|
90 |
|
---|
91 | Run(DispMode,DebugMode,UserPath,UserFName)
|
---|
92 | ;"Purpose: To use given XML filename to process
|
---|
93 | ;"Input:
|
---|
94 | ;" DispMode: OPTIONAL -- If not given, will ask user. Should be
|
---|
95 | ;" 1 for GUI
|
---|
96 | ;" 2 for CHUI
|
---|
97 | ;" 3 for Roll-n-Scroll
|
---|
98 | ;" DebugMode: OPTIONAL -- If not given, will ask user. Should be:
|
---|
99 | ;" 0 for none,
|
---|
100 | ;" 1 for To Screen
|
---|
101 | ;" 2 for To File
|
---|
102 | ;" 3 for To Tail (only valid if DispMode="GUI")
|
---|
103 | ;" UserPath: OPTIONAL --Directory to load from
|
---|
104 | ;" UserFName: OPTIONAL --the full filename. If not given, will ask user
|
---|
105 |
|
---|
106 | ;"Set up some global variables.
|
---|
107 |
|
---|
108 | new TMGDEBUG set TMGDEBUG=0 ;"Note: user could change this at runtime...
|
---|
109 | new DBIndent set DBIndent=0
|
---|
110 | new PriorErrorFound set PriorErrorFound=0
|
---|
111 | ;"new DispMode
|
---|
112 | new cGUI set cGUI="GUI"
|
---|
113 | new cCHUI set cCHUI="CHUI"
|
---|
114 | new cRoll set cRoll="Roll-n-Scroll"
|
---|
115 | new DModes
|
---|
116 | new cDialog set cDialog="UseDialog"
|
---|
117 | set DModes(0)="x"
|
---|
118 | set DModes(1)=cGUI
|
---|
119 | set DModes(2)=cCHUI
|
---|
120 | set DModes(3)=cRoll
|
---|
121 | set DModes(4)="x"
|
---|
122 |
|
---|
123 | new ExecNode ;"This is the execution point
|
---|
124 | new DataNode ;"A handle to <Data> node
|
---|
125 | new ScriptNode ;"A handle to <Script> node
|
---|
126 | new TopNode ;"A handle to top level node <CONFIG_SCRIPT>
|
---|
127 | new XMLHandle ;"Handle referring to current XML document
|
---|
128 |
|
---|
129 | new cNodeDiv set cNodeDiv="|"
|
---|
130 | new c2NodeDiv set c2NodeDiv=cNodeDiv_cNodeDiv
|
---|
131 |
|
---|
132 | new cProtect set cProtect="~~"
|
---|
133 | new cDataOpen set cDataOpen="{{"
|
---|
134 | new cDataClose set cDataClose="}}"
|
---|
135 | new cNewLn set cNewLn="\n"
|
---|
136 | new cEntries set cEntries="Entries"
|
---|
137 | new cGlobal set cGlobal="GLOBAL"
|
---|
138 | new cOpen set cOpen="OPEN"
|
---|
139 | new cParentIENS set cParentIENS="ParentIENS"
|
---|
140 | new cTrue set cTrue=1
|
---|
141 | new cFalse set cFalse=0
|
---|
142 | new cdbNone set cdbNone=0
|
---|
143 | new cdbToScrn set cdbToScrn=1 ;"was 2
|
---|
144 | new cdbToFile set cdbToFile=2 ;"was 3
|
---|
145 | new cdbToTail set cdbToTail=3 ;"was 4
|
---|
146 | new cdbAbort set cdbAbort=-1
|
---|
147 | new cOKToCont set cOKToCont=1
|
---|
148 | new cAbort set cAbort=0
|
---|
149 |
|
---|
150 | new cScript set cScript="SCRIPT" ;"Script"
|
---|
151 | new cData set cData="DATA" ;"Data"
|
---|
152 | new cMVar set cMVar="MVAR" ;"MVar"
|
---|
153 | new cOption set cOption="OPTION" ;"option"
|
---|
154 | new cCondition set cCondition="CONDITION" ;"condition"
|
---|
155 | new cMatchThis set cMatchThis="MATCHTHIS" ;"MatchThis"
|
---|
156 | new cMatchValue set cMatchValue="MATCHVALUE" ;"MatchValue
|
---|
157 | new cField set cField="FIELD" ;"Field"
|
---|
158 | new cFile set cFile="FILE" ;"File"
|
---|
159 | new cRecNum set cRecNum="RECNUM" ;"RecNum
|
---|
160 | new cRecord set cRecord="RECORD" ;"Record"
|
---|
161 | new cId set cId="ID" ;"id"
|
---|
162 | new cOutput set cOutput="OUTVAR" ;"OutVar"
|
---|
163 | new cInput set cInput="INVAR" ;"InVar
|
---|
164 | new cShow set cShow="SHOW" ;"Show"
|
---|
165 | new cM set cM="M" ;"M"
|
---|
166 | new cMenu set cMenu="DOMENUOPTION" ;"DoMenuOption"
|
---|
167 | new cUpload set cUpload="UPLOADRECORD" ;"UploadRecord"
|
---|
168 | new cLookup set cLookup="LOOKUPFILEINFO" ;"LookupFileInfo"
|
---|
169 | new cValueLookup set cValueLookup="LOOKUPFIELDVALUE" ;"LookupFieldValue"
|
---|
170 | new cSearchRec set cSearchRec="SEARCHREC" ;"SearchRec
|
---|
171 | new cFileUtility set cFileUtility="FILEUTILITY" ;"FileUtility
|
---|
172 | new cMsgBox set cMsgBox="MSGBOX" ;"MsgBox
|
---|
173 | new cHeader set cHeader="HEADER" ;"Header
|
---|
174 | new cText set cText="TEXT" ;"Text
|
---|
175 | new cJump set cJump="JUMP" ;"Jump"
|
---|
176 | new cRemark set cRemark="REM" ;"Rem"
|
---|
177 | new cLabel set cLabel="LABEL" ;"Label"
|
---|
178 | new cFlags set cFlags="FLAGS" ;"Flags"
|
---|
179 | new cWidth set cWidth="WIDTH" ;"Width
|
---|
180 | new cModal set cModal="MODAL" ;"Modal"
|
---|
181 | new cFn set cFn="FN" ;"Fn
|
---|
182 | new cInfo set cInfo="INFO" ;"Info
|
---|
183 | new cDelete set cDelete="DELETE" ;"Delete
|
---|
184 | new cNextRec set cNextRec="NEXTREC"
|
---|
185 | new cPrev set cPrev="PREV"
|
---|
186 | new cNumRecs set cNumRecs="NUMRECS"
|
---|
187 | new cFirstRec set cFirstRec="FIRSTREC"
|
---|
188 | new cLastRec set cLastRec="LASTREC"
|
---|
189 | new cRef set cRef="Ref"
|
---|
190 | new cNonModal set cNonModal="0"
|
---|
191 | new cModalMode set cModalMode="1"
|
---|
192 | ;"Field flags
|
---|
193 | new cHack set cHack="H"
|
---|
194 | new cNoOverwrite set cNoOverwrite="N"
|
---|
195 | new cEncrypt set cEncrypt="E"
|
---|
196 | ;"----------
|
---|
197 | new cUpperCase set cUpperCase="UpperCase"
|
---|
198 | new cName set cName="Name"
|
---|
199 | new cValue set cValue="VALUE"
|
---|
200 | new cSet set cSet="SET"
|
---|
201 | new cNull set cNull="(none)"
|
---|
202 | new cMaxNode set cMaxNode="Max Node Num"
|
---|
203 | new Filename
|
---|
204 | new DebugFPath
|
---|
205 | new DebugFName
|
---|
206 | new DebugFile
|
---|
207 |
|
---|
208 | new result
|
---|
209 | new FileSpec
|
---|
210 |
|
---|
211 | new ProcTable
|
---|
212 | set ProcTable(cRemark)="DoComment" ;"a do-nothing function
|
---|
213 | set ProcTable(cLabel)="DoComment" ;"a do-nothing function
|
---|
214 | set ProcTable(cShow)="DoShow"
|
---|
215 | set ProcTable(cM)="DoM"
|
---|
216 | set ProcTable(cMenu)="DoMenu"
|
---|
217 | set ProcTable(cUpload)="DoUpload"
|
---|
218 | set ProcTable(cJump)="DoJump"
|
---|
219 | set ProcTable(cLookup)="DoLookup"
|
---|
220 | set ProcTable(cMsgBox)="DoMsgBox"
|
---|
221 | set ProcTable(cValueLookup)="DoValueLookup"
|
---|
222 | set ProcTable(cFileUtility)="DoFileUtility"
|
---|
223 | set ProcTable(cSearchRec)="DoSearchRec"
|
---|
224 |
|
---|
225 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"Main Run")
|
---|
226 |
|
---|
227 | if $get(WelcomeShown)'=1 do ShowWelcome()
|
---|
228 |
|
---|
229 | ;"A local code login function.
|
---|
230 | if $$XUP^TMGXUP()=0 do goto RunDone
|
---|
231 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Error setting up a user privilages for configuration.")
|
---|
232 |
|
---|
233 | if ($data(DispMode)#10=0)!($get(DispMode)>3)!($get(DispMode)<1) do
|
---|
234 | . set DispMode=$$GetDispMode()
|
---|
235 | set DispMode=DModes(DispMode)
|
---|
236 | if DispMode="x" goto RunDone
|
---|
237 | set DispMode(cDialog)=(DispMode'=cRoll)
|
---|
238 |
|
---|
239 | if ($data(DebugMode)#10=0)!($get(DebugMode)<0)!($get(DebugMode)>3)!(($get(DebugMode)=1)&(DispMode'=cGUI)) do
|
---|
240 | . set TMGDEBUG=$$GetDebugMode^TMGDEBUG(2) ;"2=default to File output
|
---|
241 | else set TMGDEBUG=DebugMode
|
---|
242 | if TMGDEBUG=cdbAbort goto RunDone
|
---|
243 |
|
---|
244 | do
|
---|
245 | . new DefPath set DefPath="/tmp/"
|
---|
246 | . new DefName set DefName="XMLInst_DebugLog.tmp"
|
---|
247 | . new DefFName set DefFName=DefPath_DefName
|
---|
248 | . do OpenLogFile^TMGDEBUG(DefPath,DefName)
|
---|
249 | . if TMGDEBUG=cdbToTail do
|
---|
250 | . . set result=$$Tail^TMGXDLG(DefFName,0,0,0)
|
---|
251 |
|
---|
252 | if ($data(UserPath)#10=0)!($data(UserFName)#10=0) do
|
---|
253 | .
|
---|
254 | . set result=$$GetFName(.UserPath,.UserFName)
|
---|
255 | . if result=cAbort do PopupBox^TMGUSRIF("<!> No script file selected.","Come back again soon!")
|
---|
256 | else set result=cOKToCont
|
---|
257 | if (result=cAbort)!($data(UserPath)=0)!($data(UserFName)=0) goto RunDone
|
---|
258 |
|
---|
259 | set Filename=UserPath_UserFName
|
---|
260 |
|
---|
261 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Let's go! Cranking up system!...")
|
---|
262 |
|
---|
263 | kill ^TMP("TMG",$J)
|
---|
264 | set XML1Ref=$name(^TMP("TMG",$J,1)) ;"I have to use this to load file
|
---|
265 | set XMLRef=$name(^TMP("TMG",$J)) ;"I have to pass this to XML parser
|
---|
266 |
|
---|
267 | set XMLHandle=$$LoadFile(UserPath,UserFName)
|
---|
268 |
|
---|
269 | if XMLHandle=0 do goto RunDone
|
---|
270 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Unable to load/parse file")
|
---|
271 |
|
---|
272 | if '$$InitVars do goto RunDone
|
---|
273 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Error setting up script system (InitVars procedure).")
|
---|
274 |
|
---|
275 | if TMGDEBUG do
|
---|
276 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Calling ArrayDump")
|
---|
277 | . do ArrayDump^TMGDEBUG("^TMP(""TMG"")",$J)
|
---|
278 |
|
---|
279 | new Text
|
---|
280 | set Text(0)="[*] XML Script"
|
---|
281 | set Text(1)="Beginning execution of user XML script:"
|
---|
282 | set Text(2)=Filename
|
---|
283 | set Text(2)=" "
|
---|
284 | set Text(3)="This could be the beginning of "
|
---|
285 | set Text(4)="something wonderful..."
|
---|
286 | do PopupArray^TMGUSRIF(5,45,.Text)
|
---|
287 |
|
---|
288 | new RunResult
|
---|
289 | set RunResult=$$RunScript(.ExecNode)
|
---|
290 |
|
---|
291 | new Text
|
---|
292 | set Text(0)="[*] XML Script"
|
---|
293 | set Text(1)="Done with execution of user XML script."
|
---|
294 | set Text(2)=" "
|
---|
295 | set Text(3)="See you later..."
|
---|
296 | if RunResult=cAbort do
|
---|
297 | . set Text(4)="Note: Script was not completed."
|
---|
298 | do PopupArray^TMGUSRIF(5,45,.Text)
|
---|
299 |
|
---|
300 | RunDone
|
---|
301 | do ShutDown
|
---|
302 |
|
---|
303 | write "Clean shutdown completed. Goodbye.",!,!
|
---|
304 |
|
---|
305 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"Main Run")
|
---|
306 |
|
---|
307 | quit
|
---|
308 |
|
---|
309 |
|
---|
310 | ;"=================================================================
|
---|
311 | ;" Subroutines
|
---|
312 | ;"=================================================================
|
---|
313 |
|
---|
314 | ShowWelcome()
|
---|
315 | ;"Purpose: To show a splash for program
|
---|
316 |
|
---|
317 | write !,!
|
---|
318 |
|
---|
319 | new Text
|
---|
320 | set Text(0)="XML Configurator for VistA on GT.M"
|
---|
321 | set Text(1)=" "
|
---|
322 | set Text(2)="WELCOME..."
|
---|
323 | set Text(3)=" "
|
---|
324 | set Text(4)="Interpreter created by: Kevin Toppenberg, MD"
|
---|
325 | set Text(5)="GNU General Public License, 7/2004"
|
---|
326 | set Text(6)=" "
|
---|
327 | do PopupArray^TMGUSRIF(5,55,.Text)
|
---|
328 |
|
---|
329 | quit
|
---|
330 |
|
---|
331 |
|
---|
332 | GetFName(Path,Filename)
|
---|
333 | ;"Purpose: Interact with user to get path and filename
|
---|
334 | ;"Input: Path--should be passed by reference, used to pass back result
|
---|
335 | ;" Filename--should be passed by reference, used to pass back result
|
---|
336 | ;"Output: Results passed in Path and Filename
|
---|
337 | ;" Function will result in 0 if user 'cancelled', 1 otherwise
|
---|
338 |
|
---|
339 | new result set result=cAbort
|
---|
340 | new FullNamePath
|
---|
341 | new PathNode
|
---|
342 | set Path="/"
|
---|
343 | set Filename=""
|
---|
344 |
|
---|
345 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"GetFName")
|
---|
346 |
|
---|
347 | if DispMode=cRoll goto GFNRoll
|
---|
348 |
|
---|
349 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Calling $$FileSel()")
|
---|
350 | set FullNamePath=$$FileSel^TMGXDLG("Please select script to process . . .","~/XMLScript")
|
---|
351 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Results=",FullNamePath)
|
---|
352 | if FullNamePath="" goto GFNDone ;"result=cAbort still --> cancelled.
|
---|
353 |
|
---|
354 | ;"Separate path from filename
|
---|
355 | GFNL1
|
---|
356 | if '(FullNamePath["/") set Filename=FullNamePath goto GFNL2
|
---|
357 | set PathNode=$piece(FullNamePath,"/",1)
|
---|
358 | set Path=Path_PathNode_"/"
|
---|
359 | set $piece(FullNamePath,"/",1)=""
|
---|
360 | set FullNamePath=$extract(FullNamePath,2,255)
|
---|
361 | goto GFNL1
|
---|
362 | GFNL2
|
---|
363 | set result=cOKToCont
|
---|
364 | goto GFNDone
|
---|
365 |
|
---|
366 | GFNRoll
|
---|
367 | new DefFName set DefFName="XMLScript"
|
---|
368 | new DefPath set DefPath="/home/kdtop/OpenVistA_UserData/r"
|
---|
369 | new Msg set Msg="Select script file:"
|
---|
370 | new tempName
|
---|
371 |
|
---|
372 | ;"if $get(TMGDEBUG)>0 do DebugMsg^TMGDEBUG(DBIndent,"Will new file picker work?")
|
---|
373 |
|
---|
374 | set tempName=$$GetFName^TMGIOUTL(.Msg,.DefPath,.DefFName,"/",.Path,.Filename)
|
---|
375 | write "Path=",$get(Path)," and Filename=",$get(Filename),!
|
---|
376 | if tempName'="" set result=cOKToCont
|
---|
377 | goto GFNDone
|
---|
378 |
|
---|
379 | ;"write !,"------------------------------------------",!
|
---|
380 | write !
|
---|
381 | write "Enter script filename with path:",!
|
---|
382 | write " ['^'] = Abort",!
|
---|
383 | write " [Enter] = '",DefPath,"/",DefFName,"'",!
|
---|
384 | write "> "
|
---|
385 | read Filename:240
|
---|
386 | write !
|
---|
387 | if Filename="^" goto GFNDone
|
---|
388 | if Filename="" do
|
---|
389 | . set Filename=DefFName
|
---|
390 | . set Path=DefPath
|
---|
391 | . write "Using default: ",Path,"/",Filename,!,!,!
|
---|
392 | set result=cOKToCont
|
---|
393 |
|
---|
394 | GFNDone
|
---|
395 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"GetFName")
|
---|
396 | quit result
|
---|
397 |
|
---|
398 |
|
---|
399 |
|
---|
400 | LoadFile(Path,Filename)
|
---|
401 | ;"Purpose: To load the file and check for XML validity
|
---|
402 | ;" Also check for DOCTYPE = 'CONFIG_SCRIPT' and other
|
---|
403 | ;" possible validity tests.
|
---|
404 | ;"Input: FullFile: full filename with path, ready to pass to Host file system.
|
---|
405 | ;"NOTE: uses XML1Ref and XMLRef vars with global scope
|
---|
406 | ;"Returns: 0 if fails, otherwise XML file handle.
|
---|
407 |
|
---|
408 | new FileHandle
|
---|
409 | set XMLHandle=0
|
---|
410 |
|
---|
411 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"LoadFile")
|
---|
412 | set FileHandle=$$FTG^%ZISH(Path,Filename,XML1Ref,3)
|
---|
413 | if FileHandle=0 do goto QLoad
|
---|
414 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Error opening file. Path="_Path_", Filename="_Filename)
|
---|
415 | else do
|
---|
416 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"File Loaded... Handle#="_FileHandle)
|
---|
417 |
|
---|
418 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Calling EN^MXMLDOM")
|
---|
419 | write "Parsing XML File. Please wait . . .",!
|
---|
420 | set XMLHandle=$$EN^MXMLDOM(XMLRef,"")
|
---|
421 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Back from calling EN^MXMLDOM. XMLHandle="_XMLHandle)
|
---|
422 | if XMLHandle=0 do
|
---|
423 | . new ErrMsg
|
---|
424 | . set ErrMsg="Error parsing XML document.\n\n"
|
---|
425 | . set ErrMsg=ErrMsg_"Now analyzing XML file to determine problem...\n"
|
---|
426 | . do ShowError^TMGDEBUG(.PriorErrorFound,ErrMsg)
|
---|
427 | . do DetailParse^TMGXMLP()
|
---|
428 |
|
---|
429 | QLoad
|
---|
430 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"LoadFile")
|
---|
431 | quit XMLHandle
|
---|
432 |
|
---|
433 | ShutDown
|
---|
434 | ;"Purpose: to do any cleanup needed to exit system cleanly
|
---|
435 |
|
---|
436 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Freeing vars...")
|
---|
437 |
|
---|
438 | if $get(XMLHandle) do DELETE^MXMLDOM(XMLHandle)
|
---|
439 | kill ^TMP("TMG",$J)
|
---|
440 |
|
---|
441 | ;"Kill a few variables. The others should be automatically freed
|
---|
442 | ;" when they go out of scope as the program exits.
|
---|
443 | kill TMGDEBUG
|
---|
444 | kill LoggedUsr
|
---|
445 | kill SubMarkNum
|
---|
446 |
|
---|
447 | if $data(DebugFile) close DebugFile
|
---|
448 |
|
---|
449 | write "Exiting XML Scripter.",!,!
|
---|
450 |
|
---|
451 | quit
|
---|
452 |
|
---|
453 |
|
---|
454 | InitVars()
|
---|
455 | ;"Purpose: Initialize variables
|
---|
456 | ;"Input: None:
|
---|
457 | ;"Output: Global (program-wide) variables are set up.
|
---|
458 | ;" Return value is 0 if an error occurs.
|
---|
459 |
|
---|
460 | new result
|
---|
461 | set result=cAbort
|
---|
462 | set TopNode=1
|
---|
463 |
|
---|
464 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Entry InitVars()",1)
|
---|
465 |
|
---|
466 | set ScriptNode=$$GetDescNode^TMGXMLT(XMLHandle,TopNode,cScript)
|
---|
467 | if ScriptNode=0 do goto QInitVar
|
---|
468 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Unable to find node: '"_cScript_"'.")
|
---|
469 |
|
---|
470 | set ExecNode=$$CHILD^MXMLDOM(XMLHandle,ScriptNode)
|
---|
471 | if ExecNode=0 do goto QInitVar
|
---|
472 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Error finding first child of ScriptNode (#"_ScriptNode_").")
|
---|
473 |
|
---|
474 | set DataNode=$$GetDescNode^TMGXMLT(XMLHandle,TopNode,cData)
|
---|
475 | if DataNode=0 do goto QInitVar
|
---|
476 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Unable to find node: '"_cData_"'")
|
---|
477 |
|
---|
478 | set result=cOKToCont
|
---|
479 |
|
---|
480 | QInitVar
|
---|
481 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Exit InitVars()",1)
|
---|
482 | quit result
|
---|
483 |
|
---|
484 |
|
---|
485 | CMDProcess(Command,Params)
|
---|
486 | ;"Purpose: Take allowed command, and carry out appropriate action
|
---|
487 | ;"Input: Command: One of following allowed commands:
|
---|
488 | ;" Show,M,DoMenuOption,UploadRecord,Jump
|
---|
489 | ;" Params: An array holding parameters. See GetParams() for format.
|
---|
490 | ;" Note: if node had no parameters, this array will be undefined.
|
---|
491 | ;"Note: Not all commands will have valid data for all attribs.
|
---|
492 | ;"Returns: If should continue execution: 1=OK to continue. 0=abort.
|
---|
493 |
|
---|
494 | new OKToCont set OKToCont=1
|
---|
495 |
|
---|
496 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"CMDProcess")
|
---|
497 |
|
---|
498 | if $data(ProcTable(Command)) do
|
---|
499 | . new Cmd set Cmd=ProcTable(Command)
|
---|
500 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"CMD=",Cmd)
|
---|
501 | . set @("OKToCont=$$"_Cmd_"(.Params)")
|
---|
502 |
|
---|
503 | goto CMDQuit
|
---|
504 |
|
---|
505 | CMDQuit
|
---|
506 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"CMDProcess")
|
---|
507 | quit OKToCont
|
---|
508 |
|
---|
509 |
|
---|
510 | DoComment(Params)
|
---|
511 | ;"Purpose: To provide a function for doing nothing.... for comments in the code.
|
---|
512 | quit 1
|
---|
513 |
|
---|
514 | DoShow(Params)
|
---|
515 | ;"Purpose: execute Show command
|
---|
516 | ;"Syntax: e.g. <Show>This is a test script system.</Show>
|
---|
517 | ;"Input: Params -- an array that holds all parameters (or is undefined if there were none)
|
---|
518 | ;" if there is text to be show, it should be in
|
---|
519 | ;" Params(cText)
|
---|
520 | ;"Input: TextArray: a reference to global array, holding the text found between tags
|
---|
521 | ;"Returns: If should continue execution: 1=OK to continue. 0=abort.
|
---|
522 |
|
---|
523 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"DoShow")
|
---|
524 |
|
---|
525 | new done
|
---|
526 | new lineI
|
---|
527 | new OneLine
|
---|
528 | new result set result=cOKToCont
|
---|
529 |
|
---|
530 | new TextArray
|
---|
531 |
|
---|
532 | if $data(Params(cText))=0 do goto DSDone
|
---|
533 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Asked to show text, but none found!")
|
---|
534 | . ;"if TMGDEBUG do ArrayDump^TMGDEBUG("Params") ;"zwr Params(*)
|
---|
535 | merge TextArray=Params(cText)
|
---|
536 | if TMGDEBUG do ArrayDump^TMGDEBUG("TextArray") ;"zwr TextArray(*)
|
---|
537 |
|
---|
538 | set result=$$CheckArraySubst(.TextArray)
|
---|
539 |
|
---|
540 | set lineI=$Order(TextArray(""))
|
---|
541 | for do quit:(lineI="")!(result=cAbort)
|
---|
542 | . set OneLine=TextArray(lineI)
|
---|
543 | . write OneLine,!
|
---|
544 | . set lineI=$Order(TextArray(lineI))
|
---|
545 |
|
---|
546 | DSDone
|
---|
547 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"DoShow")
|
---|
548 |
|
---|
549 | quit result
|
---|
550 |
|
---|
551 | DoM(Params)
|
---|
552 | ;"Purpose: execute a single line of M code
|
---|
553 | ;"Syntax: e.g. <M>write "This is a test of M code"</M>
|
---|
554 | ;" e.g. <M>set XMLData={{Data.Site.Office[Kevin].Field[Doctor]}}</M>
|
---|
555 | ;"Input: Params -- an array that holds all parameters (or is undefined if there were none)
|
---|
556 | ;" if there is code to be executed, it should be in
|
---|
557 | ;" Params(cText,1)
|
---|
558 | ;"Note: If a {{...}} pair is found, then the contents between the braces will
|
---|
559 | ;" be interpreted as a data reference, and the value will be looked up.
|
---|
560 | ;" The references are read-only. Attempts to write to them will only
|
---|
561 | ;" create an unused variable by the name of the data result. Will likely
|
---|
562 | ;" cause an error.
|
---|
563 | ;" Note: This code could be anything. Script execution will only continue
|
---|
564 | ;" after M code execution is complete.
|
---|
565 | ;"Returns: If should continue execution: 1=OK to continue. 0=abort.
|
---|
566 |
|
---|
567 | new RefB
|
---|
568 | new Abort
|
---|
569 | new result set result=cOKToCont
|
---|
570 | new OrigCode
|
---|
571 |
|
---|
572 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"DoM")
|
---|
573 |
|
---|
574 | new Code set Code=$get(Params(cText,1))
|
---|
575 | if Code="" do goto DMDone
|
---|
576 | . do ShowError^TMGDEBUG(.PriorErrorFound,"No M code found to execute!")
|
---|
577 |
|
---|
578 | ;"Check if Code contains a data reference. Replace with data if found
|
---|
579 | set OrigCode=Code
|
---|
580 | set result=$$CheckSubstituteData(.Code)
|
---|
581 | if result=cAbort do goto DMDone
|
---|
582 | . do ShowError^TMGDEBUG(.PriorErrorFound,"UNABLE to execute this code: "_OrigCode)
|
---|
583 | . do ShowError^TMGDEBUG(.PriorErrorFound,"After lookup, code was:"_Code)
|
---|
584 |
|
---|
585 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"execute:> "_Code)
|
---|
586 |
|
---|
587 | ;"Note: Here I trap execution errors, and return 0 if error encountered
|
---|
588 | do
|
---|
589 | . new $etrap set $etrap="do DoMErrTrap^TMGXINST"
|
---|
590 | . set ^TMP("TMG",$J,"trap")=cOKToCont
|
---|
591 | . xecute Code
|
---|
592 | . set result=^TMP("TMG",$J,"trap")
|
---|
593 | . if result=cAbort do
|
---|
594 | . . do ShowError^TMGDEBUG(.PriorErrorFound,"Error executing code: \n"_Code)
|
---|
595 |
|
---|
596 | DMDone
|
---|
597 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"DoM")
|
---|
598 | quit result
|
---|
599 |
|
---|
600 |
|
---|
601 | ;"=========================================================
|
---|
602 | ;"DoM Error trap routine
|
---|
603 | ;"=========================================================
|
---|
604 | DoMErrTrap
|
---|
605 | set $etrap=""
|
---|
606 | set $ecode=""
|
---|
607 | set ^TMP("TMG",$J,"trap")=cAbort
|
---|
608 | quit
|
---|
609 | ;"=========================================================
|
---|
610 | ;"DoM End of Error trap routine
|
---|
611 | ;"=========================================================
|
---|
612 |
|
---|
613 |
|
---|
614 | DoMenu(Params)
|
---|
615 | ;"Purpose: To execute a menu option inside the VistA system
|
---|
616 | ;"Syntax: e.g. <DoMenuOption option="DIUSER"></DoMenuOption>
|
---|
617 | ;"Input: Params -- an array that holds all parameters (or is undefined if there were none)
|
---|
618 | ;" if there is code to be executed, it should be in
|
---|
619 | ;" Params(cOption)
|
---|
620 | ;" This should be a valid VistA menu option name.
|
---|
621 | ;"Returns: If should continue execution: 1=OK to continue. 0=abort.
|
---|
622 |
|
---|
623 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"DoMenu")
|
---|
624 |
|
---|
625 | set result=$$DoShow(.Params) ;"Show any associated text as a message
|
---|
626 |
|
---|
627 | new MenuOption
|
---|
628 | set MenuOption=$get(Params(cOption)) ;"note use of attrib value with case UN-MODIFIED
|
---|
629 | if MenuOption="" do goto DoMenuQ
|
---|
630 | . do ShowError^TMGDEBUG(.PriorErrorFound,"No menu option found to execute!")
|
---|
631 |
|
---|
632 | new Text
|
---|
633 | set Text(0)="<!> Notice:"
|
---|
634 | set Text(1)=" "
|
---|
635 | set Text(2)="Temporarily leaving XML Script Configurator"
|
---|
636 | set Text(3)="to run VistA menu option system...."
|
---|
637 | set Text(4)="This script will return to this point when"
|
---|
638 | set Text(5)="VistA menu option exited."
|
---|
639 | set Text(6)=" "
|
---|
640 | do PopupArray^TMGUSRIF(5,55,.Text)
|
---|
641 |
|
---|
642 | new result
|
---|
643 | set result=cOKToCont
|
---|
644 |
|
---|
645 | set DIC=19 ;"File 19 is the OPTION file
|
---|
646 | set DIC(0)="M" ;"M=Multiple index lookup allowed
|
---|
647 | set X=MenuOption
|
---|
648 | do ^DIC ;"Do lookup for variable X. Result returns in Y
|
---|
649 | if Y<0 do quit
|
---|
650 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Menu option '"_MenuOption_"' wasn't found.\nTry specifying a more specific name, or check spelling.")
|
---|
651 |
|
---|
652 | ;"Note: DIC is already set to 19
|
---|
653 | set X=$piece(Y,"^",1) ;"X=Menu option IEN to execute
|
---|
654 |
|
---|
655 | ;Note: If the OPTION is a run routine, then this won't work. I could
|
---|
656 | ; Get the run routine my self, but I would also need to do the
|
---|
657 | ; entry and exit points etc. etc., so I am not now going to.
|
---|
658 |
|
---|
659 | do EN^XQOR ;"call standard entry point to run menu/option X
|
---|
660 |
|
---|
661 | new Text
|
---|
662 | set Text(0)="<!> Notice:"
|
---|
663 | set Text(1)=" "
|
---|
664 | set Text(2)="Re-entering XML Script Configurator"
|
---|
665 | set Text(3)="(Back from VistA menu option system)"
|
---|
666 | set Text(4)="Script continuing..."
|
---|
667 | set Text(5)=" "
|
---|
668 | do PopupArray^TMGUSRIF(5,55,.Text)
|
---|
669 |
|
---|
670 |
|
---|
671 | ;"Note: Here I could do some error checking, and return
|
---|
672 | ;" result=cAbort if we need to abort.
|
---|
673 | DoMenuQ
|
---|
674 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"DoMenu")
|
---|
675 | quit result
|
---|
676 |
|
---|
677 |
|
---|
678 | DoLookup(Params)
|
---|
679 | ;"Purpose: To take data from XML file, and look if it is already in database
|
---|
680 | ;" -- if so, then put RecNum-IEN of record into variable pointed to by OutVarP
|
---|
681 | ;"Syntax: e.g. <LookupFileInfo id="Kevin" OutVar="MyVar"></LookupFileInfo>
|
---|
682 | ;"Input: Params -- an array loaded with expected parameters. I.e.:
|
---|
683 | ;" Params(cId): the ID of the <Record> data entry.
|
---|
684 | ;" Params(cId)="Kevin" in our example
|
---|
685 | ;" Params(cOutput)=the NAME of a variable to put RecNum-IEN into.
|
---|
686 | ;" Params(cOutput)="MyVar" in example
|
---|
687 | ;"Output: OutVarP is loaded with data, i.e.:
|
---|
688 | ;" @OutVarP@(cRecNum)=81
|
---|
689 | ;" @OutVarP@(cFile)=200
|
---|
690 | ;" @OutVarP@(cGlobal)="^VA(200)"
|
---|
691 | ;" @OutVarP@(cGlobal,cOpen)="^VA(200,"
|
---|
692 | ;"Returns: If should continue execution: 1=OK to continue. 0=abort.
|
---|
693 | ;"Note: Even if <Record> specifies a RecNum="2", this function will STILL do a
|
---|
694 | ;" search and return THAT value, not the "2" in this example.
|
---|
695 |
|
---|
696 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"DoLookup")
|
---|
697 |
|
---|
698 | new Data
|
---|
699 | new RecNumIEN
|
---|
700 | new result set result=cOKToCont
|
---|
701 | new ID set ID=$get(Params(cId))
|
---|
702 | new OutVarP set OutVarP=$get(Params(cOutput))
|
---|
703 |
|
---|
704 | set result=$$DoShow(.Params) ;"Show any associated text as a message
|
---|
705 |
|
---|
706 | if OutVarP="" goto LkDone
|
---|
707 |
|
---|
708 | ;"Parse XML data into a usable form. Verification is done.
|
---|
709 | if '$$GetRInfo(ID,.Data) do goto LkDone
|
---|
710 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Unable to process <Record> section with id='"_ID_"'.")
|
---|
711 | . set result=cAbort ;"0=Abort
|
---|
712 |
|
---|
713 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Parsed data.")
|
---|
714 | set @OutVarP@(cFile)=$get(Data(0,cFile))
|
---|
715 | set @OutVarP@(cGlobal)=$get(Data(0,cFile,cGlobal))
|
---|
716 | set @OutVarP@(cGlobal,cOpen)=$get(Data(0,cFile,cGlobal,cOpen))
|
---|
717 |
|
---|
718 | set result=$$GetRecMatch^TMGDBAPI(.Data,.RecNumIEN) ;"if no prior record, returns 0
|
---|
719 | ;"set RecNumIEN=$$GetRecMatch^TMGDBAPI(.Data) ;"if no prior record, returns 0
|
---|
720 | set @OutVarP@(cRecNum)=RecNumIEN
|
---|
721 |
|
---|
722 | LkDone
|
---|
723 | set result=(+result>0) ;"Change RecNum-IEN into boolean 1 or 0
|
---|
724 | if result=cAbort do ShowError^TMGDEBUG(.PriorErrorFound,"Lookup command failed.")
|
---|
725 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"DoLookup")
|
---|
726 | quit result
|
---|
727 |
|
---|
728 |
|
---|
729 | DoValueLookup(Params)
|
---|
730 | ;"Purpose: To look for a value of a given value in a given record in given file.
|
---|
731 | ;"Syntax: e.g. <LookupFieldValue File="NEW PERSON" RecNum="1" Field=".01" OutVar="MyVar">
|
---|
732 | ;"Input: Params -- an array loaded with expected parameters. I.e.:
|
---|
733 | ;" Params(cFile)="NEW PERSON" in our example
|
---|
734 | ;" Params(cRecNum)="1" in example
|
---|
735 | ;" Params(cField)=".01" in our example (could be Name of field)
|
---|
736 | ;" Params(cOutput)="MyVar"
|
---|
737 | ;"Output: MyVar is loaded with data, i.e.:
|
---|
738 | ;" MyVar(cFile)=200
|
---|
739 | ;" MyVar(cGlobal)="^VA(200)"
|
---|
740 | ;" MyVar(cGlobal,cOpen)="^VA(200,"
|
---|
741 | ;" MyVar(cRecNum)=1
|
---|
742 | ;" MyVar(cField)=.01
|
---|
743 | ;" MyVar(cValue)=xxx <-- the looked-up value
|
---|
744 | ;"Returns: If should continue execution: 1=OK to continue. 0=unsuccessful lookup
|
---|
745 | ;"Note: I am getting values by directly looking into database, rather than use
|
---|
746 | ;" the usual lookup commands. I am doing this so that there will be no
|
---|
747 | ;" 'hidden' data, based on security etc.
|
---|
748 |
|
---|
749 | new result
|
---|
750 |
|
---|
751 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"DoValueLookup")
|
---|
752 |
|
---|
753 | set result=$$ParamSubstitute(.Params)
|
---|
754 | if result=cAbort goto DVLDone
|
---|
755 |
|
---|
756 | set result=$$ValueLookup^TMGDBAPI(.Params)
|
---|
757 |
|
---|
758 | DVLDone
|
---|
759 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"DoValueLookup")
|
---|
760 | quit result
|
---|
761 |
|
---|
762 |
|
---|
763 | DoFileUtility(Params)
|
---|
764 | ;"Purpose: To provide file access/manipulation utilities to script user
|
---|
765 | ;"syntax:
|
---|
766 | ;" <FileUtility File="NEW PERSON" Fn="xxx" RecNum="1" Field=".01" OutVar"MyOutVar" Value="xx" >
|
---|
767 | ;" File: The name of the file to act upon.
|
---|
768 | ;" File may have subnodes (i.e. "NEW PERSON|ALIAS|TITLE")
|
---|
769 | ;" **BUT**, any deletion or set values will only work on top level (i.e. "NEW PERSON")
|
---|
770 | ;" Fn can be on of the following [OPTIONAL]. (Data substitution is allowed)
|
---|
771 | ;" Fn="delete" If Field is not specified:
|
---|
772 | ;" Will cause record RecNum to be deleted.
|
---|
773 | ;" MyOutVar("DELETED")=RecNum of deleted record, or
|
---|
774 | ;" 0 if not found.
|
---|
775 | ;" If Field IS specified:
|
---|
776 | ;" Will delete the value in field, in record RecNum
|
---|
777 | ;" Note: delete is intended only for the highest-level records
|
---|
778 | ;" (i.e. not subfiels, or multiple fields)
|
---|
779 | ;" Note: delete method uses ^DIK to delete the record
|
---|
780 | ;" Fn="info" Will just fill in info below.
|
---|
781 | ;" If Fn not specified, this is default
|
---|
782 | ;" Fn="set" Will put Value into Field, in RecNum, in File (all required)
|
---|
783 | ;" RecNum: [OPTIONAL] Specifies which record to act on. If not
|
---|
784 | ;" specified, then just file info is returned. Data substitution is allowed
|
---|
785 | ;" Field: [OPTIONAL] Specifies which field to act on. Data substitution is allowed
|
---|
786 | ;" OutVar: Needed to get information back from function (but still Optional)
|
---|
787 | ;" Gives name of variable to put info into.
|
---|
788 | ;" Data substitution is allowed.
|
---|
789 | ;"Input: Params -- an array loaded with expected parameters. I.e.:
|
---|
790 | ;" Params(cFile)="NEW PERSON" in our example
|
---|
791 | ;" Params(cFn)="info" or "delete", or "set"
|
---|
792 | ;" Params(cRecNum)="1" in example
|
---|
793 | ;" Params(cField)=".01" in our example (could be Name of field)
|
---|
794 | ;" Params(cOutput)="MyVar"
|
---|
795 | ;"Output: MyVar is loaded with data, i.e.
|
---|
796 | ;" i.e. MyOutVar("FILE")=Filenumber
|
---|
797 | ;" MyOutVar("FILE","FILE")=SubFilenumber <-- only if subnodes input in File name (e.g."ALIAS")
|
---|
798 | ;" MyOutVar("FILE","FILE","FILE")=SubSubFilenumber <-- only if subnodes input in File name (e.g."TITLE")
|
---|
799 | ;" MyOutVar("GLOBAL")="^VA(200)"
|
---|
800 | ;" MyOutVar("GLOBAL, OPEN")="^VA(200,"
|
---|
801 | ;" MyOutVar("RECNUM")=record number
|
---|
802 | ;" MyOutVar("FIELD")=Filenumber
|
---|
803 | ;" MyOutVar("VALUE")=xxxx <=== value of field (PRIOR TO deletion, if deleted)
|
---|
804 | ;" MyOutVar("NEXTREC")=record number after RecNum, or "" if none
|
---|
805 | ;" MyOutVar("PREVREC")=record number before RecNum, or "" if none
|
---|
806 | ;" MyOutVar("FN")=the function executed
|
---|
807 | ;" MyOutVar("NUMRECS")=Number of records in file PRIOR to any deletions
|
---|
808 | ;" MyOutVar("FIRSTREC")=Rec number of first record in file
|
---|
809 | ;" MyOutVar("LASTREC")=Rec number of last record in file
|
---|
810 | ;"Returns: If should continue execution: 1=OK to continue. 0=abort
|
---|
811 | ;"Note: I am getting values by directly looking into database, rather than use
|
---|
812 | ;" the usual lookup commands. I am doing this so that there will be no
|
---|
813 | ;" 'hidden' data, based on security etc.
|
---|
814 |
|
---|
815 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"DoFileUtility")
|
---|
816 |
|
---|
817 | new result
|
---|
818 |
|
---|
819 | set result=$$ParamSubstitute(.Params)
|
---|
820 | if result=cAbort goto DFUTDone
|
---|
821 |
|
---|
822 | set result=$$FileUtility^TMGDBAPI(.Params)
|
---|
823 |
|
---|
824 | DFUTDone
|
---|
825 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"DoFileUtility")
|
---|
826 | quit result
|
---|
827 |
|
---|
828 |
|
---|
829 | DoSearchRec(Params)
|
---|
830 | ;"Purpose: To allow the user to search for a specif record number
|
---|
831 | ;"Syntax: <SearchRec File="PERSON CLASS" InVar="MyInput" OutVar="MyOutput"></SearchRec>
|
---|
832 | ;" File: The name of the file to act upon.
|
---|
833 | ;" InVar: the name of a variable with global scope that will hold lookup info
|
---|
834 | ;" OutVar: the name of variable to receive results
|
---|
835 | ;"Input: Params -- an array loaded with expected parameters. I.e.:
|
---|
836 | ;" Params(cFile)="NEW PERSON" in our example
|
---|
837 | ;" Params(cOutput)="MyOutput"
|
---|
838 | ;" Params(cInput)="MyInput"
|
---|
839 | ;"Note: The format of the input params variable (e.g. 'MyInput') should be as follows:
|
---|
840 | ;" MyInput(FieldNum)=ValueToSearchFor
|
---|
841 | ;" MyInput(FieldNum)=ValueToSearchFor
|
---|
842 | ;" MyInput(FieldNum)=ValueToSearchFor
|
---|
843 | ;" ... etc.
|
---|
844 | ;"Output: MyVar is loaded with data, i.e.
|
---|
845 | ;" MyOutVar("RECNUM")=record number, or 0 if not found
|
---|
846 | ;"Returns: If should continue execution: 1=OK to continue. 0=abort
|
---|
847 |
|
---|
848 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"DoSearchRec")
|
---|
849 |
|
---|
850 | new result set result=cAbort
|
---|
851 | new SrchParams,RecNum,OutVar
|
---|
852 | new MyInput,MyOutput
|
---|
853 |
|
---|
854 | if $$DoShow(.Params)=0 goto DSRDone ;"Show any associated text as a message
|
---|
855 |
|
---|
856 | if TMGDEBUG>0 do ArrayDump^TMGDEBUG("Params") ;"zwr Params(*)
|
---|
857 |
|
---|
858 | set MyInput=$get(Params(cInput))
|
---|
859 | set MyOutput=$get(Params(cOutput))
|
---|
860 | if (MyOutput="")!(MyInput="") goto DSRDone ;"result=cAbort be default
|
---|
861 |
|
---|
862 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"MyInput=",MyInput)
|
---|
863 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"MyOutput=",MyOutput)
|
---|
864 | merge SrchParams=@MyInput
|
---|
865 | set SrchParams(0,cFile)=$get(Params(cFile))
|
---|
866 | set RecNum=$$RecFind^TMGDBAPI(.SrchParams)
|
---|
867 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Found record number: ",RecNum)
|
---|
868 | set @MyOutput@(cRecNum)=RecNum
|
---|
869 | if RecNum=0 goto DSRDone
|
---|
870 | set result=cOKToCont
|
---|
871 |
|
---|
872 | DSRDone
|
---|
873 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"DoSearchRec")
|
---|
874 | quit result
|
---|
875 |
|
---|
876 |
|
---|
877 | DoUpload(Params)
|
---|
878 | ;"Purpose: To take data from XML file, and get it up into the VistA database
|
---|
879 | ;"Syntax: e.g. <UploadRecord id="Kevin"></UploadRecord>
|
---|
880 | ;"Note: ***See documentation in GetRInfo for expected formats
|
---|
881 | ;"Input: Params -- an array that holds all parameters (or is undefined if there were none)
|
---|
882 | ;" Params(cId,cUpperCase) -- the ID ofthe data to upload
|
---|
883 | ;" Expected ID -- the ID of the <Record> data entry. e.g. "Kevin" in our example
|
---|
884 | ;" Params(cOutput)=the NAME of a variable to put RecNum-IEN into. (Optional)
|
---|
885 | ;" i.g. Params(cOutput)="MyVar" will cause MyVar=IEN
|
---|
886 | ;"Returns: If should continue execution: 1=OK to continue. 0=abort.
|
---|
887 |
|
---|
888 | new Data
|
---|
889 | new result set result=cOKToCont
|
---|
890 | new RecNumIEN
|
---|
891 |
|
---|
892 | new OutVarP set OutVarP=$get(Params(cOutput))
|
---|
893 |
|
---|
894 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"DoUpload")
|
---|
895 |
|
---|
896 | set result=$$DoShow(.Params) ;"Show any associated text as a message
|
---|
897 |
|
---|
898 | new ID
|
---|
899 | set ID=$get(Params(cId,cUpperCase))
|
---|
900 | if ID="" do goto ULDone
|
---|
901 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Unable to get ID of file to upload!")
|
---|
902 |
|
---|
903 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Uploading file info -- id="_ID)
|
---|
904 |
|
---|
905 | ;"Parse XML data into a usable form. Verification is done.
|
---|
906 | if '$$GetRInfo(ID,.Data) do goto ULDone
|
---|
907 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Unable to process <Record> section with id='"_ID_"'.")
|
---|
908 | . set result=cAbort ;"0=Abort
|
---|
909 |
|
---|
910 | set RecNumIEN=$get(Data(0,cRecNum),0) ;"Get user-specified Record Num(IEN), or null
|
---|
911 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"User-requested recordnum is (0=not requested): ",RecNumIEN)
|
---|
912 | set result=$$UploadData^TMGDBAPI(.Data,.RecNumIEN)
|
---|
913 | if OutVarP'="" do
|
---|
914 | . set @OutVarP@(cRecNum)=RecNumIEN
|
---|
915 |
|
---|
916 | ULDone
|
---|
917 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Result = ",result)
|
---|
918 | if result=cAbort do ShowError^TMGDEBUG(.PriorErrorFound,"Error uploading data.")
|
---|
919 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"DoUpload")
|
---|
920 | quit result
|
---|
921 |
|
---|
922 |
|
---|
923 |
|
---|
924 | GetRInfo(ID,Data)
|
---|
925 | ;"Purpose: To get record info from the <DATA> section of the XML file,
|
---|
926 | ;" and to store it in the Data variable.
|
---|
927 | ;"Input: ID: The name of the record info to get.
|
---|
928 | ;" e.g. to get the info for this entry:
|
---|
929 | ;" <Record id="Kevin" File="1234.1">
|
---|
930 | ;" Then ID should = "Kevin" (no extra quotes)
|
---|
931 | ;" Data: This is to be an array that is passed by reference
|
---|
932 | ;" Any preexisting contents will be deleted
|
---|
933 | ;" See output below.
|
---|
934 | ;"Note: The syntax of the <Record> block is as follows. Note, <Record>
|
---|
935 | ;" should be a child (i.e. not a grandchild) of the <DATA> block.
|
---|
936 | ;" example:
|
---|
937 | ;" <Record id="InstFile" File="1234.1">
|
---|
938 | ;" or <Record id="InstFile" File="NEW PERSON">
|
---|
939 | ;" or <Record id="InstFile" File="NEW PERSON" RecNum="1">
|
---|
940 | ;" <Field id=".01" MatchThis="true">MyData1</Field>
|
---|
941 | ;" <Field id=".02" MatchValue="John">Bill</Field>
|
---|
942 | ;" <Field id=".03">MyData3</Field>
|
---|
943 | ;" <Field id=".04">MyData4</Field>
|
---|
944 | ;" <Field id="NAME">MyData5</Field>
|
---|
945 | ;" <Field id="ITEM/.01">SubEntry1</Field>
|
---|
946 | ;" <Field id="ITEM/SYNONYM">SE1</Field> ;"Note: SYNONYM here is field .02
|
---|
947 | ;" <Field id="ITEM/INFO">'Some Info'</Field> ;"Note: INFO here is field .03
|
---|
948 | ;" <Field id="ITEM/MENU">SubEntry2</Field> <-- start of 2nd subfile entry
|
---|
949 | ;" <Field id="ITEM/TEXT/INITS">JD</Field> ;"TEXT=.4; INITS=.1
|
---|
950 | ;" <Field id="ITEM/TEXT/CREATOR">Doe,John</Field> ;"CREATOR is field .2
|
---|
951 | ;" </Record>
|
---|
952 | ;"
|
---|
953 | ;" 'id': specifies a name that is used in <UploadRecord> command
|
---|
954 | ;" 'File': specifies the filenumber or formal file name to put info into
|
---|
955 | ;" 'RecNum': an OPTIONAL parameter. If specified, data will be forced into the
|
---|
956 | ;" specified record number. If not specified, then data matching is used
|
---|
957 | ;" to determine where to put record. Data substitution is allowed.
|
---|
958 | ;" A value of 0 will be treated as if no value specified.
|
---|
959 | ;"
|
---|
960 | ;" At least one (and likely many) <Field> entries must exist in the <Record> block
|
---|
961 | ;" Syntax:
|
---|
962 | ;" <Field id=".01">MyDataplacing</Field>
|
---|
963 | ;" <Field id="NAME" MatchThis="true">MyDataplacing</Field>
|
---|
964 | ;" <Field id="ITEM/SYNONYM">M1</Field>
|
---|
965 | ;"
|
---|
966 | ;" 'id' gives the field number or name
|
---|
967 | ;" Multiple field names/numbers may be included here.
|
---|
968 | ;" "ITEM/SYNONYM" means that SYNONYM is a field within
|
---|
969 | ;" the ITEM subfile (a field with multiple entries). Thus
|
---|
970 | ;" field ITEM would be located, then SYNONYM subfield.
|
---|
971 | ;" To have a '/' character as part of the field name, and not
|
---|
972 | ;" to be interpreted as a node divider, then use '//', this will
|
---|
973 | ;" be replaced with '/'.
|
---|
974 | ;" Note: When a field allows multiple entries (like "ITEM" above),
|
---|
975 | ;" then there must be a way to determine group of the data into
|
---|
976 | ;" one entry or another. The field ".01" (or a name that resolves
|
---|
977 | ;" to ".01" will serve this purpose. For example:
|
---|
978 | ;" ITEM|.01 <---- the beginning of one entry
|
---|
979 | ;" ITEM|SYNONYM
|
---|
980 | ;" ITEM|INFO
|
---|
981 | ;" ITEM|MENU <---- beginning of the next entry. (MENU=.01)
|
---|
982 | ;" ITEM|TEXT|INITS
|
---|
983 | ;" ITEM|TEXT|CREATOR
|
---|
984 | ;" 'MatchThis': if value="true", then this entry will be used to
|
---|
985 | ;" search for preexisting record in file. Should only be
|
---|
986 | ;" used for highest levels, i.e. match in subfields not supported
|
---|
987 | ;" 'MatchValue': if specified, then value of entry will be used to
|
---|
988 | ;" search for preexisting record in file. Should only be
|
---|
989 | ;" used for highest levels, i.e. match in subfields not supported
|
---|
990 | ;"
|
---|
991 | ;" The data is found between the <Field></Field> tags.
|
---|
992 | ;" Note: The data values may contain lookup codes. For example
|
---|
993 | ;" <Field id="ITEM|CREATOR">{{Data.Site.Office[EastSide].Field[Doctor]}}</Field>
|
---|
994 | ;" would cause the {{..}} value to be looked up in the corresponding
|
---|
995 | ;" section in the XML file and replaced. Thus the line would be converted to:
|
---|
996 | ;" <Field id="ITEM|CREATOR">Kevin</Field>
|
---|
997 | ;"
|
---|
998 | ;"Output: The Data array will be filed with data. Thus for above example:
|
---|
999 | ;" Data(0,cFile)="1234.1" <-- "NEW PERSON" Note conversion
|
---|
1000 | ;" Data(0,cFile,cGlobal)="^DIC(200)" <-- note, NOT "^DIC(200,"
|
---|
1001 | ;" Data(0,cRecNum)=2 <-- only if user-specified.
|
---|
1002 | ;" Data(0,cEntries)=1
|
---|
1003 | ;" Data(1,".01")="MyData1"
|
---|
1004 | ;" Data(1,".01",cMatchValue)="MyData1"
|
---|
1005 | ;" Data(1,".02")="Bill"
|
---|
1006 | ;" Data(1,".02",cMatchValue)="John"
|
---|
1007 | ;" Data(1,".03")="MyData3"
|
---|
1008 | ;" Data(1,".04")="MyData4"
|
---|
1009 | ;" Data(1,".06")="MyData5" <-- note "NAME" was converted to ".06"
|
---|
1010 | ;" Data(1,".07",0,cEntries)=2 <-- "ITEM" converted to ".07"
|
---|
1011 | ;" Data(1,".07",1,".01")="SubEntry1"
|
---|
1012 | ;" Data(1,".07",1,".02")="SE1"
|
---|
1013 | ;" Data(1,".07",1,".03")="'Some Info'"
|
---|
1014 | ;" Data(1,".07",2,".01")="SubEntry2"
|
---|
1015 | ;" Data(1,".07",2,".02")="SE2"
|
---|
1016 | ;" Data(1,".07",2,".04",0,cEntries)=1 ;"TEXT converted to .04
|
---|
1017 | ;" Data(1,".07",2,".04",1,".01")="JD"
|
---|
1018 | ;" Data(1,".07",2,".04",1,".02")="DOE,JOHN"
|
---|
1019 | ;" ADDENDUM
|
---|
1020 | ;" Data(1,".01",cFlags)=any flags specified for given field.
|
---|
1021 | ;" only present if user specified.
|
---|
1022 |
|
---|
1023 |
|
---|
1024 | ;" Note: The output is somewhat validated, in that if file NAME is given
|
---|
1025 | ;" instead of a number, the name will be converted. The same applies
|
---|
1026 | ;" for field NUMBERS. This ensures that the file exists, and
|
---|
1027 | ;" puts the global reference in the array
|
---|
1028 | ;"Result: 1 if valid data in Data, 0 if data invalid
|
---|
1029 |
|
---|
1030 | new result
|
---|
1031 | new ChildNode
|
---|
1032 | new FileNode
|
---|
1033 | new Text,TextArray
|
---|
1034 | new NodeName,AtrN,AtrVal
|
---|
1035 | new AtrMatch,MatchValue
|
---|
1036 | new MatchThis
|
---|
1037 | new Entries set Entries=0
|
---|
1038 | new Field,FieldNumber
|
---|
1039 | new RecNum
|
---|
1040 | new Flags
|
---|
1041 | set result=cOKToCont
|
---|
1042 | set ChildNode=0
|
---|
1043 | set Entries=0
|
---|
1044 | new FileNumber,FileName,File
|
---|
1045 | new index
|
---|
1046 | new DataP set DataP="Data"
|
---|
1047 | new EntryNumber set EntryNumber=0 ;"was 1
|
---|
1048 |
|
---|
1049 | new InitDebug set InitDebug=TMGDEBUG
|
---|
1050 | ;"set TMGDEBUG=0 ;"Force this function to not put out TMGDEBUG info.
|
---|
1051 |
|
---|
1052 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"GetRInfo")
|
---|
1053 |
|
---|
1054 | if $data(ID)'=0 do
|
---|
1055 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"var ID=",ID)
|
---|
1056 | else do
|
---|
1057 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"var ID=(empty)")
|
---|
1058 |
|
---|
1059 | if $data(ID)'=0 do
|
---|
1060 | . set FileNode=$$GetDescIDNode(DataNode,cRecord,ID)
|
---|
1061 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Node with ",cRecord,"=",FileNode)
|
---|
1062 | else do
|
---|
1063 | . set FileNode=0
|
---|
1064 | if FileNode=0 do goto GInfPast
|
---|
1065 | . set result=cAbort
|
---|
1066 | . do ShowError^TMGDEBUG(.PriorErrorFound,"File entry named '"_ID_"' not found.")
|
---|
1067 |
|
---|
1068 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Looking for user-specified record number in node: ",FileNode)
|
---|
1069 | set RecNum=$$GetAtrVal^TMGXMLT(XMLHandle,FileNode,cRecNum) ;"get user-specified RecNum IEN (optional)
|
---|
1070 | set result=$$CheckSubstituteData(.RecNum)
|
---|
1071 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Specified RecNum='",RecNum,"'")
|
---|
1072 | if +RecNum>0 set Data(0,cRecNum)=RecNum
|
---|
1073 |
|
---|
1074 | set File=$$GetAtrVal^TMGXMLT(XMLHandle,FileNode,cFile)
|
---|
1075 | set Data(0,cFile)=File
|
---|
1076 | set result=$$SetupFileNum^TMGDBAPI(.Data)
|
---|
1077 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Setup file number result=",result)
|
---|
1078 | if result=cAbort do goto GInfPast
|
---|
1079 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Unable to set up file '"_File_"'.")
|
---|
1080 | set FileNumber=$get(Data(0,cFile),-1)
|
---|
1081 | if FileNumber=-1 do goto GInfQuit
|
---|
1082 | . set result=cAbort
|
---|
1083 |
|
---|
1084 | GInfLoop
|
---|
1085 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Starting GInfLoop")
|
---|
1086 | set ChildNode=$$CHILD^MXMLDOM(XMLHandle,FileNode,ChildNode)
|
---|
1087 | if ChildNode=0 goto GInfPast
|
---|
1088 | set NodeName=$$GetNName^TMGXMLT(XMLHandle,ChildNode)
|
---|
1089 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Name="_NodeName)
|
---|
1090 | if NodeName'=cField goto GInfLoop
|
---|
1091 | set Text=$$Get1NText^TMGXMLT(XMLHandle,ChildNode,.TextArray)
|
---|
1092 | if $data(TextArray(2)) do
|
---|
1093 | . merge Text(cText)=TextArray
|
---|
1094 |
|
---|
1095 | if $$UP^XLFSTR($$GetAtrVal^TMGXMLT(XMLHandle,ChildNode,cMatchThis))=cTrue do
|
---|
1096 | . set MatchValue=Text
|
---|
1097 | set MatchValue=$get(MatchValue)
|
---|
1098 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Attrib Match value='",MatchValue,"'")
|
---|
1099 | set Entries=Entries+1
|
---|
1100 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Entries='",Entries,"'")
|
---|
1101 |
|
---|
1102 | set Field=$$GetAtrVal^TMGXMLT(XMLHandle,ChildNode,cId) ;"May get either a name or a number
|
---|
1103 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Field='",Field,"'")
|
---|
1104 |
|
---|
1105 | ;"Protect any //'s by converting to ~~'s
|
---|
1106 | set Field=$$Substitute^TMGSTUTL(.Field,c2NodeDiv,cProtect)
|
---|
1107 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"After substitution, Field '",cId,"'=",Field)
|
---|
1108 |
|
---|
1109 | set Flags=$$GetAtrVal^TMGXMLT(XMLHandle,ChildNode,cFlags) ;"Get any flags that might exist.
|
---|
1110 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Flags for node #",ChildNode," = '",Flags,"'")
|
---|
1111 |
|
---|
1112 | ;"Allow recursive calls via ProcessRNode
|
---|
1113 | set result=$$ProcessRNode(DataP,Field,.Text,.EntryNumber,FileNumber,0,MatchValue,Flags)
|
---|
1114 | if result=cAbort goto GInfQuit
|
---|
1115 | ;"temp ... set EntryNumber=EntryNumber+1
|
---|
1116 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"EntryNumber=",EntryNumber)
|
---|
1117 |
|
---|
1118 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Completed loop cycle (maybe there will be more to come)")
|
---|
1119 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"------------")
|
---|
1120 | goto GInfLoop
|
---|
1121 |
|
---|
1122 | GInfPast
|
---|
1123 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Done with loop")
|
---|
1124 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"------------")
|
---|
1125 |
|
---|
1126 | if $data(Data(0,cEntries))=0 do goto GInfQuit
|
---|
1127 | . set result=cAbort
|
---|
1128 |
|
---|
1129 | ;"Ensure that there is at least a .01 field. Required for every record
|
---|
1130 | ;"Note: I think that other files have multiple KEY fields.... I am not checking
|
---|
1131 | ;" for this (perhaps I should later??)
|
---|
1132 | new bFound set bFound=0
|
---|
1133 | for index=1:1:Data(0,cEntries) do quit:bFound
|
---|
1134 | . ;"if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Data(",index,",.01)='",$get(Data(index,".01")),"'")
|
---|
1135 | . if $data(Data(index,".01")) set bFound=1
|
---|
1136 |
|
---|
1137 | if bFound=0 do goto GInfQuit
|
---|
1138 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Data entry did not specify any entry for field .01")
|
---|
1139 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Here is data:")
|
---|
1140 | . if TMGDEBUG do ArrayDump^TMGDEBUG("Data") ;"zwr Data(*)
|
---|
1141 | . set result=cAbort
|
---|
1142 |
|
---|
1143 | GInfQuit
|
---|
1144 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"GetRInfo")
|
---|
1145 | set TMGDEBUG=InitDebug
|
---|
1146 | quit result
|
---|
1147 |
|
---|
1148 |
|
---|
1149 | ProcessRNode(DataP,Field,Text,EntryNumber,FileNumber,DoingSubNodes,MatchValue,Flags)
|
---|
1150 | ;"Purpose: Allow for recursive calling when doing GetRInfo
|
---|
1151 | ;" This takes one entry and processes it.
|
---|
1152 | ;"Input: DataP: The 'name' of the data array -- like this: "Data(1)"
|
---|
1153 | ;" Field: a field name with 0..n subnodes
|
---|
1154 | ;" i.e. "ITEM", OR "ITEM|NUMBER", OR "ITEM|NUMBER|ID"
|
---|
1155 | ;" Text: the value that should be put into field. should be passed by REFERENCE
|
---|
1156 | ;" Text will have the following format:
|
---|
1157 | ;" Text="First line of text"
|
---|
1158 | ;" Text(cText,1)="First line of text" <-- only present if multiple
|
---|
1159 | ;" Text(cText,2)="Second line of text" lines of text present.
|
---|
1160 | ;" EntryNumber: The current entry number. Should be passed by REFERENCE
|
---|
1161 | ;" FileNumber: the current file number, or sub-filenumber. DON'T PASS BY REFERENCE
|
---|
1162 | ;" The first node (i.e. "ITEM") should be field in FileNumber
|
---|
1163 | ;" DoingSubNodes: 1 if true (changes behavior or entry numbering for subnodes), 0 otherwise
|
---|
1164 | ;" //AtrMatch: if this field should be matched for during DB lookup
|
---|
1165 | ;" MatchValue: Value to looking in database when finding matching record.
|
---|
1166 | ;" Flags: any user specified flags for field
|
---|
1167 | ;"Result: Returns success 1=OK to continue. 0=Abort
|
---|
1168 |
|
---|
1169 | ;"Note: This entry--><Field id="ITEM|TEXT|CREATOR">Doe,John</Field>
|
---|
1170 | ;"Should result it--> Data(6,".07",2,".04",1,".02")="DOE,JOHN"
|
---|
1171 | ;"See data format description in GetRInfo
|
---|
1172 |
|
---|
1173 | new PartA,PartB
|
---|
1174 | new tempA,tempB
|
---|
1175 | new result set result=cOKToCont
|
---|
1176 | new cFieldNumber set cFieldNumber="Field Number"
|
---|
1177 |
|
---|
1178 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"ProcessRNode")
|
---|
1179 |
|
---|
1180 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"DataP='",$get(DataP),"'")
|
---|
1181 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"File number=",$get(FileNumber))
|
---|
1182 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Field=",$get(Field))
|
---|
1183 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"EntryNumber=",$get(EntryNumber))
|
---|
1184 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"MatchValue='",$get(MatchValue),"'")
|
---|
1185 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Flags='",$get(Flags),"'")
|
---|
1186 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"DoingSubNodes=",$get(DoingSubNodes))
|
---|
1187 |
|
---|
1188 | new SpliceArray
|
---|
1189 | new temp
|
---|
1190 |
|
---|
1191 | if Field[cNodeDiv do ;"Parse 'ITEM|NUMBER|ID' into 'ITEM', 'NUMBER', 'ID'
|
---|
1192 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Multiple nodes found for field. Processing...")
|
---|
1193 | . do CleaveStr^TMGSTUTL(.Field,cNodeDiv,.PartB)
|
---|
1194 | . set FieldNumber=$$GetNumField^TMGDBAPI(FileNumber,Field)
|
---|
1195 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Parsed off first part of Field. Looking at only '",Field,"'")
|
---|
1196 | . ;"Note: this does NOT handle processesing of more than 2 nodes.
|
---|
1197 | . if PartB'=cNull do ;"If PartB has data, then PartB(cFieldNumber) will also have data
|
---|
1198 | . . if PartB=".01" do
|
---|
1199 | . . . set PartB(cFieldNumber)=".01"
|
---|
1200 | . . else do
|
---|
1201 | . . . new BFileNumber
|
---|
1202 | . . . set BFileNumber=$$GetSubFileNumber^TMGDBAPI(FileNumber,FieldNumber) ;"get 'file number' of subfile
|
---|
1203 | . . . if BFileNumber'=0 do
|
---|
1204 | . . . . set PartB(cFieldNumber)=$$GetNumField^TMGDBAPI(BFileNumber,PartB)
|
---|
1205 | . . . else set PartB(cFieldNumber)=0
|
---|
1206 | . . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Will deal with '",PartB,"' later")
|
---|
1207 |
|
---|
1208 | set Field=$$Substitute^TMGSTUTL(.Field,cProtect,cNodeDiv) ;"convert protected ||'s back from }}'s to single |
|
---|
1209 | if $data(PartB) set PartB=$$Substitute^TMGSTUTL(.PartB,cProtect,cNodeDiv)
|
---|
1210 |
|
---|
1211 | set FieldNumber=+Field
|
---|
1212 | if FieldNumber=0 do
|
---|
1213 | . set FieldNumber=$$GetNumField^TMGDBAPI(FileNumber,Field)
|
---|
1214 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Converted '",Field,"' to field number ",FieldNumber)
|
---|
1215 | else if $$VFIELD^DILFD(FileNumber,Field)=0 do goto PFNDone
|
---|
1216 | . do ShowError^TMGDEBUG(.PriorErrorFound,Field_" is not a valid field number in file "_FileNumber)
|
---|
1217 | . set result=cAbort
|
---|
1218 | if FieldNumber=0 do goto PFNDone
|
---|
1219 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Unable to convert field '"_Field_"' to a field number. (Hint: If this name is supposed to contain multiple nodes, did you use '"_cNodeDiv_"' as a divider?)")
|
---|
1220 | . set result=cAbort
|
---|
1221 |
|
---|
1222 | if FieldNumber=.01 do
|
---|
1223 | . set EntryNumber=EntryNumber+1 ;"Test this!!
|
---|
1224 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Found .01 field. Incrementing EntryNumber to "_EntryNumber)
|
---|
1225 |
|
---|
1226 |
|
---|
1227 | if $data(PartB) do
|
---|
1228 | . ;"If there are subnodes, then search if current entry should be under a prior entry
|
---|
1229 | . if $data(@DataP@(EntryNumber-1,FieldNumber,0,cEntries)) do
|
---|
1230 | . . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"EntryNumber=",EntryNumber)
|
---|
1231 | . . ;"set EntryNumber=EntryNumber-1
|
---|
1232 | . . set DoingSubNodes=1
|
---|
1233 | . . ;"if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Attaching current data as a subnode of prior entry.")
|
---|
1234 | . . ;"if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Changing EntryNumber to ",EntryNumber)
|
---|
1235 |
|
---|
1236 | if DoingSubNodes=0 goto PFNPast
|
---|
1237 | if (EntryNumber=0) do goto PFNDone
|
---|
1238 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"No '.01' field found yet, so skipping processing.")
|
---|
1239 |
|
---|
1240 | PFNPast
|
---|
1241 | if $data(PartB)=0 do
|
---|
1242 | . set result=$$CheckSubstituteData(.Text) ;"Do any data lookup needed
|
---|
1243 | . if result=cAbort do
|
---|
1244 | . . do ShowError^TMGDEBUG(.PriorErrorFound,"Unable to do data lookup: "_Text)
|
---|
1245 | . else do
|
---|
1246 | . . ;"HERE IS WHERE WE PUT THE INFO INTO THE DATA ARRAY.
|
---|
1247 | . . set @DataP@(EntryNumber,FieldNumber)=Text
|
---|
1248 | . . set @DataP@(EntryNumber,FieldNumber,"FieldName")=$get(Field) ;"mainly for debugging.
|
---|
1249 | . . if Flags'=" " set @DataP@(EntryNumber,FieldNumber,cFlags)=Flags
|
---|
1250 | . . new FieldInfo
|
---|
1251 | . . do GetFieldInfo^TMGDBAPI(FileNumber,FieldNumber,"FieldInfo")
|
---|
1252 | . . if $get(FieldInfo("TYPE"))="WORD-PROCESSING" do
|
---|
1253 | . . . do WPHandle(DataP,EntryNumber,FieldNumber,.Text)
|
---|
1254 | . . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Setting ",DataP,"(",EntryNumber,",",FieldNumber,")=",Text)
|
---|
1255 | . . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Flags were: '",Flags,"'")
|
---|
1256 | else do
|
---|
1257 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"DoingSubNodes=",DoingSubNodes,", PartB='",$get(PartB),"'")
|
---|
1258 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Doing subnodes, so did NOT set ",DataP,"(",EntryNumber,",",FieldNumber,")=",Text)
|
---|
1259 |
|
---|
1260 | if result=cAbort goto PFNDone
|
---|
1261 |
|
---|
1262 | if FieldNumber=.01 set MatchValue=Text
|
---|
1263 |
|
---|
1264 | if (MatchValue'="")!(FieldNumber=.01) do
|
---|
1265 | . ;"set @DataP@(EntryNumber,FieldNumber,cMatchThis)=1 ;"i.e. true
|
---|
1266 | . set @DataP@(EntryNumber,FieldNumber,cMatchValue)=MatchValue
|
---|
1267 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Setting ",DataP,"(",EntryNumber,",",FieldNumber,",",cMatchValue,")=",MatchValue)
|
---|
1268 |
|
---|
1269 | set @DataP@(0,cEntries)=EntryNumber
|
---|
1270 | set @DataP@(0,cFile)=FileNumber
|
---|
1271 |
|
---|
1272 | if $data(PartB) do ;"I.e. we have subnodes. -- process
|
---|
1273 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Subnodes detected. Here is where we deal with that '",PartB,"'")
|
---|
1274 | . new SubEntryNumber
|
---|
1275 | . set SubEntryNumber=$get(@DataP@(EntryNumber,FieldNumber,0,cEntries),0)
|
---|
1276 | . if (PartB(cFieldNumber)=".01")!(SubEntryNumber=0) do
|
---|
1277 | . . ;"test ... set SubEntryNumber=SubEntryNumber+1
|
---|
1278 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"SubEntryNumber=",SubEntryNumber)
|
---|
1279 | . set FileNumber=$$GetSubFileNumber^TMGDBAPI(FileNumber,FieldNumber) ;"get 'file number' of subfile
|
---|
1280 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"file number=",FileNumber)
|
---|
1281 | . if FileNumber=0 quit
|
---|
1282 | . set DataP=$name(@DataP@(EntryNumber,FieldNumber))
|
---|
1283 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Calling self recursively")
|
---|
1284 | . new SubFlags set SubFlags=Flags ;"SubFlags=" "
|
---|
1285 | . new SubMatchValue set SubMatchValue=""
|
---|
1286 | . set result=$$ProcessRNode(DataP,PartB,.Text,.SubEntryNumber,FileNumber,1,SubMatchValue,SubFlags) ;"Call self recursively
|
---|
1287 |
|
---|
1288 | PFNDone
|
---|
1289 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"ProcessRNode")
|
---|
1290 | quit result
|
---|
1291 |
|
---|
1292 | WPHandle(DataP,EntryNumber,FieldNumber,Text)
|
---|
1293 | ;"Purpose: to process word-processing fields for ProcessRNode()
|
---|
1294 | ;" It will get text into form ready for use by FILE^DIE
|
---|
1295 | ;"Input: DataP: The 'name' of the data array -- like this: "Data(1)"
|
---|
1296 | ;" EntryNumber: The current entry number. Should be passed by REFERENCE
|
---|
1297 | ;" FileNumber: the current file number, or sub-filenumber. DON'T PASS BY REFERENCE
|
---|
1298 | ;" The first node (i.e. "ITEM") should be field in FileNumber
|
---|
1299 | ;" Text: the value that should be put into field. should be passed by REFERENCE
|
---|
1300 | ;" Text will have the following format:
|
---|
1301 | ;" Text="First line of text"
|
---|
1302 | ;" Text(cText,1)="First line of text" <-- only present if multiple
|
---|
1303 | ;" Text(cText,2)="Second line of text" lines of text present.
|
---|
1304 | ;"Result: none
|
---|
1305 |
|
---|
1306 | new Array,temp
|
---|
1307 | new result
|
---|
1308 |
|
---|
1309 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"WPHandle")
|
---|
1310 |
|
---|
1311 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Here is Text to use to put into WP field:")
|
---|
1312 | if TMGDEBUG do ArrayDump^TMGDEBUG("Text")
|
---|
1313 | if $data(Text(cText)) do
|
---|
1314 | . set result=$$FormatArray^TMGSTUTL(.Text,.Array,"\n")
|
---|
1315 | else do
|
---|
1316 | . do CleaveToArray^TMGSTUTL(Text,"\n",.Array,1)
|
---|
1317 |
|
---|
1318 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Here is array after processing, ready to put into WP field:")
|
---|
1319 | if TMGDEBUG do ArrayDump^TMGDEBUG("Array")
|
---|
1320 |
|
---|
1321 | merge @DataP@(EntryNumber,FieldNumber,"WP")=Array
|
---|
1322 | set @DataP@(EntryNumber,FieldNumber)=$name(@DataP@(EntryNumber,FieldNumber,"WP"))
|
---|
1323 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Setting: ",DataP,"(",EntryNumber,",",FieldNumber,")=",$name(@DataP@(EntryNumber,FieldNumber,"WP")))
|
---|
1324 |
|
---|
1325 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"WPHandle")
|
---|
1326 | quit
|
---|
1327 |
|
---|
1328 |
|
---|
1329 | CheckArraySubst(TextArray)
|
---|
1330 | ;"Purpose: Accept a text array, and scan all lines for any needed data substitution
|
---|
1331 | ;"Input: TextArray -- should be passed by reference.
|
---|
1332 | ;" any number scheme of lines may be used.
|
---|
1333 | ;"Output -- Text array is changed, if passed by reference
|
---|
1334 | ;"Result: 1=OK to continue, 0=Error (data requested, but not found)
|
---|
1335 |
|
---|
1336 | new lineI,Count
|
---|
1337 | new OneLine
|
---|
1338 | new result set result=cOKToCont
|
---|
1339 |
|
---|
1340 | if $data(TextArray)'=10 goto CKASq
|
---|
1341 |
|
---|
1342 | set lineI=$Order(TextArray(""))
|
---|
1343 | for do quit:(lineI="")!(result=cAbort)
|
---|
1344 | . set OneLine=TextArray(lineI)
|
---|
1345 | . set result=$$CheckSubstituteData(.OneLine) ;"Do any data lookup needed
|
---|
1346 | . set TextArray(lineI)=OneLine
|
---|
1347 | . set lineI=$Order(TextArray(lineI))
|
---|
1348 |
|
---|
1349 | CKASq
|
---|
1350 | quit result
|
---|
1351 |
|
---|
1352 | ParamSubstitute(Params)
|
---|
1353 | ;"Purpose: To accept an array of parameters, and do data substitution on all entries
|
---|
1354 | ;"Input: Params: an array of parameters
|
---|
1355 | ;"Result: 1=OK to continue, 0=Error (data requested, but not found)
|
---|
1356 |
|
---|
1357 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"ParamSubstitute")
|
---|
1358 |
|
---|
1359 | new result set result=cAbort
|
---|
1360 | if $data(Params)=0 goto PStDone
|
---|
1361 | new index
|
---|
1362 |
|
---|
1363 | set index=$order(Params(""))
|
---|
1364 | for do quit:(index="")!(result=cAbort)
|
---|
1365 | . if index="" quit
|
---|
1366 | . new s
|
---|
1367 | . if $data(Params(index))#10'=0 do
|
---|
1368 | . . set s=Params(index)
|
---|
1369 | . . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Looking at Param(",index,")=",s)
|
---|
1370 | . . set result=$$CheckSubstituteData(.s)
|
---|
1371 | . . if result=cAbort quit
|
---|
1372 | . . set Params(index)=s
|
---|
1373 | . else do
|
---|
1374 | . . new subindex
|
---|
1375 | . . set subindex=$order(Params(index,""))
|
---|
1376 | . . for do quit:(subindex="")!(result=cAbort)
|
---|
1377 | . . . set s=Params(index,subindex)
|
---|
1378 | . . . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Looking at Param("_index_","_subindex_")=",s)
|
---|
1379 | . . . set result=$$CheckSubstituteData(.s)
|
---|
1380 | . . . if result=cAbort quit
|
---|
1381 | . . . set Params(index)=s
|
---|
1382 | . . . set subindex=$order(Params(index,subindex))
|
---|
1383 | . set index=$order(Params(index))
|
---|
1384 |
|
---|
1385 | PStDone
|
---|
1386 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"ParamSubstitute")
|
---|
1387 | quit result
|
---|
1388 |
|
---|
1389 | CheckSubstituteData(Text)
|
---|
1390 | ;"Purpose: To look for data-substitution codes (i.e. {{...}}), and if
|
---|
1391 | ;" found, to replace with data from XML file
|
---|
1392 | ;"Input: A line of text that may or may not have codes. ** Should be passed by reference
|
---|
1393 | ;"Output: Text is modified if passed by reference
|
---|
1394 | ;"Result: 1=OK to continue, 0=Error (data requested, but not found, or error occured)
|
---|
1395 | ;"Note: Nesting is allowed, and all instances of {{...}} will be substituted
|
---|
1396 |
|
---|
1397 | new PartA,PartB,PartC,RefB
|
---|
1398 | new result set result=cOKToCont
|
---|
1399 |
|
---|
1400 | new InitDebug set InitDebug=TMGDEBUG
|
---|
1401 | set TMGDEBUG=0 ;"Force this function to not put out TMGDEBUG info.
|
---|
1402 |
|
---|
1403 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"CheckSubstituteData")
|
---|
1404 |
|
---|
1405 | CKSubL1 ;"Check if Code contains a data reference
|
---|
1406 | if $$NestSplit^TMGSTUTL(.Text,cDataOpen,cDataClose,.PartA,.PartB,.PartC)=0 goto CkSubDone
|
---|
1407 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Reference to data found... replacing now.")
|
---|
1408 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Initline: '",Text,"'")
|
---|
1409 |
|
---|
1410 | set RefB=$$GetData(PartB)
|
---|
1411 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Looked up data: '",RefB,"'")
|
---|
1412 | if RefB="" do goto CkSubDone
|
---|
1413 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Error. Unable to find data reference: "_PartB)
|
---|
1414 | . set result=cAbort
|
---|
1415 | set Text=PartA_RefB_PartC ;"reassemble new code line
|
---|
1416 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"After replacement, line='",Text,"'")
|
---|
1417 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"---------------------")
|
---|
1418 | goto CKSubL1
|
---|
1419 |
|
---|
1420 | CkSubDone
|
---|
1421 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"CheckSubstituteData")
|
---|
1422 | set TMGDEBUG=InitDebug
|
---|
1423 | quit result
|
---|
1424 |
|
---|
1425 |
|
---|
1426 | DoJump(Params)
|
---|
1427 | ;"Purpose: To allow limited program flow control
|
---|
1428 | ;"Syntax: e.g. <Jump condition="if State=1" label="C"></Jump>
|
---|
1429 | ;"Input: Params -- an array containg parameters to run
|
---|
1430 | ;" Params(cCondition): M code executed to determine whether to jump
|
---|
1431 | ;" e.g. Params(cCondition)="if State=2"
|
---|
1432 | ;" Params(cLabel): The name of the block to jump to.
|
---|
1433 | ;" Params(cLabel)="TargetLabel"
|
---|
1434 | ;"Note: The expected syntax of the label is: <Label>B</Label>
|
---|
1435 | ;" In this example, the label name is "B"
|
---|
1436 | ;"Returns: If should continue execution: 1=OK to continue. 0=abort.
|
---|
1437 |
|
---|
1438 | new result
|
---|
1439 | set result=cOKToCont
|
---|
1440 | new CondBool set CondBool=1
|
---|
1441 |
|
---|
1442 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"DoJump")
|
---|
1443 |
|
---|
1444 | new CondCode set CondCode=$get(Params(cCondition))
|
---|
1445 | set result=$$CheckSubstituteData(.CondCode)
|
---|
1446 | if result=cAbort goto DJDone
|
---|
1447 | new Label set Label=$get(Params(cLabel))
|
---|
1448 | set result=$$CheckSubstituteData(.Label)
|
---|
1449 | if result=cAbort goto DJDone
|
---|
1450 |
|
---|
1451 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Condition code='"_CondCode_"'")
|
---|
1452 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Label="_Label)
|
---|
1453 |
|
---|
1454 | ;"Note: Here I trap errors that might be returned from xecute,
|
---|
1455 | ;" and set result=cAbort to cause script abort
|
---|
1456 | if CondCode'="" do
|
---|
1457 | . new $etrap set $etrap="do DoJErrTrap^TMGXINST"
|
---|
1458 | . set ^TMP("TMG",$J,"trap")=cOKToCont
|
---|
1459 | . xecute CondCode
|
---|
1460 | . set CondBool=$TEST
|
---|
1461 | . set result=^TMP("TMG",$J,"trap")
|
---|
1462 | . if result=cAbort do
|
---|
1463 | . . do ShowError^TMGDEBUG(.PriorErrorFound,"Error executing Jump conditional code: \n"_CondCode)
|
---|
1464 | else do
|
---|
1465 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"No condition code given, so should already have set bool")
|
---|
1466 |
|
---|
1467 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"CondBool",CondBool)
|
---|
1468 |
|
---|
1469 | if (CondBool)&(Label'="")&(result=cOKToCont) do
|
---|
1470 | . set result=$$DoShow(.Params) ;"Show any associated text as a message
|
---|
1471 | . new OldNode set OldNode=ExecNode
|
---|
1472 | . set ExecNode=$$GetLabelNode(Label)
|
---|
1473 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Changed point of execution from ",OldNode," to ",ExecNode)
|
---|
1474 | . if ExecNode=0 do
|
---|
1475 | . . do ShowError^TMGDEBUG(.PriorErrorFound,"In Jump instruction, label '"_Label_"' not found.")
|
---|
1476 | . . set result=cAbort ;"i.e. abort
|
---|
1477 | else do
|
---|
1478 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Jump not done.")
|
---|
1479 |
|
---|
1480 | DJDone
|
---|
1481 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"DoJump")
|
---|
1482 | if result=cAbort do ShowError^TMGDEBUG(.PriorErrorFound,"Jump command failed.")
|
---|
1483 |
|
---|
1484 | quit result
|
---|
1485 |
|
---|
1486 |
|
---|
1487 | ;"=========================================================
|
---|
1488 | ;"DoJump Error trap routine
|
---|
1489 | ;"=========================================================
|
---|
1490 | DoJErrTrap
|
---|
1491 | set $etrap=""
|
---|
1492 | set $ecode=""
|
---|
1493 | set ^TMP("TMG",$J,"trap")=cAbort
|
---|
1494 | quit
|
---|
1495 | ;"=========================================================
|
---|
1496 | ;"DoJump End of Error trap routine
|
---|
1497 | ;"=========================================================
|
---|
1498 |
|
---|
1499 |
|
---|
1500 |
|
---|
1501 | GetLabelNode(Label)
|
---|
1502 | ;"Purpose: Scan through <Script> section for a <Label> that matches
|
---|
1503 | ;"Input: Label: the name to search for (case insensitive)
|
---|
1504 | ;"Results: the handle of the node sought, or 0 if not found
|
---|
1505 |
|
---|
1506 | new ChildNode
|
---|
1507 | set ChildNode=0
|
---|
1508 |
|
---|
1509 | GLNLoop set ChildNode=$$CHILD^MXMLDOM(XMLHandle,ScriptNode,ChildNode)
|
---|
1510 | if ChildNode=0 goto GLNQuit
|
---|
1511 | if $$UP^XLFSTR($$Get1NText^TMGXMLT(XMLHandle,ChildNode))=$$UP^XLFSTR(Label) goto GLNQuit
|
---|
1512 | goto GLNLoop
|
---|
1513 |
|
---|
1514 | GLNQuit quit ChildNode
|
---|
1515 |
|
---|
1516 |
|
---|
1517 | GetData(Ref)
|
---|
1518 | ;"Purpose: To get data from the <DATA> section of the XML file
|
---|
1519 | ;"Input: Ref: the refrence path.
|
---|
1520 | ;" e.g. Data.Site.Office[EastSide].Field[OpenDate],
|
---|
1521 | ;" when used with the following data section...
|
---|
1522 | ;" <Data>
|
---|
1523 | ;" <Site>
|
---|
1524 | ;" <Office id="EastSide">
|
---|
1525 | ;" <Field id="Doctor">Kevin</Field>
|
---|
1526 | ;" <Field id="OpenDate">12/1/04</Field>
|
---|
1527 | ;" </Office>
|
---|
1528 | ;" </Site>
|
---|
1529 | ;" </Data>
|
---|
1530 | ;" will return the value of '12/1/04'
|
---|
1531 | ;"
|
---|
1532 | ;" Alternative acceptible input:
|
---|
1533 | ;" e.g. MVar.SomeVar
|
---|
1534 | ;" This will retrieve the value of variable 'SomeVar'
|
---|
1535 | ;" that is defined in the M language, i.e. a local variable
|
---|
1536 | ;" that might have been set in some M code.
|
---|
1537 | ;" The name for SomeVar is case-specific.
|
---|
1538 | ;"
|
---|
1539 | ;"Note: The first node must be 'Data' or 'MVar'
|
---|
1540 | ;"Returns: the value requested, or "" if not found.
|
---|
1541 |
|
---|
1542 | new result set result=""
|
---|
1543 |
|
---|
1544 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"GetData")
|
---|
1545 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Ref to search for="_Ref)
|
---|
1546 |
|
---|
1547 | if $data(Ref)=0 goto QGetDat
|
---|
1548 |
|
---|
1549 | new Segment
|
---|
1550 | new SegNode
|
---|
1551 | new ID
|
---|
1552 |
|
---|
1553 | set Segment=$$ParseSeg(.Ref,.ID)
|
---|
1554 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Segment="_Segment)
|
---|
1555 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"ID=["_ID_"]")
|
---|
1556 | if $$UP^XLFSTR(Segment)=cData goto GetData1
|
---|
1557 | if $$UP^XLFSTR(Segment)='cMVar goto QGetDat
|
---|
1558 |
|
---|
1559 | ;"Here we are dealing with {{MVar.SomeVar}} pattern
|
---|
1560 | ;"Get name of variable to access.
|
---|
1561 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Found request to access M variable: ",ID)
|
---|
1562 | set Segment=$$ParseSeg(.Ref,.ID) ;"ID to be ignored.
|
---|
1563 | set result=$get(@Segment)
|
---|
1564 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Requested variable: ",Segment,"= '",result,"'")
|
---|
1565 | goto QGetDat
|
---|
1566 |
|
---|
1567 | GetData1
|
---|
1568 | if $data(DataNode)=0 goto QGetDat ;"Occurs if error box occurs before full XML parse
|
---|
1569 | set SegNode=DataNode
|
---|
1570 | GetData2
|
---|
1571 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Getting ready to parse segment....")
|
---|
1572 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Ref="_Ref)
|
---|
1573 | set Segment=$$ParseSeg(.Ref,.ID)
|
---|
1574 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Segment="_Segment)
|
---|
1575 | set SegNode=$$GetDescIDNode(SegNode,Segment,ID)
|
---|
1576 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"SegNode=#"_SegNode)
|
---|
1577 | if SegNode=0 goto QGetDat
|
---|
1578 |
|
---|
1579 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"?ready to loop? Ref='"_Ref_"'")
|
---|
1580 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Ref='' is "_Ref="")
|
---|
1581 | if Ref="" goto QGetDat1
|
---|
1582 |
|
---|
1583 | goto GetData2
|
---|
1584 |
|
---|
1585 | QGetDat1
|
---|
1586 | ;"If we get here, must have found correct node
|
---|
1587 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Success. data node found. SegNode="_SegNode)
|
---|
1588 | set result=$$Get1NText^TMGXMLT(XMLHandle,SegNode)
|
---|
1589 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Result="_result)
|
---|
1590 |
|
---|
1591 | QGetDat
|
---|
1592 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"GetData")
|
---|
1593 | quit result
|
---|
1594 |
|
---|
1595 |
|
---|
1596 | ParseSeg(Ref,ID)
|
---|
1597 | ;"Purpose: to parse a line in the following format
|
---|
1598 | ;" Data.Site.Office[EastSide].Field[OpenDate]
|
---|
1599 | ;" Function will return the next segment (divided
|
---|
1600 | ;" by '.', left-to-right
|
---|
1601 | ;"Input: Ref: Should be passed by reference . text of line, as described above
|
---|
1602 | ;" ID: Should be passed by reference. An OUT parameter (not used for input)
|
---|
1603 | ;"Output: Ref is changed (shortened). When all done, Ref will equal " "
|
---|
1604 | ;" If an ID is found (i.e. 'EastSide' in above example), then ID will
|
---|
1605 | ;" will be set, otherwise " "
|
---|
1606 | ;"Result: The leftmost section, or " " if none found
|
---|
1607 |
|
---|
1608 | new result
|
---|
1609 | set result=" "
|
---|
1610 | set ID=" "
|
---|
1611 | new PartA,PartB,PartC
|
---|
1612 |
|
---|
1613 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"ParseSeg")
|
---|
1614 |
|
---|
1615 | ;"If no more pieces, just return input
|
---|
1616 | if 'Ref["." do goto Parse2
|
---|
1617 | . set result=Ref
|
---|
1618 | . set Ref=" "
|
---|
1619 |
|
---|
1620 | set result=$piece(Ref,".",1)
|
---|
1621 | set result=$get(result," ")
|
---|
1622 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Result="_result)
|
---|
1623 | set PartB=$piece(Ref,".",2,100)
|
---|
1624 | set PartB=$get(PartB," ")
|
---|
1625 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"PartB="_PartB)
|
---|
1626 | set Ref=PartB
|
---|
1627 |
|
---|
1628 | Parse2 ;"If Office[EastSide] pattern found, separate parts
|
---|
1629 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Here is result: "_result_" Will now look for '['")
|
---|
1630 | if (result["[")&(result["]") do
|
---|
1631 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"... found.")
|
---|
1632 | . set PartA=$piece(result,"[",1)
|
---|
1633 | . set PartB=$piece(result,"[",2)
|
---|
1634 | . set PartC=$piece(PartB,"]",1)
|
---|
1635 | . set result=PartA
|
---|
1636 | . set ID=PartC
|
---|
1637 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Result now ="_result_" ID="_ID)
|
---|
1638 |
|
---|
1639 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"ParseSeg")
|
---|
1640 | quit result
|
---|
1641 |
|
---|
1642 |
|
---|
1643 | GetDescIDNode(ParentNode,Name,ID)
|
---|
1644 | ;"Purpose: get a descendant node that matches Name and ID
|
---|
1645 | ;"Input: ParentNode node handle of parent
|
---|
1646 | ;" Name is name of node
|
---|
1647 | ;" ID, the ID to match against. ID is an attrib of "id"
|
---|
1648 | ;"e.g. Look for <Field id="Doctor">Kevin</Field> type pattern.
|
---|
1649 | ;" Here, Name='Field', ID='Doctor'
|
---|
1650 | ;"Note: only immediate children (not grandchildren) are searched.
|
---|
1651 | ;"Returns: the handle of the sought node, or 0 if not found.
|
---|
1652 |
|
---|
1653 | new ChildNode
|
---|
1654 | set ChildNode=0
|
---|
1655 | new NodeName,AtrVal
|
---|
1656 |
|
---|
1657 | new InitDebug set InitDebug=TMGDEBUG
|
---|
1658 | set TMGDEBUG=0 ;"Force this function to not put out TMGDEBUG info.
|
---|
1659 |
|
---|
1660 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"GetDescIDNode")
|
---|
1661 |
|
---|
1662 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Looking for children of node="_ParentNode)
|
---|
1663 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"with name="_Name_" ID="_ID)
|
---|
1664 | ;"if ID=" " write "ID=space (null)",!
|
---|
1665 | ;"else write "ID is something other than space. ",!
|
---|
1666 |
|
---|
1667 | GDILoop set ChildNode=$$CHILD^MXMLDOM(XMLHandle,ParentNode,ChildNode)
|
---|
1668 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Looking at child node #"_ChildNode)
|
---|
1669 | ;"if TMGDEBUG>0 do ShowXMLNode(ChildNode)
|
---|
1670 | if ChildNode=0 goto GDIQuit
|
---|
1671 | set NodeName=$$GetNName^TMGXMLT(XMLHandle,ChildNode) ;"Returns result in UPPERCASE
|
---|
1672 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Name="_NodeName)
|
---|
1673 | if NodeName'=$$UP^XLFSTR(Name) goto GDILoop
|
---|
1674 | if ID=" " goto GDIQuit ;"if no ID specified, then match based on Name only.
|
---|
1675 | set AtrVal=$$GetAtrVal^TMGXMLT(XMLHandle,ChildNode,cId)
|
---|
1676 | set AtrVal=$$UP^XLFSTR(AtrVal)
|
---|
1677 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Value: ",AtrVal)
|
---|
1678 | if AtrVal'=$$UP^XLFSTR(ID) goto GDILoop
|
---|
1679 | ;"If we get here, we have a match
|
---|
1680 |
|
---|
1681 | GDIQuit
|
---|
1682 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Success! Node: ",ChildNode)
|
---|
1683 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"GetDescIDNode")
|
---|
1684 |
|
---|
1685 | set TMGDEBUG=InitDebug
|
---|
1686 | quit ChildNode
|
---|
1687 |
|
---|
1688 |
|
---|
1689 | GetCMDLine(ExecNode,Command,Params)
|
---|
1690 | ;"Purpose: Load elements needed to execute line
|
---|
1691 | ;"Input: ExecNode, the node to be executed...
|
---|
1692 | ;" Other parameters are OUT params... should be passed by reference
|
---|
1693 | ;"Output: Command -- the command of the line
|
---|
1694 | ;" Params -- PASS BY REFERENCE-- to accept back the parameters
|
---|
1695 | ;"Results: 1=if valid info; 0=should NOT be executed (i.e. abort)
|
---|
1696 |
|
---|
1697 | new result set result=cOKToCont
|
---|
1698 |
|
---|
1699 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"GetCMDLine")
|
---|
1700 |
|
---|
1701 | set Command=$$GetNName^TMGXMLT(XMLHandle,ExecNode)
|
---|
1702 | set Command=$$UP^XLFSTR(Command) ;"convert to uppercase
|
---|
1703 |
|
---|
1704 | if $data(ProcTable(Command)) goto GCOK
|
---|
1705 | else do goto GCDone
|
---|
1706 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Command '"_Command_"' is invalid.")
|
---|
1707 | . set result=cAbort
|
---|
1708 |
|
---|
1709 | GCOK
|
---|
1710 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"CMD Command=",Command)
|
---|
1711 |
|
---|
1712 | new TextArray,ValidText
|
---|
1713 | set ValidText=$$GetNText^TMGXMLT(XMLHandle,ExecNode,.TextArray)
|
---|
1714 | ;"if result=cAbort do goto GCDone
|
---|
1715 | ;". do ShowError^TMGDEBUG(.PriorErrorFound,"Error retrieving text into array.")
|
---|
1716 | if ValidText merge Params(cText)=TextArray
|
---|
1717 |
|
---|
1718 | set result=$$GetParams^TMGXMLT(XMLHandle,ExecNode,.Params)
|
---|
1719 | if result=cAbort do
|
---|
1720 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Error getting parameters")
|
---|
1721 |
|
---|
1722 | GCDone
|
---|
1723 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"GetCMDLine")
|
---|
1724 | quit result
|
---|
1725 |
|
---|
1726 |
|
---|
1727 | GetNextCMD(ExecNode)
|
---|
1728 | ;"Purpose: Advance execution point
|
---|
1729 | ;"Input: ExecNode: the current execution point, should be passed by reference
|
---|
1730 | ;"Output: ExecNode is changed
|
---|
1731 | ;" returns 0 if end of program, otherwise positive number (i.e. ExecNode)
|
---|
1732 |
|
---|
1733 | set ExecNode=$$CHILD^MXMLDOM(XMLHandle,ScriptNode,ExecNode)
|
---|
1734 |
|
---|
1735 | quit ExecNode
|
---|
1736 |
|
---|
1737 |
|
---|
1738 | RunScript(ExecNode)
|
---|
1739 | ;"Purpose: To run the entire script
|
---|
1740 | ;"Input: ExecNode, should be passed by reference
|
---|
1741 | ;"Assumptions: That ExecNode points to first line of script.
|
---|
1742 | ;"Result: 1: quit normally. 0=error exit.
|
---|
1743 |
|
---|
1744 | new Command
|
---|
1745 | new Params
|
---|
1746 | new OKToCont set OKToCont=1 ;"1=OK to continue 0=should abort
|
---|
1747 |
|
---|
1748 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"RunScript")
|
---|
1749 | RunLoop
|
---|
1750 | if ExecNode=0 goto RSDone
|
---|
1751 |
|
---|
1752 | ;"Get current command line information
|
---|
1753 | ;"if TMGDEBUG>0 do ShowXMLNode(ExecNode)
|
---|
1754 | kill Params
|
---|
1755 |
|
---|
1756 | set OKToCont=$$GetCMDLine(ExecNode,.Command,.Params)
|
---|
1757 | if OKToCont=0 do goto RSDone ;"If error, then quit execution.
|
---|
1758 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Error parsing command line.")
|
---|
1759 | . if TMGDEBUG>0 do ShowXMLNode^TMGXMLT(ExecNode)
|
---|
1760 |
|
---|
1761 | set OKToCont=$$CMDProcess(Command,.Params)
|
---|
1762 | if OKToCont=0 do goto RSDone ;"If error, then quit execution.
|
---|
1763 | . do ShowError^TMGDEBUG(.PriorErrorFound,"Error executing command.")
|
---|
1764 | . if TMGDEBUG>0 do ShowXMLNode^TMGXMLT(ExecNode)
|
---|
1765 |
|
---|
1766 | ;"Look for ESC that will cause loop abort
|
---|
1767 | ;"write "#"
|
---|
1768 | read *CheckKey:0
|
---|
1769 | if CheckKey=27 do goto RSDone
|
---|
1770 | . write !,!,"Escape key pressed. Aborting script.",!,!
|
---|
1771 |
|
---|
1772 | ;"Advance to next command line
|
---|
1773 | set OKToCont=$$GetNextCMD(.ExecNode)
|
---|
1774 | if OKToCont'=0 goto RunLoop
|
---|
1775 | set OKToCont=1 ;"At this point, exit is normal.
|
---|
1776 |
|
---|
1777 | RSDone
|
---|
1778 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"RunScript")
|
---|
1779 | quit OKToCont
|
---|
1780 |
|
---|
1781 | ;"------------------------------------------------------------------------
|
---|
1782 | ;"========================================================================
|
---|
1783 | ;"------------------------------------------------------------------------
|
---|
1784 | GetDispMode()
|
---|
1785 | ;"Purpose: To determine with form of input user wants
|
---|
1786 | ;"Results: 1=GUI,2=CHUI,3=RollNScroll,0=abort
|
---|
1787 | new Input
|
---|
1788 | new result set result=cAbort
|
---|
1789 | new Default set Default=3 ;"If changed, change(1) below
|
---|
1790 |
|
---|
1791 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"GetDispMode")
|
---|
1792 |
|
---|
1793 | write "Select interface option:",!
|
---|
1794 | write " 0. Quit. (Goodbye!)",!
|
---|
1795 | write " 1. Linux X graphics/ 'GUI' (Recommended)",!
|
---|
1796 | write " 2. Text graphics / 'CHUI' (Incomplete)",!
|
---|
1797 | write " 3. Line-by-Line / 'Roll-and-scroll'",!
|
---|
1798 |
|
---|
1799 | write "Enter option number ("_Default_"): "
|
---|
1800 | read Input,!
|
---|
1801 | if Input="" do
|
---|
1802 | . ;"write "Defaulting to: ",Default,!
|
---|
1803 | . set Input=Default
|
---|
1804 | else if +Input>4 do
|
---|
1805 | . set Input=Default
|
---|
1806 |
|
---|
1807 | set result=+Input
|
---|
1808 | if (Input=1)!(Input=2) do
|
---|
1809 | . do SetupConsts^TMGXDLG()
|
---|
1810 | . do SetGUI^TMGXDLG(Input=1)
|
---|
1811 | ;"if Input=2 do goto GIMDone
|
---|
1812 | ;". do SetupConsts^TMGXDLG()
|
---|
1813 | ;". do SetGUI^TMGXDLG(0)
|
---|
1814 |
|
---|
1815 | GIMDone
|
---|
1816 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Display mode set at: ",result)
|
---|
1817 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"GetDispMode")
|
---|
1818 | quit result
|
---|
1819 |
|
---|
1820 |
|
---|
1821 |
|
---|
1822 | DoMsgBox(Params)
|
---|
1823 | ;"Purpose: To provide a method for script users to
|
---|
1824 | ;" show a message box
|
---|
1825 | ;"Input: Params -- an array loaded with needed values:
|
---|
1826 | ;" Params(cHeader): Header text
|
---|
1827 | ;" Params(cText,*): Array containing text
|
---|
1828 | ;" i.e. Params(cText,1)="text of line 1"
|
---|
1829 | ;" i.e. Params(cText,2)="text of line 2"
|
---|
1830 | ;" i.e. Params(cText,3)="text of line 3"
|
---|
1831 | ;" i.e. Params(cText,4)="text of line 4"
|
---|
1832 | ;"Result: 1=ok to continue, 0=abort
|
---|
1833 |
|
---|
1834 | if TMGDEBUG>0 do DebugEntry^TMGDEBUG(.DBIndent,"DoMsgBox")
|
---|
1835 |
|
---|
1836 | new Width
|
---|
1837 | new Text,S,PartB,PartB1
|
---|
1838 | new index,j
|
---|
1839 | new Modal
|
---|
1840 | new result set result=cOKToCont
|
---|
1841 |
|
---|
1842 | if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Here is a dump of the params")
|
---|
1843 | if TMGDEBUG do ArrayDump^TMGDEBUG("Params") ;"zwr Params(*)
|
---|
1844 |
|
---|
1845 | set Text(0)=$get(Params(cHeader),"Message:")
|
---|
1846 | set Width=$get(Params(cWidth,cUpperCase),0)
|
---|
1847 | set Modal=$get(Params(cModal),cModalMode)
|
---|
1848 | set index=$order(Params(cText,""))
|
---|
1849 | set j=1
|
---|
1850 | DMSGLoop
|
---|
1851 | if index="" goto DMSGPast
|
---|
1852 | set S=$get(Params(cText,index))
|
---|
1853 | set result=$$CheckSubstituteData(.S)
|
---|
1854 | if result=cAbort goto DMSGQuit
|
---|
1855 | DMSG2Loop ;"Load string up into Text array, to pass to PopupArray
|
---|
1856 | if S[cNewLn do
|
---|
1857 | . do CleaveStr^TMGSTUTL(.S,cNewLn,.PartB1)
|
---|
1858 | do SplitStr^TMGSTUTL(.S,(Width-4),.PartB)
|
---|
1859 | set PartB=PartB_PartB1 set PartB1=""
|
---|
1860 | set Text(j)=S
|
---|
1861 | set j=j+1
|
---|
1862 | if $length(PartB)>0 do goto DMSG2Loop
|
---|
1863 | . set S=PartB
|
---|
1864 | . set PartB=""
|
---|
1865 |
|
---|
1866 | set index=$order(Params(cText,index))
|
---|
1867 | goto DMSGLoop
|
---|
1868 |
|
---|
1869 | DMSGPast
|
---|
1870 | if TMGDEBUG do
|
---|
1871 | . if TMGDEBUG>0 do DebugMsg^TMGDEBUG(DBIndent,"Here is Text array to send to PopupArray:")
|
---|
1872 | . do ArrayDump^TMGDEBUG("Text") ;"zwr Text(*)
|
---|
1873 |
|
---|
1874 | do PopupArray^TMGUSRIF(2,Width,.Text,Modal)
|
---|
1875 | DMSGQuit
|
---|
1876 | if TMGDEBUG>0 do DebugExit^TMGDEBUG(.DBIndent,"DoMsgBox")
|
---|
1877 | quit result
|
---|
1878 |
|
---|
1879 |
|
---|