118 lines
3.7 KiB
Mathematica
118 lines
3.7 KiB
Mathematica
MHV7TB ;WAS/GPM - HL7 BOLUS TRANSMITTER ; [12/31/07 6:15pm]
|
|
;;1.0;My HealtheVet;**2**;Aug 23, 2005;Build 22
|
|
;;Per VHA Directive 2004-038, this routine should not be modified.
|
|
;
|
|
Q
|
|
;
|
|
BOLUS(MSGROOT,XMT,HL) ; Build and Transmit large messages in Bolus mode
|
|
; Walks message in MSGROOT and transmits multiple response messages
|
|
; based on the desired message size in XMT("MAX SIZE").
|
|
; Always creates at least one message with at least one record.
|
|
; Messages may exceed the maximum size by the size of the last record
|
|
; added to the message.
|
|
;
|
|
; Algorithm:
|
|
; Copy original message to temporary storage
|
|
; Extract header segments common to all mesages (MSA,QPD,QRD,QAK,etc)
|
|
; Determine QAK segment postion if exists
|
|
; For each message in the bolus response
|
|
; merge in the common header segments
|
|
; add segments by walking the original message
|
|
; if reach end of orginal message or exceed maximum size
|
|
; if QAK exists update with hit counts
|
|
; transmit message
|
|
;
|
|
; Integration Agreements:
|
|
; 2164 : GENERATE^HLMA
|
|
;
|
|
; Input:
|
|
; MSGROOT - Global root of message array
|
|
; XMT - Transmission parameters
|
|
; XMT("PROTOCOL") - Protocol for deferred transmissions
|
|
; XMT("BUILDER") - Name/tag of message builder routine
|
|
; XMT("MAX SIZE") - Maximum message size
|
|
; XMT("BREAK SEGMENT") - Segment that marks new record
|
|
; HL - HL7 package array variable
|
|
;
|
|
; Output: HL7 Messages Transmitted
|
|
;
|
|
N ORGROOT,ORGCNT,MSGHEAD,HEADSIZE,HEADCNT,QAKPOS,QAKSEG,MSGSIZE,MSGCNT,MAXSIZE,HIT,HITTOT,HITREM,CNT,SEG,SEGTYPE,BREAKPT,FS,END,XMIT,HLRSLT,HLP
|
|
;
|
|
D LOG^MHVUL2("TRANSMIT "_$P(XMT("BUILDER"),"^")_" BOLUS","BEGIN","S","DEBUG")
|
|
;
|
|
S ORGROOT="^TMP(""MHV7 BOLUS ROOT"",$J)"
|
|
M @ORGROOT=@MSGROOT
|
|
K @MSGROOT
|
|
S BREAKPT=XMT("BREAK SEGMENT")
|
|
S MAXSIZE=XMT("MAX SIZE")
|
|
S QAKPOS=0,QAKSEG=""
|
|
S HEADCNT=0,HEADSIZE=0,ORGCNT=0
|
|
S FS=HL("FS") ;field separator
|
|
;
|
|
; Pull out header segments (MSA,QAK,QPD,QRD,etc)
|
|
;-----------------------------------------
|
|
F D Q:SEG=""!(SEGTYPE=BREAKPT)
|
|
. S ORGCNT=ORGCNT+1
|
|
. S SEG=$G(@ORGROOT@(ORGCNT))
|
|
. Q:SEG=""
|
|
. S SEGTYPE=$E(SEG,1,3)
|
|
. Q:SEGTYPE=BREAKPT
|
|
. S MSGHEAD(ORGCNT)=SEG
|
|
. S HEADSIZE=HEADSIZE+$L(SEG)
|
|
. S HEADCNT=HEADCNT+1
|
|
. I SEGTYPE="QAK" D
|
|
. . S QAKPOS=ORGCNT
|
|
. . S QAKSEG=SEG
|
|
. . S HITTOT=$P(QAKSEG,FS,5)
|
|
. . S HITREM=HITTOT
|
|
. . Q
|
|
. Q
|
|
;
|
|
; Create and send message bolus messages
|
|
;-----------------------------------------
|
|
S END=0
|
|
F MSGCNT=1:1 D Q:END
|
|
. ; Merge in header segments
|
|
. M @MSGROOT=MSGHEAD
|
|
. S MSGSIZE=HEADSIZE
|
|
. S CNT=HEADCNT
|
|
. S HIT=0,XMIT=0
|
|
. ; Merge segments into message
|
|
. F D Q:XMIT!END
|
|
. . K SEG S SEG=""
|
|
. . I '$D(@ORGROOT@(ORGCNT)) S END=1 Q
|
|
. . M SEG=@ORGROOT@(ORGCNT)
|
|
. . S SEGTYPE=$E(SEG,1,3)
|
|
. . S MSGSIZE=MSGSIZE+$$SIZE(SEG)
|
|
. . I SEGTYPE=BREAKPT,MSGSIZE>MAXSIZE,HIT>0 S XMIT=1 Q
|
|
. . I SEGTYPE=BREAKPT S HIT=HIT+1
|
|
. . S CNT=CNT+1
|
|
. . M @MSGROOT@(CNT)=SEG
|
|
. . S ORGCNT=ORGCNT+1
|
|
. . Q
|
|
. ; Update QAK
|
|
. I QAKPOS D ;Update QAK
|
|
. . S $P(QAKSEG,FS,6)=HIT ;Hits this payload
|
|
. . S HITREM=HITREM-HIT
|
|
. . S $P(QAKSEG,FS,7)=HITREM ;Hits remaining
|
|
. . S @MSGROOT@(QAKPOS)=QAKSEG
|
|
. . Q
|
|
. D LOG^MHVUL2("BOLUS MESSAGE:"_MSGCNT,HIT_" HITS","S","DEBUG")
|
|
. D LOG^MHVUL2("MESSAGE "_MSGCNT,MSGROOT,"I","DEBUG")
|
|
. ; Transmit message
|
|
. D GENERATE^HLMA(XMT("PROTOCOL"),"GM",1,.HLRSLT,"",.HLP)
|
|
. K @MSGROOT
|
|
. D LOG^MHVUL2("TRANSMIT MESSAGE:"_MSGCNT,.HLRSLT,"M","DEBUG")
|
|
. Q
|
|
;
|
|
K @ORGROOT
|
|
D LOG^MHVUL2("TRANSMIT "_$P(XMT("BUILDER"),"^")_" BOLUS","END","S","DEBUG")
|
|
Q
|
|
;
|
|
SIZE(SEG) ; Calculate the size of a segment
|
|
N LEN,I
|
|
S LEN=$L(SEG)
|
|
S I="" F S I=$O(SEG(I)) Q:I="" S LEN=LEN+$L(SEG(I))
|
|
Q LEN
|
|
;
|