1 | RORHL7 ;HCIOFO/SG - HL7 UTILITIES ; 11/2/05 10:30am
|
---|
2 | ;;1.5;CLINICAL CASE REGISTRIES;;Feb 17, 2006
|
---|
3 | ;
|
---|
4 | Q
|
---|
5 | ;
|
---|
6 | ;***** ADDS THE SEGMENT TO THE HL7 MESSAGE BUFFER
|
---|
7 | ;
|
---|
8 | ; .SOURCE Reference to a local variable where the
|
---|
9 | ; source data is stored
|
---|
10 | ;
|
---|
11 | ; [SRCTYPE] Type and format of the source data
|
---|
12 | ; "C" Complete segment (see the ADDSEGC^RORHL7A
|
---|
13 | ; for source data format description)
|
---|
14 | ; "F" List of field values (see the ADDSEGF^RORHL7A
|
---|
15 | ; for source data format description).
|
---|
16 | ; This is the default parameter value.
|
---|
17 | ;
|
---|
18 | ADDSEG(SOURCE,SRCTYPE) ;
|
---|
19 | I $G(SRCTYPE)?."F" D ADDSEGF^RORHL7A(.SOURCE) Q
|
---|
20 | I SRCTYPE="C" D ADDSEGC^RORHL7A(.SOURCE) Q
|
---|
21 | D ERROR^RORERR(-88,,,,"SRCTYPE",$G(SRCTYPE))
|
---|
22 | Q
|
---|
23 | ;
|
---|
24 | ;***** CREATES A NEW MESSAGE IN THE BATCH
|
---|
25 | ;
|
---|
26 | ; The function adds a new message header to the batch. If the batch
|
---|
27 | ; does not exist yet, it is created.
|
---|
28 | ;
|
---|
29 | ; [.RORMSH] Reference to a variable in what a MSH segment of
|
---|
30 | ; the message is returned.
|
---|
31 | ;
|
---|
32 | ; Return Values:
|
---|
33 | ; <0 Error Code
|
---|
34 | ; >0 Index of a subnode of the ^TMP("HLS",$J) that
|
---|
35 | ; contains the new MSH segment.
|
---|
36 | ;
|
---|
37 | ; MSH segment is returned as a value of the RORMSH parameter. In case
|
---|
38 | ; of a long segment, continuations are returned as subnodes.
|
---|
39 | ;
|
---|
40 | ; Several nodes (HL7*) in ROREXT are set and the ^TMP("HLS",$J) node
|
---|
41 | ; is deleted by this entry point before it creates a new batch.
|
---|
42 | ;
|
---|
43 | CREATE(RORMSH) ;
|
---|
44 | N NDX,RC,TMP K RORMSH
|
---|
45 | Q:$G(ROREXT("HL7PROT"))="" $$ERROR^RORERR(-25)
|
---|
46 | ;--- Create a message stub for the new batch message
|
---|
47 | ; (if it has not been created before)
|
---|
48 | I '$G(ROREXT("HL7MTIEN")) D Q:$G(RC)<0 RC
|
---|
49 | . N RORMID,RORIEN,RORDT
|
---|
50 | . ;--- Set up HL7 environment variables
|
---|
51 | . S RC=$$INIT($NA(^TMP("HLS",$J))) Q:RC<0
|
---|
52 | . ;--- Create a stub
|
---|
53 | . S RORDT=$S($G(ROREXT("HDTIEN"))>0:$G(ROREXT("HL7DT")),1:"")
|
---|
54 | . D CREATE^HLTF(.RORMID,.RORIEN,.RORDT)
|
---|
55 | . ;--- Save parameters of the new batch message
|
---|
56 | . S (ROREXT("HL7CNT"),ROREXT("HL7SIZE"))=0
|
---|
57 | . S ROREXT("HL7DT")=RORDT
|
---|
58 | . S ROREXT("HL7MID")=RORMID
|
---|
59 | . S ROREXT("HL7MTIEN")=RORIEN
|
---|
60 | . ;--- Initialize temporary storage
|
---|
61 | . K ^TMP("HLS",$J)
|
---|
62 | ;--- Initialize the HL7 environment variables
|
---|
63 | S RC=$$INIT() Q:RC<0 RC
|
---|
64 | S NDX=$G(ROREXT("HL7PTR"))+1
|
---|
65 | ;--- Reset the Set ID's for all supported segments
|
---|
66 | F TMP="OBR","OBX","PID","PV1","ZRD","ZSP" D
|
---|
67 | . S ROREXT("HL7SID",TMP)=1
|
---|
68 | ;--- Create and store a MSH segment for individual message
|
---|
69 | S ROREXT("HL7CNT")=ROREXT("HL7CNT")+1
|
---|
70 | S TMP=ROREXT("HL7MID")_"-"_ROREXT("HL7CNT")
|
---|
71 | D MSH^HLFNC2(.RORHL,TMP,.RORMSH)
|
---|
72 | S:$P(RORMSH,RORHL("FS"),17)="US" $P(RORMSH,RORHL("FS"),17)="USA"
|
---|
73 | M ^TMP("HLS",$J,NDX)=RORMSH
|
---|
74 | S ROREXT("HL7SIZE")=ROREXT("HL7SIZE")+$L(RORMSH)+$L($G(RORMSH(1)))+1
|
---|
75 | S ROREXT("HL7PTR")=NDX
|
---|
76 | Q NDX
|
---|
77 | ;
|
---|
78 | ;***** REPLACES ENCODING CHARACTERS WITH ESCAPE CODES
|
---|
79 | ;
|
---|
80 | ; STR Source string
|
---|
81 | ;
|
---|
82 | ; The HLFS and HLECH variables must be initialized before
|
---|
83 | ; calling this function (either by the INIT^HLFNC2 or manually).
|
---|
84 | ;
|
---|
85 | ; The function returns the source string with encoding
|
---|
86 | ; characters replaced with corresponding escape codes.
|
---|
87 | ;
|
---|
88 | ESCAPE(STR) ;
|
---|
89 | Q:STR="" STR
|
---|
90 | N BUF,ESC,CH,I1,I2,SCLST
|
---|
91 | S SCLST=HLECH_HLFS
|
---|
92 | ;--- Find all occurrences of encoding characters and
|
---|
93 | ; save their positions to a local array
|
---|
94 | F I1=1:1:5 S CH=$E(SCLST,I1),I2=1 Q:CH="" D
|
---|
95 | . F S I2=$F(STR,CH,I2) Q:'I2 S BUF(I2-1)=I1
|
---|
96 | Q:$D(BUF)<10 STR
|
---|
97 | ;--- Replace encoding characters with escape codes
|
---|
98 | S (BUF,I2)="",ESC=$E(HLECH,3) S:ESC="" ESC="\"
|
---|
99 | F S I1=I2,I2=$O(BUF(I2)) Q:I2="" D
|
---|
100 | . S BUF=BUF_$E(STR,I1+1,I2-1)_ESC_$E("SRETF",BUF(I2))_ESC
|
---|
101 | Q BUF_$E(STR,I1+1,$L(STR))
|
---|
102 | ;
|
---|
103 | ;***** CHECKS THE DATE/TIME AND CONVERTS IT TO HL7 FORMAT
|
---|
104 | ;
|
---|
105 | ; DATE Date/time in FileMan format
|
---|
106 | ;
|
---|
107 | FM2HL(DATE) ;
|
---|
108 | Q:'$G(DATE) """"""
|
---|
109 | S DATE=$$FMTHL7^XLFDT(DATE)
|
---|
110 | Q $S(DATE>0:DATE,1:"")
|
---|
111 | ;
|
---|
112 | ;***** INITIALIZES THE HL7 SEPARATORS
|
---|
113 | ;
|
---|
114 | ; [.CS] Reference to a local variable where the
|
---|
115 | ; component separator will be returned to.
|
---|
116 | ;
|
---|
117 | ; [.SCS] Reference to a local variable where the
|
---|
118 | ; sub-component separator will be returned to.
|
---|
119 | ;
|
---|
120 | ; [.RPS] Reference to a local variable where the
|
---|
121 | ; repetition separator will be returned to.
|
---|
122 | ;
|
---|
123 | ECH(CS,SCS,RPS) ;
|
---|
124 | S HLECH=$G(RORHL("ECH"),"^~\&")
|
---|
125 | S CS=$E(HLECH,1),SCS=$E(HLECH,4),RPS=$E(HLECH,2)
|
---|
126 | Q
|
---|
127 | ;
|
---|
128 | ;***** INITIALIZES THE HL7 ENVIRONMENT VARIABLES
|
---|
129 | ;
|
---|
130 | ; [ROR8FILE] Closed root of the buffer that will be used for
|
---|
131 | ; construction of the HL7 message.
|
---|
132 | ;
|
---|
133 | ; Return Values:
|
---|
134 | ; <0 Error Code
|
---|
135 | ; 0 Ok
|
---|
136 | ;
|
---|
137 | INIT(ROR8FILE) ;
|
---|
138 | N TMP K RORHL
|
---|
139 | D INIT^HLFNC2(ROREXT("HL7PROT"),.RORHL)
|
---|
140 | Q:$G(RORHL) $$ERROR^RORERR(-23,,RORHL)
|
---|
141 | S TMP=$G(RORHL("ECH"))
|
---|
142 | Q:$L(TMP)<4 $$ERROR^RORERR(-75)
|
---|
143 | ;--- Initialize the nodes required for the API's
|
---|
144 | S:$G(ROR8FILE)'="" ROREXT("HL7BUF")=ROR8FILE
|
---|
145 | D:$G(ROREXT("HL7BUF"))'=""
|
---|
146 | . S ROREXT("HL7PTR")=+$O(@ROREXT("HL7BUF")@(""),-1)
|
---|
147 | Q 0
|
---|
148 | ;
|
---|
149 | ;***** CHECKS IF MAXIMUM BATCH SIZE IS REACHED
|
---|
150 | ;
|
---|
151 | ; [RESERVE] Number of bytes reserved in the batch (0 by default)
|
---|
152 | ;
|
---|
153 | ; Return Values:
|
---|
154 | ; 0 Messages can be added to the batch
|
---|
155 | ; 1 Maximum size of the batch has been reached
|
---|
156 | ;
|
---|
157 | ISMAXSZ(RESERVE) ;
|
---|
158 | Q:$G(ROREXT("MAXHL7SIZE"))'>0 0
|
---|
159 | Q:($G(ROREXT("HL7SIZE"))+$G(RESERVE))<ROREXT("MAXHL7SIZE") 0
|
---|
160 | S $P(ROREXT("HL7SIZE"),U,2)=1
|
---|
161 | Q 1
|
---|
162 | ;
|
---|
163 | ;***** RETURNS NUMBER OF MESSAGES IN THE CURRENT BATCH
|
---|
164 | MSGCNT() ;
|
---|
165 | Q $G(ROREXT("HL7CNT"))
|
---|
166 | ;
|
---|
167 | ;***** RETURNS THE POINTER TO LAST SEGMENT IN THE MESSAGE BUFFER
|
---|
168 | PTR() Q +$G(ROREXT("HL7PTR"))
|
---|
169 | ;
|
---|
170 | ;***** DELETES THE SEGMENTS FROM THE HL7 MESSAGE BUFFER
|
---|
171 | ;
|
---|
172 | ; SEGPTR An index of the HL7 segment in the message buffer
|
---|
173 | ;
|
---|
174 | ; [KEEP] Keep the segment referenced by the SEGPTR and start
|
---|
175 | ; the rollback from the next segment.
|
---|
176 | ;
|
---|
177 | ROLLBACK(SEGPTR,KEEP) ;
|
---|
178 | N BUF,I,I1,MSH,NODE,SEGNAME
|
---|
179 | S NODE=ROREXT("HL7BUF"),HLFS=$G(RORHL("FS"),"|")
|
---|
180 | S I=$S($G(KEEP):$O(@NODE@(SEGPTR)),1:+SEGPTR)
|
---|
181 | S MSH=$S(I>0:$P($G(@NODE@(I)),HLFS)="MSH",1:0)
|
---|
182 | ;---
|
---|
183 | F Q:I'>0 D S I=$O(@NODE@(I))
|
---|
184 | . S BUF=$G(@NODE@(I))
|
---|
185 | . ;--- Decrement the batch size indicator
|
---|
186 | . S ROREXT("HL7SIZE")=$G(ROREXT("HL7SIZE"))-$L(BUF)-1
|
---|
187 | . S I1=""
|
---|
188 | . F S I1=$O(@NODE@(I,I1)) Q:I1="" D
|
---|
189 | . . S ROREXT("HL7SIZE")=ROREXT("HL7SIZE")-$L(@NODE@(I,I1))
|
---|
190 | . ;--- Decrement the 'Set ID' counter if necessary
|
---|
191 | . S SEGNAME=$P(BUF,HLFS),I1=+$G(ROREXT("HL7SID",SEGNAME))
|
---|
192 | . I I1>0 S:$P(BUF,HLFS,2)>0 ROREXT("HL7SID",SEGNAME)=I1-1
|
---|
193 | . ;--- Delete the segment
|
---|
194 | . K @NODE@(I)
|
---|
195 | ;--- Validate current size of the batch
|
---|
196 | S:$G(ROREXT("HL7SIZE"))<0 ROREXT("HL7SIZE")=0
|
---|
197 | ;--- Decrease number of messages in the batch if necessary
|
---|
198 | I MSH S:$G(ROREXT("HL7CNT"))>0 ROREXT("HL7CNT")=ROREXT("HL7CNT")-1
|
---|
199 | Q
|
---|
200 | ;
|
---|
201 | ;***** SENDS THE BATCH MESSAGE
|
---|
202 | ;
|
---|
203 | ; .MID Reference to a local variable where the batch
|
---|
204 | ; message ID (returned by the GENERATE^HLMA) is
|
---|
205 | ; returned to.
|
---|
206 | ;
|
---|
207 | ; Return Values:
|
---|
208 | ; <0 Error Code
|
---|
209 | ; 0 Ok
|
---|
210 | ; >0 There was nothing to send
|
---|
211 | ;
|
---|
212 | ; Several nodes (HL7*) in the ROREXT and the ^TMP("HLS",$J) node
|
---|
213 | ; are deleted by this entry point.
|
---|
214 | ;
|
---|
215 | SEND(MID) ;
|
---|
216 | N RC,RORBUF,RORHLP S MID=""
|
---|
217 | Q:$G(ROREXT("HL7PROT"))="" $$ERROR^RORERR(-25)
|
---|
218 | ;--- Quit if there is nothing to send
|
---|
219 | Q:'$G(ROREXT("HL7MTIEN"))!($D(^TMP("HLS",$J))<10) 1
|
---|
220 | ;--- Set up the HL7 environment variables
|
---|
221 | D INIT^HLFNC2(ROREXT("HL7PROT"),.RORHL)
|
---|
222 | Q:$G(RORHL) $$ERROR^RORERR(-23,,RORHL)
|
---|
223 | ;--- Send the message
|
---|
224 | S RORHLP("NAMESPACE")="ROR"
|
---|
225 | D GENERATE^HLMA(ROREXT("HL7PROT"),"GB",1,.RORBUF,ROREXT("HL7MTIEN"),.RORHLP)
|
---|
226 | S RC=$S($P(RORBUF,U,2):$$ERROR^RORERR(-24,,RORBUF),1:0)
|
---|
227 | S MID=$P(RORBUF,U)
|
---|
228 | ;--- Cleanup if there is no error or not in debug mode
|
---|
229 | D:'$G(RORPARM("DEBUG"))!(RC'<0)
|
---|
230 | . F TMP="HL7CNT","HL7MTIEN","HL7SIZE" K ROREXT(TMP)
|
---|
231 | . K ^TMP("HLS",$J)
|
---|
232 | Q RC
|
---|