[613] | 1 | PXRMEXU5 ; SLC/PKR - Reminder exchange KIDS utilities, #5. ;03/31/2004
|
---|
| 2 | ;;2.0;CLINICAL REMINDERS;;Feb 04, 2005
|
---|
| 3 | ;==================================================
|
---|
| 4 | BMTABLE(MTABLE,IENROOT,DIQOUT,FDA) ;Build the table for merging
|
---|
| 5 | ;GETS^DIQOUT indexes into the FDA. The merge table has the form:
|
---|
| 6 | ;MTABLE(IENSD)=IENSF. IENSD is the DIQOUT iens and IENSF is the
|
---|
| 7 | ;FDA iens. MTABLE provides a direct replacement of IENSD to IENSF.
|
---|
| 8 | N FNUM,IEN,IENS,IENSD,IENRF,IENSF,IND,LAST,LEN,NULLF,TOPFN
|
---|
| 9 | S FILENUM=$O(FDA(""),-1),IENS=$O(FDA(FILENUM,""),-1)
|
---|
| 10 | S LAST=+$P(IENS,",",1)
|
---|
| 11 | ;Initialize the merge table by looking for identical entries in
|
---|
| 12 | ;DIQOUT and FDA. First create the top level entry.
|
---|
| 13 | S NULLF=0
|
---|
| 14 | S FILENUM=$O(DIQOUT(""))
|
---|
| 15 | S IENSD=$O(DIQOUT(FILENUM,""))
|
---|
| 16 | S LEN=$L(IENSD,",")-1
|
---|
| 17 | S IENS=$P(IENSD,",",LEN)_","
|
---|
| 18 | ;DBIA #2631
|
---|
| 19 | F IND=1:1:LEN-1 S FILENUM=$G(^DD(FILENUM,0,"UP"))
|
---|
| 20 | S TOPFN=FILENUM
|
---|
| 21 | S IENSF=$O(FDA(TOPFN,""))
|
---|
| 22 | S MTABLE(TOPFN,IENS)=IENSF
|
---|
| 23 | ;Build all the entries below the top level.
|
---|
| 24 | S FILENUM=TOPFN
|
---|
| 25 | F S FILENUM=$O(DIQOUT(FILENUM)) Q:FILENUM="" D
|
---|
| 26 | . S IENSD=""
|
---|
| 27 | . F S IENSD=$O(DIQOUT(FILENUM,IENSD)) Q:IENSD="" D
|
---|
| 28 | .. S MTABLE(FILENUM,IENSD)=""
|
---|
| 29 | .. I '$D(FDA(FILENUM)) S NULLF=1 Q
|
---|
| 30 | ..;Look for matches based on identical .01s
|
---|
| 31 | .. S IENSF=""
|
---|
| 32 | .. F S IENSF=$O(FDA(FILENUM,IENSF)) Q:IENSF="" D
|
---|
| 33 | ... I $G(DIQOUT(FILENUM,IENSD,.01))=$G(FDA(FILENUM,IENSF,.01)) S MTABLE(FILENUM,IENSD)=IENSF
|
---|
| 34 | ... E S NULLF=1
|
---|
| 35 | ;Entries that are equal to null at this point don't have a
|
---|
| 36 | ;corresponding FDA entry.
|
---|
| 37 | I 'NULLF Q
|
---|
| 38 | S FILENUM=""
|
---|
| 39 | F S FILENUM=$O(FDA(FILENUM)) Q:FILENUM="" D
|
---|
| 40 | . S IENSF=""
|
---|
| 41 | . F S IENSF=$O(FDA(FILENUM,IENSF)) Q:IENSF="" D
|
---|
| 42 | .. S IND=+IENSF
|
---|
| 43 | .. I IENROOT(IND)'="" S IENRF(FILENUM,IENROOT(IND))=IND
|
---|
| 44 | ;IENRF keeps track of the IENROOT entries by file number.
|
---|
| 45 | S FILENUM=""
|
---|
| 46 | F S FILENUM=$O(MTABLE(FILENUM)) Q:FILENUM="" D
|
---|
| 47 | . S IENSD=""
|
---|
| 48 | . F S IENSD=$O(MTABLE(FILENUM,IENSD)) Q:IENSD="" D
|
---|
| 49 | .. I MTABLE(FILENUM,IENSD)'="" Q
|
---|
| 50 | .. D MMTAB(.MTABLE,.IENROOT,.LAST,FILENUM,IENSD,.IENRF)
|
---|
| 51 | Q
|
---|
| 52 | ;
|
---|
| 53 | ;==================================================
|
---|
| 54 | LOIEN(FILENUM) ;Find the first open ien in a global.
|
---|
| 55 | N GBL,I1,I2,OIEN
|
---|
| 56 | S GBL=$$GET1^DID(FILENUM,"","","GLOBAL NAME")_"I1)"
|
---|
| 57 | S OIEN=-1
|
---|
| 58 | S (I1,I2)=0
|
---|
| 59 | F S I1=+$O(@GBL) Q:(OIEN>0)!(I1=0) D
|
---|
| 60 | . I ((I1-I2)>1)!(I1="") S OIEN=I2+1 Q
|
---|
| 61 | . S I2=I1
|
---|
| 62 | I OIEN=-1 S OIEN=I2+1
|
---|
| 63 | Q OIEN
|
---|
| 64 | ;
|
---|
| 65 | ;==================================================
|
---|
| 66 | MERGE(FILENUM,IEN,FIELD,FDA,IENROOT) ;Merge existing site entries into
|
---|
| 67 | ;the FDA that is loaded from Exchange.
|
---|
| 68 | ;FILENUM - the file number
|
---|
| 69 | ;IEN - internal entry number
|
---|
| 70 | ;FIELD - semicolon separated list of fields.
|
---|
| 71 | ;These the are arguments for GETS^DIQ, see that documentation for
|
---|
| 72 | ;more information.
|
---|
| 73 | ;FDA and IENROOT are the FDA and IENROOT for UPDATE^DIE. These
|
---|
| 74 | ;are already setup with the contents of the packed reminder before
|
---|
| 75 | ;this routine is called.
|
---|
| 76 | ;The default is to merge any nodes of the FDA with the nodes
|
---|
| 77 | ;already existing at the site. If MODE="R" then the existing nodes
|
---|
| 78 | ;will be replaced with the nodes already in the FDA.
|
---|
| 79 | N DIQOUT,IENSD,IENSF,IND,IND1,IND2,IND2S,IND3,LE,MSG,MTABLE
|
---|
| 80 | N SITE,TIENROOT
|
---|
| 81 | S IENS=IEN_","
|
---|
| 82 | D GETS^DIQ(FILENUM,IENS,FIELD,"","DIQOUT","MSG")
|
---|
| 83 | I $D(MSG) D Q
|
---|
| 84 | . N ETEXT,FILENAME
|
---|
| 85 | . S FILENAME=$$GET1^DID(FILENUM,"","","NAME")
|
---|
| 86 | . S ETEXT="GETS^DIQ failed for "_FILENAME_" entry "_IEN_", it returned the following error message:"
|
---|
| 87 | . W !,ETEXT
|
---|
| 88 | . D AWRITE^PXRMUTIL("MSG")
|
---|
| 89 | . H 2
|
---|
| 90 | . K MSG
|
---|
| 91 | ;If there is nothing to merge quit.
|
---|
| 92 | I '$D(DIQOUT) Q
|
---|
| 93 | ;Clean up DIQOUT remove null entries and change pointers to the resolved
|
---|
| 94 | ;form.
|
---|
| 95 | D CLDIQOUT^PXRMEXPU(.DIQOUT)
|
---|
| 96 | ;If there is nothing left to merge quit.
|
---|
| 97 | I '$D(DIQOUT) Q
|
---|
| 98 | ;Build the merge table.
|
---|
| 99 | D BMTABLE(.MTABLE,.IENROOT,.DIQOUT,.FDA)
|
---|
| 100 | ;Do the merge
|
---|
| 101 | S FILENUM=""
|
---|
| 102 | F S FILENUM=$O(DIQOUT(FILENUM)) Q:FILENUM="" D
|
---|
| 103 | . S IENSD=""
|
---|
| 104 | . F S IENSD=$O(DIQOUT(FILENUM,IENSD)) Q:IENSD="" D
|
---|
| 105 | .. S IENSF=MTABLE(FILENUM,IENSD)
|
---|
| 106 | .. S FIELD=""
|
---|
| 107 | .. F S FIELD=$O(DIQOUT(FILENUM,IENSD,FIELD)) Q:FIELD="" D
|
---|
| 108 | ... S FDA(FILENUM,IENSF,FIELD)=DIQOUT(FILENUM,IENSD,FIELD)
|
---|
| 109 | Q
|
---|
| 110 | ;
|
---|
| 111 | ;==================================================
|
---|
| 112 | MMTAB(MTABLE,IENROOT,LAST,FILENUM,IENS,IENRF) ;Generate a merge table entry.
|
---|
| 113 | N IENRL,FNUP,UP,UPIENS
|
---|
| 114 | S UP=$P(IENS,",",2,99)
|
---|
| 115 | ;DBIA #2631
|
---|
| 116 | S FNUP=$G(^DD(FILENUM,0,"UP"))
|
---|
| 117 | S UPIENS=MTABLE(FNUP,UP)
|
---|
| 118 | S LAST=LAST+1
|
---|
| 119 | S MTABLE(FILENUM,IENS)="+"_LAST_","_UPIENS
|
---|
| 120 | S IENRL=$O(IENRF(FILENUM,""),-1)+1
|
---|
| 121 | S IENROOT(LAST)=IENRL,IENRF(FILENUM,IENRL)=LAST
|
---|
| 122 | Q
|
---|
| 123 | ;
|
---|
| 124 | ;==================================================
|
---|
| 125 | NONULL(PXRMRIEN) ;Set any lines with a length of 0 equal to a space
|
---|
| 126 | ;so KIDS will not delete them.
|
---|
| 127 | N IND
|
---|
| 128 | S IND=0
|
---|
| 129 | F S IND=+$O(^PXD(811.8,PXRMRIEN,100,IND)) Q:IND=0 D
|
---|
| 130 | . I $L(^PXD(811.8,PXRMRIEN,100,IND,0))=0 S ^PXD(811.8,PXRMRIEN,100,IND,0)=" "
|
---|
| 131 | Q
|
---|
| 132 | ;
|
---|
| 133 | ;==================================================
|
---|
| 134 | POSTKIDS(PXRMRIEN) ;Change all ACK characters in node 100 of Exchange
|
---|
| 135 | ;File entry PXRMRIEN back to "^".
|
---|
| 136 | N ACK,UPA
|
---|
| 137 | S ACK=$C(6)
|
---|
| 138 | S UPA="^"
|
---|
| 139 | D REPCHAR(PXRMRIEN,ACK,UPA)
|
---|
| 140 | Q
|
---|
| 141 | ;
|
---|
| 142 | ;==================================================
|
---|
| 143 | PREKIDS(PXRMRIEN) ;Change all "^" characters in node 100 of Exchange
|
---|
| 144 | ;File entry PXRMRIEN so that KIDS does not truncate lines when it
|
---|
| 145 | ;installs the file.
|
---|
| 146 | N ACK,UPA
|
---|
| 147 | S ACK=$C(6)
|
---|
| 148 | S UPA="^"
|
---|
| 149 | D REPCHAR(PXRMRIEN,UPA,ACK)
|
---|
| 150 | D NONULL(PXRMRIEN)
|
---|
| 151 | Q
|
---|
| 152 | ;
|
---|
| 153 | ;==================================================
|
---|
| 154 | REPCHAR(PXRMRIEN,CHAR1,CHAR2) ;Replace CHAR1 with CHAR2 for all lines in node
|
---|
| 155 | ;100 of entry PXRMRIEN of the Exchange File.
|
---|
| 156 | N IND,LINE
|
---|
| 157 | S IND=0
|
---|
| 158 | F S IND=+$O(^PXD(811.8,PXRMRIEN,100,IND)) Q:IND=0 D
|
---|
| 159 | . S LINE=$TR(^PXD(811.8,PXRMRIEN,100,IND,0),CHAR1,CHAR2)
|
---|
| 160 | . S ^PXD(811.8,PXRMRIEN,100,IND,0)=LINE
|
---|
| 161 | Q
|
---|
| 162 | ;
|
---|
| 163 | ;==================================================
|
---|
| 164 | SCLASS(FILENUM,CLASS,FDA) ;Set the class field in those files that use it.
|
---|
| 165 | I '$D(PXRMCLAS) Q
|
---|
| 166 | N ERRMSG,IND,FNAME
|
---|
| 167 | S FNAME=$$GET1^DID(FILENUM,100,"","LABEL","","ERRMSG")
|
---|
| 168 | I FNAME="CLASS" D
|
---|
| 169 | . S IND=$O(FDA(FILENUM,""))
|
---|
| 170 | . I $D(FDA(FILENUM,IND,100)) S FDA(FILENUM,IND,100)=PXRMCLAS
|
---|
| 171 | Q
|
---|
| 172 | ;
|
---|