[613] | 1 | HLOCNRT ;DAOU/ALA-Generate HL7 Optimized Message ;07/24/2007
|
---|
| 2 | ;;1.6;HEALTH LEVEL SEVEN;**126,132,134,137**;Oct 13, 1995;Build 21
|
---|
| 3 | ;Per VHA Directive 2004-038, this routine should not be modified.
|
---|
| 4 | ;
|
---|
| 5 | ;**Program Description**
|
---|
| 6 | ; This program takes a current HL7 1.6 message and converts
|
---|
| 7 | ; it to use the new HL Optimized code if it follows the standard
|
---|
| 8 | ; 1.6 methodology of protocols.
|
---|
| 9 | ;
|
---|
| 10 | ; **If the VistA HL7 Protocol does not exist, calls to HL Optimized
|
---|
| 11 | ; will have to be coded separately and this program cannot be used**
|
---|
| 12 | Q
|
---|
| 13 | ;
|
---|
| 14 | EN(HLOPRTCL,ARYTYP,HLP,HLL,RESULT) ;Entry Point
|
---|
| 15 | ; Input Parameters
|
---|
| 16 | ; HLOPRTCL = Protocol IEN or Protocol Name
|
---|
| 17 | ; ARYTYP = The array where HL7 message resides
|
---|
| 18 | ; HLP = Additional HL7 message parameters (optional, pass by reference)
|
---|
| 19 | ; These optional subscripts to HLP are supported for input:
|
---|
| 20 | ; "APP ACK RESPONSE" = <tag^routine> to call when the app ack is received
|
---|
| 21 | ; "CONTPTR"
|
---|
| 22 | ; "SECURITY"
|
---|
| 23 | ; "SEQUENCE QUEUE" - queue used to maintain the order of the messages via application acks. If used, the application MUST specify that both an accept ack and application ack be returned.
|
---|
| 24 | ;
|
---|
| 25 | ; HLL (optional, pass by reference) Additional message recipients being dynamically added
|
---|
| 26 | ;
|
---|
| 27 | ; Output
|
---|
| 28 | ; RESULT (pass-by-reference)=<subscriber protocol ien>^<link ien>^<message id>^<0 if sucess, error code if failure>^<optional error message>
|
---|
| 29 | ; If the message was sent to more than 1 destination,
|
---|
| 30 | ; the addtional mssage ids returned as RESULT(1), RESULT(2), etc.
|
---|
| 31 | ; ZTSTOP = Stop processing flag (used by HDR)
|
---|
| 32 | ; Function returns 1 on success, else returns an error message
|
---|
| 33 | ;
|
---|
| 34 | NEW HLORESL,HLMSTATE,APPARMS,WHOTO,ERROR,WHO
|
---|
| 35 | S ZTSTOP=0,HLORESL=1,RESULT=""
|
---|
| 36 | ;
|
---|
| 37 | ; Get IEN of protocol if name is passed
|
---|
| 38 | I '$L(HLOPRTCL) S HLORESL="^99^HL7 1.6 Protocol not found",RESULT="^^"_HLORESL,ZTSTOP=1 Q HLORESL
|
---|
| 39 | I ('HLOPRTCL)!(HLOPRTCL'=+HLOPRTCL) S HLOPRTCL=+$O(^ORD(101,"B",HLOPRTCL,0))
|
---|
| 40 | I 'HLOPRTCL S HLORESL="^99^HL7 1.6 Protocol not found",RESULT="^^"_HLORESL,ZTSTOP=1 Q HLORESL
|
---|
| 41 | I '$D(^ORD(101,HLOPRTCL)) S HLORESL="^99^HL7 1.6 Protocol not found",RESULT="^^"_HLORESL,ZTSTOP=1 Q HLORESL
|
---|
| 42 | ;
|
---|
| 43 | ; If the VistA HL7 Protocol exists, call the Conversion Utility
|
---|
| 44 | ; to set up the APPARMS, WHOTO arrays from protocol logical link,
|
---|
| 45 | ; and the optional HLL and HLP arrays
|
---|
| 46 | D APAR^HLOCVU(HLOPRTCL,.APPARMS,.WHO,.WHOTO,.HLP,.HLL)
|
---|
| 47 | ;
|
---|
| 48 | ; If special HLP parameters are defined, convert them
|
---|
| 49 | I $D(HLP) D
|
---|
| 50 | . I $G(HLP("SECURITY"))'="" S APPARMS("SECURITY")=HLP("SECURITY")
|
---|
| 51 | . I $G(HLP("CONTPTR"))'="" S APPARMS("CONTINUATION POINTER")=HLP("CONTPTR")
|
---|
| 52 | . I $G(HLP("QUEUE"))'="" S APPARMS("QUEUE")=HLP("QUEUE")
|
---|
| 53 | . I $G(HLP("SEQUENCE QUEUE"))'="" S APPARMS("SEQUENCE QUEUE")=HLP("SEQUENCE QUEUE")
|
---|
| 54 | . I $G(HLP("APP ACK RESPONSE"))'="" S APPARMS("APP ACK RESPONSE")=HLP("APP ACK RESPONSE")
|
---|
| 55 | ;
|
---|
| 56 | ; Create HL Optimized message
|
---|
| 57 | I '$$NEWMSG^HLOAPI(.APPARMS,.HLMSTATE,.ERROR) S HLORESL="^99^"_ERROR,ZTSTOP=1,RESULT="^^"_HLORESL Q HLORESL
|
---|
| 58 | I $E(ARYTYP,1)="G" S HLOMESG="^TMP(""HLS"",$J)"
|
---|
| 59 | I $E(ARYTYP,1)="L" S HLOMESG="HLA(""HLS"")"
|
---|
| 60 | ;
|
---|
| 61 | ; Move the existing message from array into HL Optimized
|
---|
| 62 | D MOVEMSG^HLOAPI(.HLMSTATE,HLOMESG)
|
---|
| 63 | ;
|
---|
| 64 | ; Send message via HL Optimized
|
---|
| 65 | I $D(WHOTO) D
|
---|
| 66 | .N COUNT
|
---|
| 67 | .I '$$SENDMANY^HLOAPI1(.HLMSTATE,.APPARMS,.WHOTO) D
|
---|
| 68 | ..S HLORESL="^99^Unable to send message",ZTSTOP=1
|
---|
| 69 | .I $G(WHOTO(1,"IEN")) D
|
---|
| 70 | ..S RESULT=WHO(1)_"^"_$P($G(^HLB(WHOTO(1,"IEN"),0)),"^")_"^"_$S($G(WHOTO(1,"QUEUED")):0,1:1)_"^"_$G(WHOTO(1,"ERROR"))
|
---|
| 71 | .E D
|
---|
| 72 | ..S RESULT=WH0(1)_"^^1^"_$G(WHOTO(1,"ERROR"))
|
---|
| 73 | ..S HLORESL="^99^"_$G(WHOTO(1,"ERROR")),ZTSTOP=1
|
---|
| 74 | .S COUNT=1
|
---|
| 75 | .F S COUNT=$O(WHOTO(COUNT)) Q:'COUNT D
|
---|
| 76 | ..I $G(WHOTO(COUNT,"IEN")) D
|
---|
| 77 | ...S RESULT(COUNT-1)=WHO(COUNT)_"^"_$P($G(^HLB(WHOTO(COUNT,"IEN"),0)),"^")_"^"_$S($G(WHOTO(COUNT,"QUEUED")):0,1:1)_"^"_$G(WHOTO(COUNT,"ERROR"))
|
---|
| 78 | ..E D
|
---|
| 79 | ...S RESULT(COUNT-1)=WH0(COUNT)_"^^1^"_$G(WHOTO(COUNT,"ERROR"))
|
---|
| 80 | ;
|
---|
| 81 | E S HLORESL="^99^Unable to send message",ZTSTOP=1,RESULT="^^"_HLORESL
|
---|
| 82 | Q HLORESL
|
---|