Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: MHV7TB

MHV7TB.m

Go to the documentation of this file.
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
 ;