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