| 1 | HLDIE ;CIOFO-O/LJA - Direct 772 & 773 Sets ; 10/19/2007 11:15
 | 
|---|
| 2 |  ;;1.6;HEALTH LEVEL SEVEN;**109,122**;Oct 13,1995;Build 14
 | 
|---|
| 3 |  ;Per VHA Directive 2004-038, this routine should not be modified.
 | 
|---|
| 4 |  Q
 | 
|---|
| 5 |  ;
 | 
|---|
| 6 |  ; Rules: if any of these rules is broken, FILE^DIE is called instead
 | 
|---|
| 7 |  ;
 | 
|---|
| 8 |  ;         * Can't edit files other than 772,773
 | 
|---|
| 9 |  ;         * Don't pass IENS value with multiples IENs.  You can only
 | 
|---|
| 10 |  ;             edit one IEN at a time!
 | 
|---|
| 11 |  ;         * Only flag "S" is honored.  Flag "K" is ignored. Other
 | 
|---|
| 12 |  ;             flags result in FILE^DIE being called.
 | 
|---|
| 13 |  ;         * Can't edit ^HLMA(IEN,90) data.
 | 
|---|
| 14 |  ;         * Can't edit ^HLMA(IEN,91) data.
 | 
|---|
| 15 |  ;         * Can't edit ^HL(772,IEN,"IN") data (field #200, MESSAGE TEXT)
 | 
|---|
| 16 |  ;         * No checking of data performed!  (Data format MUST be OK.)
 | 
|---|
| 17 |  ;         * No locking of records in files 772 or 773. (Locks on queues.)
 | 
|---|
| 18 |  ;
 | 
|---|
| 19 | FILE(FLAGS,ROOT,ERR,SUB,RTN) ; FILE^DIE functional equivalent...
 | 
|---|
| 20 |  ; This call has similar parameters to FILE^DIE, but changes data
 | 
|---|
| 21 |  ; using hard sets.  The first two parameters of this API are the
 | 
|---|
| 22 |  ; same as FILE^DIE.  So, if any file other than 772 or 773 is being
 | 
|---|
| 23 |  ; edited, this API just passes on the FLAGS,ROOT,ERR parameters to
 | 
|---|
| 24 |  ; FILE^DIE and quits.  If file 772 or 773 is being edited, the hard
 | 
|---|
| 25 |  ; set code in HLDIE772 and HLDIE773 is called. 
 | 
|---|
| 26 |  ;
 | 
|---|
| 27 |  N DEBUG,FILE,HLEDITOR,LERR,IEN,X,XECMCODE
 | 
|---|
| 28 |  ;
 | 
|---|
| 29 |  S DT=$$NOW^XLFDT\1
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 |  D BEGIN ; Debug call at beginning or process
 | 
|---|
| 32 |  ;
 | 
|---|
| 33 |  ; Check FILE, IEN, FIELDs passed, etc...
 | 
|---|
| 34 |  I '$$CHECKS D  QUIT  ;->
 | 
|---|
| 35 |  .
 | 
|---|
| 36 |  .  S HLEDITOR="FILE^DIE"
 | 
|---|
| 37 |  .
 | 
|---|
| 38 |  .  ; Call FILEMAN...
 | 
|---|
| 39 |  .  D FILE^DIE($G(FLAGS),$G(ROOT),$G(ERR))
 | 
|---|
| 40 |  .
 | 
|---|
| 41 |  .  ; Debug call made even with Fileman...
 | 
|---|
| 42 |  .  D END
 | 
|---|
| 43 |  ;
 | 
|---|
| 44 |  S HLEDITOR="FILE^HLDIE"
 | 
|---|
| 45 |  ;
 | 
|---|
| 46 |  ; If this point is reached, file 772 or 773 is being edited, data
 | 
|---|
| 47 |  ; in ROOT() has been checked, and data is being hard set...
 | 
|---|
| 48 |  ;
 | 
|---|
| 49 |  ;
 | 
|---|
| 50 |  ; Make sure ERR is defined...
 | 
|---|
| 51 |  I $G(ERR)']"" N HLERR S ERR="HLERR"
 | 
|---|
| 52 |  ;
 | 
|---|
| 53 |  ; All editing occurs in this call...
 | 
|---|
| 54 |  D EDITALL(.ROOT,FILE,IEN)
 | 
|---|
| 55 |  ;
 | 
|---|
| 56 |  ; Store debug data if XTMP debug string set...
 | 
|---|
| 57 |  D END
 | 
|---|
| 58 |  ;
 | 
|---|
| 59 |  ;check if ROOT needs to be retained
 | 
|---|
| 60 |  I FLAGS'["S" K @ROOT,FLAGS
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 |  Q
 | 
|---|
| 63 |  ;
 | 
|---|
| 64 | EDITALL(ROOT,FILE,IEN) ; Edit 772 or 773 by direct sets...
 | 
|---|
| 65 |  ;
 | 
|---|
| 66 |  ; FILE,IEN -- optional (parsed from ROOT())
 | 
|---|
| 67 |  ;
 | 
|---|
| 68 |  N ERRNO,FIELD,GBL,NODE,ROUTINE,TAG,VALUE,XRF
 | 
|---|
| 69 |  ;
 | 
|---|
| 70 |  S GBL=$$GBL(FILE,+IEN)
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 |  ;check if .01="@" for deletion of record...
 | 
|---|
| 73 |  I $G(@ROOT@(FILE,IEN,.01))="@" D  Q
 | 
|---|
| 74 |  .I FILE=773 D DEL773^HLUOPT3(+IEN) Q
 | 
|---|
| 75 |  .I FILE=772 D DEL772^HLUOPT3(+IEN)
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 |  ; patch HL*1.6*122: MPI-client/server
 | 
|---|
| 78 |  ; If no data in record passed in, log an error and quit...
 | 
|---|
| 79 |  ; I '$D(@GBL) D  Q  ; Remember.  GBL contains IEN...
 | 
|---|
| 80 |  N HLDGBL
 | 
|---|
| 81 |  F  L +@GBL:10 Q:$T  H 1
 | 
|---|
| 82 |  S HLDGBL=$D(@GBL)
 | 
|---|
| 83 |  L -@GBL
 | 
|---|
| 84 |  I 'HLDGBL D  Q  ; Remember.  GBL contains IEN...
 | 
|---|
| 85 |  .  S ERRNO=$$ERRNO(601,"The entry does not exist.",FILE,2)
 | 
|---|
| 86 |  .  S @ERR@("DIERR",+ERRNO,"PARAM","IENS")=IEN_$S(IEN'[",":",",1:"")
 | 
|---|
| 87 |  ;
 | 
|---|
| 88 |  ;
 | 
|---|
| 89 |  ; What routine holds the file-specific field/xref set code?
 | 
|---|
| 90 |  S ROUTINE=$S(FILE=772:"HLDIE772",FILE=773:"HLDIE773",1:"")
 | 
|---|
| 91 |  ;
 | 
|---|
| 92 |  ; Load NODEs...
 | 
|---|
| 93 |  D GETNODES(FILE,+IEN,.NODE)
 | 
|---|
| 94 |  ;
 | 
|---|
| 95 |  ; When a field is edited, the NODE(1) is changed
 | 
|---|
| 96 |  ;
 | 
|---|
| 97 |  ; Edit NODE(1), adding new values, and set XRF(XREF) nodes...
 | 
|---|
| 98 |  S FIELD=0
 | 
|---|
| 99 |  F  S FIELD=$O(@ROOT@(FILE,IEN,FIELD)) Q:FIELD'>0  D
 | 
|---|
| 100 |  .  ; VALUE = value passed in by process that is to be stored in file
 | 
|---|
| 101 |  .  S VALUE=$G(@ROOT@(FILE,IEN,FIELD))
 | 
|---|
| 102 |  .
 | 
|---|
| 103 |  .  ; If field should be deleted, VALUE will equal @...
 | 
|---|
| 104 |  .  I VALUE="@" S VALUE=""
 | 
|---|
| 105 |  .
 | 
|---|
| 106 |  .  ; Get and check tag...
 | 
|---|
| 107 |  .  S TAG="F"_(FILE-770)_$TR(FIELD,".","")_U_ROUTINE
 | 
|---|
| 108 |  .  S TAG(1)=$T(@TAG) I TAG(1)']"" D  QUIT  ;->
 | 
|---|
| 109 |  .  .  S ERRNO=$$ERRNO(501,"No set logic for file #"_FILE_"'s field# "_FIELD,FILE,3)
 | 
|---|
| 110 |  .  .  S @ERR@("DIERR",+ERRNO,"PARAM",1)=FIELD
 | 
|---|
| 111 |  .  .  S @ERR@("DIERR",+ERRNO,"PARAM","FIELD")=FIELD
 | 
|---|
| 112 |  .
 | 
|---|
| 113 |  .  ; Call the subroutine below that is for the specific field...
 | 
|---|
| 114 |  .  ; (No editing of xrefs or global data occurs in these calls.)
 | 
|---|
| 115 |  .  D @("F"_(FILE-770)_$TR(FIELD,".","")_U_ROUTINE)
 | 
|---|
| 116 |  ;
 | 
|---|
| 117 |  ; If no data actually changed, quit...
 | 
|---|
| 118 |  QUIT:'$D(NODE("CHG"))  ;->
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  ; patch HL*1.6*122: MPI-client/server
 | 
|---|
| 121 |  I FILE=773 D
 | 
|---|
| 122 |  . F  L +^HLMA(IEN):10 Q:$T  H 1
 | 
|---|
| 123 |  E  D
 | 
|---|
| 124 |  . F  L +^HL(772,IEN):10 Q:$T  H 1
 | 
|---|
| 125 |  ;
 | 
|---|
| 126 |  ; Store changes in the global now...
 | 
|---|
| 127 |  D STORE(FILE,IEN,.NODE)
 | 
|---|
| 128 |  ;
 | 
|---|
| 129 |  ; Set xrefs to correspond to the just-stored data...
 | 
|---|
| 130 |  S XRF=""
 | 
|---|
| 131 |  F  S XRF=$O(XRF(XRF)) Q:XRF']""  D
 | 
|---|
| 132 |  .  D @("XRF"_XRF_U_ROUTINE)
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 |  ; patch HL*1.6*122: MPI-client/server
 | 
|---|
| 135 |  I FILE=773 L -^HLMA(IEN)
 | 
|---|
| 136 |  E  L -^HL(772,IEN)
 | 
|---|
| 137 |  ;
 | 
|---|
| 138 |  Q
 | 
|---|
| 139 |  ;
 | 
|---|
| 140 | GETNODES(FILE,IEN,NODE) ; Load pre-change data for each node in 
 | 
|---|
| 141 |  ; NODE(node,0), and load node to be changed in NODE(node,1).
 | 
|---|
| 142 |  ; GBL -- req
 | 
|---|
| 143 |  F NODE=0,1,2,"P","S" D
 | 
|---|
| 144 |  .  ; After setting, NODE(NODE,0) will equal each other.
 | 
|---|
| 145 |  .  ; However, after each edited field is processed, the pieces of
 | 
|---|
| 146 |  .  ; data in NODE(NODE,1) will be changed.  The pre and post nodes
 | 
|---|
| 147 |  .  ; then are of comparison value.
 | 
|---|
| 148 |  .  S NODE(NODE,0)=$G(@GBL@(NODE)) ; Pre-change node
 | 
|---|
| 149 |  .  S NODE(NODE,1)=NODE(NODE,0) ; Node that is changed
 | 
|---|
| 150 |  Q
 | 
|---|
| 151 |  ;
 | 
|---|
| 152 | STORE(FILE,IEN,NODE) ; Store changes in file...
 | 
|---|
| 153 |  N DATA,ND
 | 
|---|
| 154 |  ;
 | 
|---|
| 155 |  ; Loop thru change nodes, get changed data, and store it...
 | 
|---|
| 156 |  S ND=""
 | 
|---|
| 157 |  F  S ND=$O(NODE("CHG",ND)) Q:ND']""  D
 | 
|---|
| 158 |  .  S DATA=$G(NODE(ND,1))
 | 
|---|
| 159 |  .  ; Even if no data no node, store it.  (Will be removed by purge.)
 | 
|---|
| 160 |  .  I FILE=772 S ^HL(772,+IEN,ND)=DATA
 | 
|---|
| 161 |  .  I FILE=773 S ^HLMA(+IEN,ND)=DATA
 | 
|---|
| 162 |  ;
 | 
|---|
| 163 |  QUIT
 | 
|---|
| 164 |  ;
 | 
|---|
| 165 | GBL(FILE,IEN) QUIT $S(FILE=772:"^HL(772,"_+IEN_")",1:"^HLMA("_+IEN_")")
 | 
|---|
| 166 |  ;
 | 
|---|
| 167 | CHKFLD(FILE,FIELD) ; Does passed-in field exist?
 | 
|---|
| 168 |  ; Returns -- @ERR@(...) ->
 | 
|---|
| 169 |  ;
 | 
|---|
| 170 |  ; Quit if field exists...
 | 
|---|
| 171 |  QUIT:$D(^DD(+FILE,+FIELD)) 1 ;->
 | 
|---|
| 172 |  ;
 | 
|---|
| 173 |  ; Field doesn't exist.  Log error...
 | 
|---|
| 174 |  S ERRNO=$$ERRNO(501,"File #"_FILE_" does not contain a field "_FIELD_".",FILE,3)
 | 
|---|
| 175 |  S @ERR@("DIERR",+ERRNO,"PARAM",1)=FIELD
 | 
|---|
| 176 |  S @ERR@("DIERR",+ERRNO,"PARAM","FIELD")=FIELD
 | 
|---|
| 177 |  ;
 | 
|---|
| 178 |  Q ""
 | 
|---|
| 179 |  ;
 | 
|---|
| 180 | ERRNO(NUM,TXT,FILE,PNO) ; Return next ERROR number and create general data...
 | 
|---|
| 181 |  N NO
 | 
|---|
| 182 |  S NO=$G(@ERR@("DIERR"))+1,@ERR@("DIERR")=+NO_U_+NO
 | 
|---|
| 183 |  S @ERR@("DIERR",NO)=NUM
 | 
|---|
| 184 |  S @ERR@("DIERR",NO,"PARAM",0)=PNO
 | 
|---|
| 185 |  S @ERR@("DIERR",NO,"PARAM","FILE")=FILE
 | 
|---|
| 186 |  S @ERR@("DIERR",NO,"TEXT",1)=TXT
 | 
|---|
| 187 |  S @ERR@("DIERR","E",NUM,NO)=""
 | 
|---|
| 188 |  Q NO
 | 
|---|
| 189 |  ;
 | 
|---|
| 190 | GENLERR(ETXT) ; Store GENERAL (and fatal) error...
 | 
|---|
| 191 |  ; ERR -- req
 | 
|---|
| 192 |  N NO
 | 
|---|
| 193 |  S NO=$G(@ERR@("DIERR"))+1,@ERR@("DIERR")=+NO_U_+NO
 | 
|---|
| 194 |  S @ERR@("DIERR",NO)=999_U_ETXT ; Made up error number
 | 
|---|
| 195 |  Q
 | 
|---|
| 196 |  ;
 | 
|---|
| 197 | CHECKS() ; Check ROOT() for file and validity of data...
 | 
|---|
| 198 |  ; FLAGS, ROOT() -- req --> FILE,IEN
 | 
|---|
| 199 |  N I,OK,FIELD
 | 
|---|
| 200 |  ;
 | 
|---|
| 201 |  ;check the file & ien
 | 
|---|
| 202 |  S FILE=$O(@ROOT@(0))
 | 
|---|
| 203 |  I FILE'=772,FILE'=773 D  QUIT "" ;->
 | 
|---|
| 204 |  .  S IEN=$S(FILE:$O(@ROOT@(FILE,0)),1:0) ; Set for debugging
 | 
|---|
| 205 |  ;
 | 
|---|
| 206 |  ; ;shouldn't be more than 1 file!
 | 
|---|
| 207 |  QUIT:$O(@ROOT@(FILE)) "" ;->
 | 
|---|
| 208 |  ;
 | 
|---|
| 209 |  ;check the ien structure, and that only ien passed...
 | 
|---|
| 210 |  S IEN=$O(@ROOT@(FILE,0))
 | 
|---|
| 211 |  ; Structure check...
 | 
|---|
| 212 |  QUIT:$P(IEN,",")'=+IEN_"," "" ;->
 | 
|---|
| 213 |  ; Is it numeric?
 | 
|---|
| 214 |  QUIT:'(+IEN) "" ;->
 | 
|---|
| 215 |  ; Has more than one IEN been passed?
 | 
|---|
| 216 |  QUIT:($O(@ROOT@(FILE,IEN))'="") "" ;->
 | 
|---|
| 217 |  ;
 | 
|---|
| 218 |  ;check the flags.  Only K and S flags allowed...
 | 
|---|
| 219 |  I $L(FLAGS) D  QUIT:'OK "" ;->
 | 
|---|
| 220 |  .  S OK=1
 | 
|---|
| 221 |  .  F I=0:1:$L(FLAGS) I $E(FLAGS,I)'="K",$E(FLAGS,I)'="S" S OK=0
 | 
|---|
| 222 |  ;
 | 
|---|
| 223 |  ; Check for existence of FIELD in FILE's DD & if an excluded field.
 | 
|---|
| 224 |  ; (See rules for fields which cannot be updated by FILE^HLDIE.)
 | 
|---|
| 225 |  S FIELD=0,OK=1
 | 
|---|
| 226 |  F  S FIELD=$O(@ROOT@(FILE,IEN,FIELD)) Q:FIELD=""  D  Q:'OK
 | 
|---|
| 227 |  .  I '$$CHKFLD(FILE,FIELD) S OK=0 Q
 | 
|---|
| 228 |  .  I FILE=773,FIELD\1=90 S OK=0 Q
 | 
|---|
| 229 |  .  I FILE=773,FIELD\1=91 S OK=0 Q
 | 
|---|
| 230 |  .  I FILE=772,FIELD=200 S OK=0 Q
 | 
|---|
| 231 |  ;
 | 
|---|
| 232 |  ; If not OK to use FILE^HLDIE, skip any further testing...
 | 
|---|
| 233 |  QUIT:'OK "" ;->
 | 
|---|
| 234 |  ;
 | 
|---|
| 235 |  ;                    *** WARNING ***
 | 
|---|
| 236 |  ; The following check **MUST** be removed after FILE^HLDIE is working.
 | 
|---|
| 237 |  ;
 | 
|---|
| 238 |  ; Final check for whether FILE^HLDIE should be used...
 | 
|---|
| 239 |  I $G(^XTMP("HLDIE-DEBUG","CALL"))]"" QUIT "" ;->
 | 
|---|
| 240 |  ; If this node exists and follows null, FILE^DIE will be used.
 | 
|---|
| 241 |  ; Otherwise, execution defaults to using FILE^HLDIE.
 | 
|---|
| 242 |  ;
 | 
|---|
| 243 |  Q OK
 | 
|---|
| 244 |  ;
 | 
|---|
| 245 | BEGIN ; Always call here before any ^HLDIE or ^DIE calls...
 | 
|---|
| 246 |  D DEBUG(1)
 | 
|---|
| 247 |  Q
 | 
|---|
| 248 |  ;
 | 
|---|
| 249 | END ; Always call here after all ^HLDIE or ^DIE actions...
 | 
|---|
| 250 |  D DEBUG(2)
 | 
|---|
| 251 |  Q
 | 
|---|
| 252 |  ;
 | 
|---|
| 253 | DEBUG(LOC) ; Debug presets and setup...
 | 
|---|
| 254 |  ; Most variables created here should be left around.  These variables
 | 
|---|
| 255 |  ; are newed above.
 | 
|---|
| 256 |  N STORE
 | 
|---|
| 257 |  ;
 | 
|---|
| 258 |  S RTN=$G(RTN),SUB=$G(SUB)
 | 
|---|
| 259 |  ;
 | 
|---|
| 260 |  ; First-time (beginning) call setups...
 | 
|---|
| 261 |  I LOC=1 D
 | 
|---|
| 262 |  .  S RTN=$S(RTN]"":RTN,1:"HLDIE")_"~"_$S(RTN="HLDIE":"FILE",1:SUB)
 | 
|---|
| 263 |  .  S DEBUG=$G(^XTMP("HLDIE-DEBUG","STATUS"))
 | 
|---|
| 264 |  .  S XECMCODE=$P(DEBUG,U,3)
 | 
|---|
| 265 |  ; DEBUG is always called at beginning (LOC=1) and end (LOC=2) or
 | 
|---|
| 266 |  ; FILE^HLDIE.  So, set up variables only once, at beginning...
 | 
|---|
| 267 |  ;
 | 
|---|
| 268 |  ; Setup that is individual to each (1 or 2) call...
 | 
|---|
| 269 |  S STORE=$P(DEBUG,U,LOC),STORE=$S(STORE=1:1,STORE=2:2,1:"")
 | 
|---|
| 270 |  ; Some, All, or no data stored?
 | 
|---|
| 271 |  ;
 | 
|---|
| 272 |  ; If no STORE instructions, and no M code to specify STORE, quit...
 | 
|---|
| 273 |  QUIT:'STORE&($G(XECMCODE)'=1)  ;->
 | 
|---|
| 274 |  ;
 | 
|---|
| 275 |  ; Call DEBUG to STORE data...
 | 
|---|
| 276 |  D DEBUG^HLDIEDBG(RTN,LOC,STORE,XECMCODE)
 | 
|---|
| 277 |  ;
 | 
|---|
| 278 |  Q
 | 
|---|
| 279 |  ;
 | 
|---|
| 280 | EOR ;HLDIE - Direct 772 & 773 Sets ; 11/18/2003 11:17
 | 
|---|