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