| [613] | 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 | 
|---|