| 1 | HLOASUB1 ;IRMFO-ALB/CJM - Subscription Registry (continued) ;02/26/2007
 | 
|---|
| 2 |  ;;1.6;HEALTH LEVEL SEVEN;**126,134**;Oct 13, 1995;Build 30
 | 
|---|
| 3 |  ;Per VHA Directive 10-93-142, this routine should not be modified.
 | 
|---|
| 4 |  ;
 | 
|---|
| 5 | INDEX(IEN,PARMARY) ;
 | 
|---|
| 6 |  ;Allows an application to optionally index its subscriptions.
 | 
|---|
| 7 |  ;so that it can find find them without storing the ien.
 | 
|---|
| 8 |  ;
 | 
|---|
| 9 |  ;Input:
 | 
|---|
| 10 |  ;  IEN - ien of the entry
 | 
|---|
| 11 |  ;  PARMARY (pass by reference) An array of up to 6 lookup values with
 | 
|---|
| 12 |  ;which to build the index.  The format is: PARMARY(1)=<first parameter>,
 | 
|---|
| 13 |  ; up to PARMARY(6)
 | 
|---|
| 14 |  ;Output:
 | 
|---|
| 15 |  ;  function returns 1 on success, 0 otherwise
 | 
|---|
| 16 |  ;  PARMARY - left undefined
 | 
|---|
| 17 |  ;
 | 
|---|
| 18 |  N OWNER,I,NODE
 | 
|---|
| 19 |  Q:'$G(IEN) 0
 | 
|---|
| 20 |  S OWNER=$P($G(^HLD(779.4,IEN,0)),"^",2)
 | 
|---|
| 21 |  Q:'$L(OWNER) 0
 | 
|---|
| 22 |  D KILLAH(IEN)
 | 
|---|
| 23 |  F I=1:1:6 S:'$L($G(PARMARY(I))) PARMARY(I)=" "
 | 
|---|
| 24 |  D SETAH(IEN,OWNER,.PARMARY)
 | 
|---|
| 25 |  S NODE=""
 | 
|---|
| 26 |  F I=1:1:6 S NODE=NODE_$G(PARMARY(I))_"^"
 | 
|---|
| 27 |  S ^HLD(779.4,IEN,3)=NODE
 | 
|---|
| 28 |  K PARMARY
 | 
|---|
| 29 |  Q 1
 | 
|---|
| 30 |  ;
 | 
|---|
| 31 | SETAH(IEN,OWNER,PARMS) ;
 | 
|---|
| 32 |  Q:'$G(IEN)
 | 
|---|
| 33 |  Q:'$L($G(OWNER))
 | 
|---|
| 34 |  N INDEX
 | 
|---|
| 35 |  S INDEX="^HLD(779.4,""AH"",OWNER,"
 | 
|---|
| 36 |  F I=1:1:6 D
 | 
|---|
| 37 |  .S:'$L($G(PARMS(I))) PARMS(I)=" "
 | 
|---|
| 38 |  .S INDEX=INDEX_""""_PARMS(I)_""","
 | 
|---|
| 39 |  S INDEX=$E(INDEX,1,$L(INDEX)-1)_")"
 | 
|---|
| 40 |  S @INDEX=IEN
 | 
|---|
| 41 |  Q
 | 
|---|
| 42 |  ;
 | 
|---|
| 43 | SETAH1(DA,OWNER,X1,X2,X3,X4,X5,X6) ;
 | 
|---|
| 44 |  Q:'$G(DA)
 | 
|---|
| 45 |  Q:'$L($G(OWNER))
 | 
|---|
| 46 |  N PARMS,I
 | 
|---|
| 47 |  F I=1:1:6 I $L($G(@("X"_I))) S PARMS(I)=@("X"_I)
 | 
|---|
| 48 |  D SETAH(DA,OWNER,.PARMS)
 | 
|---|
| 49 |  Q
 | 
|---|
| 50 |  ;
 | 
|---|
| 51 | KILLAH1(OWNER,LOOKUP1,LOOKUP2,LOOKUP3,LOOKUP4,LOOKUP5,LOOKUP6) ;
 | 
|---|
| 52 |  Q:'$L(OWNER)
 | 
|---|
| 53 |  N I,INDEX
 | 
|---|
| 54 |  S INDEX="^HLD(779.4,""AH"",OWNER"
 | 
|---|
| 55 |  F I=1:1:6 D
 | 
|---|
| 56 |  .S:'$L($G(@("LOOKUP"_I))) @("LOOKUP"_I)=" "
 | 
|---|
| 57 |  .S INDEX=INDEX_","_""""_@("LOOKUP"_I)_""""
 | 
|---|
| 58 |  S INDEX=INDEX_")"
 | 
|---|
| 59 |  K @INDEX
 | 
|---|
| 60 |  Q
 | 
|---|
| 61 |  ;
 | 
|---|
| 62 | KILLAH(IEN) ;kills the AH x~ref on file 779.4 for a particular subscription registry entry=ien
 | 
|---|
| 63 |  Q:'$G(IEN)
 | 
|---|
| 64 |  N OWNER,X1,X2,X3,X4,X5,X6,I,NODE
 | 
|---|
| 65 |  S OWNER=$P($G(^HLD(779.4,IEN,0)),"^",2)
 | 
|---|
| 66 |  Q:'$L(OWNER)
 | 
|---|
| 67 |  S NODE=$G(^HLD(779.4,IEN,3))
 | 
|---|
| 68 |  F I=1:1:6 I $L($P(NODE,"^",I)) S @("X"_I)=$P(NODE,"^",I)
 | 
|---|
| 69 |  D KILLAH1(OWNER,.X1,.X2,.X3,.X4,.X5,.X6)
 | 
|---|
| 70 |  Q
 | 
|---|
| 71 |  ;
 | 
|---|
| 72 | FIND(OWNER,PARMARY) ;
 | 
|---|
| 73 |  ;Allows an application to find a subscription
 | 
|---|
| 74 |  ;list.  The application must maintain a private index in order to
 | 
|---|
| 75 |  ;utilize this function, via $$INDEX^HLOASUB()
 | 
|---|
| 76 |  ;
 | 
|---|
| 77 |  ;Input:
 | 
|---|
| 78 |  ;  OWNER - owning application name
 | 
|---|
| 79 |  ;  PARMARY  **pass by reference** an array of up to 6 lookup value with which the index was built.  The format is: PARMARY(1)=<first parameter>, PARMARY(2)=<second parameter>  If PARMARY(i)=null, the parameter will be ignored
 | 
|---|
| 80 |  ;Output:
 | 
|---|
| 81 |  ;  function returns the ien of the subscription list if found, 0 otherwise
 | 
|---|
| 82 |  ; PARMARY - left undefined
 | 
|---|
| 83 |  ;
 | 
|---|
| 84 |  N OK S OK=0
 | 
|---|
| 85 |  ;
 | 
|---|
| 86 |  D
 | 
|---|
| 87 |  .Q:'$D(PARMARY)
 | 
|---|
| 88 |  .Q:'$L($G(OWNER))
 | 
|---|
| 89 |  .N INDEX,I
 | 
|---|
| 90 |  .S INDEX="^HLD(779.4,""AH"",OWNER"
 | 
|---|
| 91 |  .F I=1:1:6 D
 | 
|---|
| 92 |  ..S:'$L($G(PARMARY(I))) PARMARY(I)=" "
 | 
|---|
| 93 |  ..S INDEX=INDEX_","_""""_PARMARY(I)_""""
 | 
|---|
| 94 |  .S INDEX=INDEX_")"
 | 
|---|
| 95 |  .S OK=+$G(@INDEX)
 | 
|---|
| 96 |  K PARMARY
 | 
|---|
| 97 |  Q OK
 | 
|---|
| 98 |  ;
 | 
|---|
| 99 | UPD(FILE,DA,DATA,ERROR) ;File data into an existing record.
 | 
|---|
| 100 |  ; Input:
 | 
|---|
| 101 |  ;   FILE - File or sub-file number
 | 
|---|
| 102 |  ;   DA - Traditional DA array, with same meaning.
 | 
|---|
| 103 |  ;            Pass by reference.
 | 
|---|
| 104 |  ;   DATA - Data array to file (pass by reference)
 | 
|---|
| 105 |  ;          Format: DATA(<field #>)=<value>
 | 
|---|
| 106 |  ;
 | 
|---|
| 107 |  ; Output:
 | 
|---|
| 108 |  ;  Function Value -     0=error and 1=no error
 | 
|---|
| 109 |  ;  ERROR - optional error message - if needed, pass by reference
 | 
|---|
| 110 |  ;
 | 
|---|
| 111 |  ; Example: To update a record in subfile 2.0361 in record with ien=353,
 | 
|---|
| 112 |  ;          subrecord ien=68, with the field .01 value = 21:
 | 
|---|
| 113 |  ;    S DATA(.01)=21,DA=68,DA(1)=353 I $$UPD(2.0361,.DA,.DATA,.ERROR) W !,"DONE"
 | 
|---|
| 114 |  ;
 | 
|---|
| 115 |  N FDA,FIELD,IENS,ERRORS
 | 
|---|
| 116 |  ;
 | 
|---|
| 117 |  ;IENS - Internal Entry Number String defined by FM
 | 
|---|
| 118 |  ;FDA - the FDA array as defined by FM
 | 
|---|
| 119 |  ;
 | 
|---|
| 120 |  I '$G(DA) S ERROR="IEN OF RECORD TO BE UPDATED NOT SPECIFIED" Q 0
 | 
|---|
| 121 |  S IENS=$$IENS^DILF(.DA)
 | 
|---|
| 122 |  S FIELD=0
 | 
|---|
| 123 |  F  S FIELD=$O(DATA(FIELD)) Q:'FIELD  D
 | 
|---|
| 124 |  .S FDA(FILE,IENS,FIELD)=$G(DATA(FIELD))
 | 
|---|
| 125 |  D FILE^DIE("","FDA","ERRORS(1)")
 | 
|---|
| 126 |  I +$G(DIERR) D
 | 
|---|
| 127 |  .S ERROR=$G(ERRORS(1,"DIERR",1,"TEXT",1))
 | 
|---|
| 128 |  E  D
 | 
|---|
| 129 |  .S ERROR=""
 | 
|---|
| 130 |  ;
 | 
|---|
| 131 |  D CLEAN^DILF
 | 
|---|
| 132 |  Q $S(+$G(DIERR):0,1:1)
 | 
|---|
| 133 |  ;
 | 
|---|
| 134 | ADD(FILE,DA,DATA,ERROR,IEN) ;
 | 
|---|
| 135 |  ;Description: Creates a new record and files the data.
 | 
|---|
| 136 |  ; Input:
 | 
|---|
| 137 |  ;   FILE - File or sub-file number
 | 
|---|
| 138 |  ;   DA - Traditional FileMan DA array with same
 | 
|---|
| 139 |  ;            meaning. Pass by reference.  Only needed if adding to a
 | 
|---|
| 140 |  ;            subfile.
 | 
|---|
| 141 |  ;   DATA - Data array to file, pass by reference
 | 
|---|
| 142 |  ;          Format: DATA(<field #>)=<value>
 | 
|---|
| 143 |  ;   IEN - internal entry number to use (optional)
 | 
|---|
| 144 |  ;
 | 
|---|
| 145 |  ; Output:
 | 
|---|
| 146 |  ;   Function Value - If no error then it returns the ien of the created record, else returns NULL.
 | 
|---|
| 147 |  ;  DA - returns the ien of the new record, NULL if none created.  If needed, pass by reference.
 | 
|---|
| 148 |  ;  ERROR - optional error message - if needed, pass by reference
 | 
|---|
| 149 |  ;
 | 
|---|
| 150 |  ; Example: To add a record in subfile 2.0361 in the record with ien=353
 | 
|---|
| 151 |  ;          with the field .01 value = 21:
 | 
|---|
| 152 |  ;  S DATA(.01)=21,DA(1)=353 I $$ADD(2.0361,.DA,.DATA) W !,"DONE"
 | 
|---|
| 153 |  ;
 | 
|---|
| 154 |  ; Example: If creating a record not in a subfile, would look like this:
 | 
|---|
| 155 |  ;          S DATA(.01)=21 I $$ADD(867,,.DATA) W !,"DONE"
 | 
|---|
| 156 |  ;
 | 
|---|
| 157 |  N FDA,FIELD,IENA,IENS,ERRORS
 | 
|---|
| 158 |  ;
 | 
|---|
| 159 |  ;IENS - Internal Entry Number String defined by FM
 | 
|---|
| 160 |  ;IENA - the Internal Entry Number Array defined by FM
 | 
|---|
| 161 |  ;FDA - the FDA array defined by FM
 | 
|---|
| 162 |  ;IEN - the ien of the new record
 | 
|---|
| 163 |  ;
 | 
|---|
| 164 |  S DA="+1"
 | 
|---|
| 165 |  S IENS=$$IENS^DILF(.DA)
 | 
|---|
| 166 |  S FIELD=0
 | 
|---|
| 167 |  F  S FIELD=$O(DATA(FIELD)) Q:'FIELD  D
 | 
|---|
| 168 |  .S FDA(FILE,IENS,FIELD)=$G(DATA(FIELD))
 | 
|---|
| 169 |  I $G(IEN) S IENA(1)=IEN
 | 
|---|
| 170 |  D UPDATE^DIE("","FDA","IENA","ERRORS(1)")
 | 
|---|
| 171 |  I +$G(DIERR) D
 | 
|---|
| 172 |  .S ERROR=$G(ERRORS(1,"DIERR",1,"TEXT",1))
 | 
|---|
| 173 |  .S IEN=""
 | 
|---|
| 174 |  E  D
 | 
|---|
| 175 |  .S IEN=IENA(1)
 | 
|---|
| 176 |  .S ERROR=""
 | 
|---|
| 177 |  D CLEAN^DILF
 | 
|---|
| 178 |  S DA=IEN
 | 
|---|
| 179 |  Q IEN
 | 
|---|
| 180 |  ;
 | 
|---|
| 181 | DELETE(FILE,DA,ERROR)   ;Delete an existing record.
 | 
|---|
| 182 |  N DATA
 | 
|---|
| 183 |  S DATA(.01)="@"
 | 
|---|
| 184 |  Q $$UPD(FILE,.DA,.DATA,.ERROR)
 | 
|---|
| 185 |  Q
 | 
|---|
| 186 |  ;
 | 
|---|
| 187 | STATNUM(IEN) ;
 | 
|---|
| 188 |  ;Description:  Given an ien to the Institution file, returns as the function value the station number. If IEN is NOT passed in, it assumes the local site.  Returns "" on failure.
 | 
|---|
| 189 |  ;
 | 
|---|
| 190 |  N STATION,RETURN
 | 
|---|
| 191 |  S RETURN=""
 | 
|---|
| 192 |  I $G(IEN) D
 | 
|---|
| 193 |  .Q:'$D(^DIC(4,IEN,0))
 | 
|---|
| 194 |  .S STATION=$P($$NNT^XUAF4(IEN),"^",2)
 | 
|---|
| 195 |  .S RETURN=$S(+STATION:STATION,1:"")
 | 
|---|
| 196 |  E  D
 | 
|---|
| 197 |  .S RETURN=$P($$SITE^VASITE(),"^",3)
 | 
|---|
| 198 |  Q RETURN
 | 
|---|
| 199 |  ;
 | 
|---|
| 200 | CHECKWHO(WHO,PARMS,ERROR) ;
 | 
|---|
| 201 |  ;Checks the parameters provided in WHO() (see $$ADD).  They must resolve
 | 
|---|
| 202 |  ;the link, receiving app and receiving facility.
 | 
|---|
| 203 |  ;INPUT:
 | 
|---|
| 204 |  ;  WHO - (required, pass by reference) - see $$ADD.
 | 
|---|
| 205 |  ;
 | 
|---|
| 206 |  ;  WHO("PORT") - if this is valued, it will be used as the remote port
 | 
|---|
| 207 |  ;    to connect with rather than the port associated with the link
 | 
|---|
| 208 |  ;Output:
 | 
|---|
| 209 |  ;  Function returns 1 if the input is resolved successfully, 0 otherwise
 | 
|---|
| 210 |  ;    PARMS - (pass by reference)  These subscripts are returned:
 | 
|---|
| 211 |  ;     "LINK IEN" - ien of the link 
 | 
|---|
| 212 |  ;     "LINK NAME" - name of the link
 | 
|---|
| 213 |  ;     "RECEIVING APPLICATION"  - name of the receiving app
 | 
|---|
| 214 |  ;     "RECEIVING FACILITY",1)  - component 1
 | 
|---|
| 215 |  ;     "RECEIVING FACILITY",2) - component 2
 | 
|---|
| 216 |  ;     "RECEIVING FACILITY",3) - component 3
 | 
|---|
| 217 |  ;   ERROR - (pass by reference) - if unsuccessful, an error message is returned.
 | 
|---|
| 218 |  ;
 | 
|---|
| 219 |  N OK
 | 
|---|
| 220 |  K ERROR
 | 
|---|
| 221 |  S OK=1
 | 
|---|
| 222 |  S PARMS("LINK IEN")="",PARMS("LINK NAME")=""
 | 
|---|
| 223 |  ;must identify the receiving app
 | 
|---|
| 224 |  ;
 | 
|---|
| 225 |  D
 | 
|---|
| 226 |  .N LEN
 | 
|---|
| 227 |  .S LEN=$L($G(WHO("RECEIVING APPLICATION")))
 | 
|---|
| 228 |  .I 'LEN S OK=0
 | 
|---|
| 229 |  .E  I LEN>60 S OK=0
 | 
|---|
| 230 |  .S:'OK ERROR="RECEIVING APPLICATION NOT VALID"
 | 
|---|
| 231 |  .S PARMS("RECEIVING APPLICATION")=$G(WHO("RECEIVING APPLICATION"))
 | 
|---|
| 232 |  ;
 | 
|---|
| 233 |  ;find the station # if Institution ien known
 | 
|---|
| 234 |  S:$G(WHO("INSTITUTION IEN")) WHO("STATION NUMBER")=$$STATNUM^HLOASUB1(WHO("INSTITUTION IEN"))
 | 
|---|
| 235 |  ;
 | 
|---|
| 236 |  ;if destination link specified by name, get its ien
 | 
|---|
| 237 |  I '$G(WHO("FACILITY LINK IEN")),$L($G(WHO("FACILITY LINK NAME"))) S WHO("FACILITY LINK IEN")=$O(^HLCS(870,"B",WHO("FACILITY LINK NAME"),0))
 | 
|---|
| 238 |  ;
 | 
|---|
| 239 |  ;if destination link not specified, find it based on station #
 | 
|---|
| 240 |  I +$G(WHO("STATION NUMBER")),'$G(WHO("FACILITY LINK IEN")) S WHO("FACILITY LINK IEN")=$$FINDLINK^HLOTLNK(WHO("STATION NUMBER"))
 | 
|---|
| 241 |  ;
 | 
|---|
| 242 |  ;if station # not known, find it based on destination link
 | 
|---|
| 243 |  I '$G(WHO("STATION NUMBER")),$G(WHO("FACILITY LINK IEN")) S WHO("STATION NUMBER")=$$STATNUM^HLOTLNK(WHO("FACILITY LINK IEN"))
 | 
|---|
| 244 |  ;
 | 
|---|
| 245 |  S PARMS("RECEIVING FACILITY",1)=$G(WHO("STATION NUMBER"))
 | 
|---|
| 246 |  ;
 | 
|---|
| 247 |  ;if the destination link is known, get the domain
 | 
|---|
| 248 |  S PARMS("RECEIVING FACILITY",2)=$S($G(WHO("FACILITY LINK IEN")):$$DOMAIN^HLOTLNK(WHO("FACILITY LINK IEN")),1:"")
 | 
|---|
| 249 |  ;
 | 
|---|
| 250 |  S PARMS("RECEIVING FACILITY",3)="DNS"
 | 
|---|
| 251 |  ;
 | 
|---|
| 252 |  ;find the link to send over - need name & ien
 | 
|---|
| 253 |  I $G(WHO("IE LINK IEN")) D
 | 
|---|
| 254 |  .S PARMS("LINK IEN")=WHO("IE LINK IEN")
 | 
|---|
| 255 |  .S PARMS("LINK NAME")=$P($G(^HLCS(870,PARMS("LINK IEN"),0)),"^")
 | 
|---|
| 256 |  .I OK,'$L(PARMS("LINK NAME")) S OK=0,ERROR="INTERFACE ENGINE LOGICAL LINK PROVIDED BUT NOT FOUND"
 | 
|---|
| 257 |  E  I $L($G(WHO("IE LINK NAME"))) D
 | 
|---|
| 258 |  .S PARMS("LINK NAME")=WHO("IE LINK NAME")
 | 
|---|
| 259 |  .S PARMS("LINK IEN")=$O(^HLCS(870,"B",WHO("IE LINK NAME"),0))
 | 
|---|
| 260 |  .I OK,'PARMS("LINK IEN") S OK=0,ERROR="INTERFACE ENGINE LOGICAL LINK PROVIDED BUT NOT FOUND"
 | 
|---|
| 261 |  E  I $G(WHO("FACILITY LINK IEN")) D
 | 
|---|
| 262 |  .S PARMS("LINK IEN")=WHO("FACILITY LINK IEN")
 | 
|---|
| 263 |  .S PARMS("LINK NAME")=$P($G(^HLCS(870,PARMS("LINK IEN"),0)),"^")
 | 
|---|
| 264 |  .I OK,'$L(PARMS("LINK NAME")) S OK=0,ERROR="RECEIVING FACILITY LOGICAL LINK NOT FOUND"
 | 
|---|
| 265 |  E  I $L($G(WHO("FACILITY LINK NAME"))) D
 | 
|---|
| 266 |  .S PARMS("LINK NAME")=WHO("FACILITY LINK NAME")
 | 
|---|
| 267 |  .S PARMS("LINK IEN")=$O(^HLCS(870,"B",WHO("FACILITY LINK NAME"),0))
 | 
|---|
| 268 |  .I OK,'PARMS("LINK IEN") S OK=0,ERROR="RECEIVING FACILITY LOGICAL LINK NOT FOUND"
 | 
|---|
| 269 |  I OK,(('PARMS("LINK IEN"))!(PARMS("LINK NAME")="")) S OK=0,ERROR="LOGICAL LINK TO TRANSMIT OVER NOT SPECIFIED"
 | 
|---|
| 270 |  ;
 | 
|---|
| 271 |  ;need the station # or domain for msg header
 | 
|---|
| 272 |  I OK,'$L(PARMS("RECEIVING FACILITY",2)),'PARMS("RECEIVING FACILITY",1) S OK=0,ERROR="RECEIVING FACILITY STATION # AND DOMAIN NOT SPECIFIED"
 | 
|---|
| 273 |  ;
 | 
|---|
| 274 |  ;append the port#
 | 
|---|
| 275 |  I '$G(WHO("PORT")) S PARMS("RECEIVING FACILITY",2)=PARMS("RECEIVING FACILITY",2)_":"_$$PORT^HLOTLNK($G(WHO("FACILITY LINK IEN")))
 | 
|---|
| 276 |  E  S PARMS("RECEIVING FACILITY",2)=PARMS("RECEIVING FACILITY",2)_":"_WHO("PORT")
 | 
|---|
| 277 |  ;
 | 
|---|
| 278 |  Q OK
 | 
|---|