Ignore:
Timestamp:
Dec 4, 2009, 12:11:15 AM (14 years ago)
Author:
George Lilly
Message:

revised back to 6/30/08 version

File:
1 edited

Legend:

Unmodified
Added
Removed
  • WorldVistAEHR/trunk/r/HEALTH_LEVEL_SEVEN-HL/HLOF778.m

    r613 r623  
    1 HLOF778 ;ALB/CJM-HL7 - Saving messages to file 778 ;07/10/2007
    2         ;;1.6;HEALTH LEVEL SEVEN;**126,134,137**;Oct 13, 1995;Build 21
    3         ;Per VHA Directive 2004-038, this routine should not be modified.
    4         ;
    5         ;
    6 SAVEMSG(HLMSTATE)       ;
    7         ;If a record has not yet been created in file 778, then it will be created. Will file any segments into 777 not yet stored.  For batch messages, will store the MSH segments in 778 as the individual messages are stored in 777.
    8         ;Input:
    9         ;  HLMSTATE (pass by reference) - contains information about the message
    10         ;    These subscripts must be defined:
    11         ;  ("BATCH")=1 if batch, 0 otherwise
    12         ;  ("BATCH","BTS")=BTS segment if end of batch reached
    13         ;  ("BODY")=ien file 777 if stored
    14         ;  ("DIRECTION")=<"IN" or "OUT">
    15         ;  ("IEN")=ien,file 778 if stored
    16         ;  ("UNSTORED LINES") - count of lines to be stored.  The lines are at the a lower subscript level <msg>,<segment>,<line>=<line to be stored>
    17         ;  ("UNSTORED MSH") For batch messages, set to 1 if there are MSH in cache. Cached MSH at ("UNSTORED MSH",<subfile ien>,<1 & 2>)
    18         ;
    19         ;Output:
    20         ;  Function - returns the ien of the msg (file 778)
    21         ;  HLMSTATE
    22         ;   ("BODY") - set to ien, file 777 if newly created
    23         ;   ("IEN") - set to ien, file 778 if newly created
    24         ;   ("UNSTORED LINES")-set to 0 as this function will store them
    25         ;   ("UNSTORED MSH")- set to 0 as this function will store it
    26         ;
    27         ;
    28         I '$D(HLMSTATE("DT/TM")) S HLMSTATE("DT/TM")=$S(HLMSTATE("DIRECTION")="IN":$$NOW^XLFDT,1:"")
    29         ;
    30         ;insure that 777 entry created & all segments stored
    31         I ('HLMSTATE("BODY"))!($G(HLMSTATE("UNSTORED LINES")))!($L($G(HLMSTATE("BATCH","BTS")))),'$$SAVEMSG^HLOF777(.HLMSTATE) Q 0
    32         ;
    33         ;insure 778 entry created
    34         I 'HLMSTATE("IEN") Q:'$$NEW^HLOF778A(.HLMSTATE) 0
    35         ;
    36         ;for batch messages, store MSH segments in 778
    37         I HLMSTATE("BATCH") D
    38         .N IEN S IEN=HLMSTATE("IEN")
    39         .;
    40         .;incoming messages cache the MSH segments in memory
    41         .I HLMSTATE("DIRECTION")="IN",HLMSTATE("UNSTORED MSH") D
    42         ..N ORDER S ORDER=0
    43         ..F  S ORDER=$O(HLMSTATE("UNSTORED MSH",ORDER)) Q:'ORDER  D
    44         ...N FS,MSGID
    45         ...S FS=$E(HLMSTATE("UNSTORED MSH",ORDER,1),4)
    46         ...S MSGID=$P(HLMSTATE("UNSTORED MSH",ORDER,2),FS,5)
    47         ...S ^HLB(IEN,3,ORDER,0)=ORDER_"^"_MSGID_"^"_$G(HLMSTATE("BATCH","ACK TO",ORDER))
    48         ...S ^HLB(IEN,3,ORDER,1)=HLMSTATE("UNSTORED MSH",ORDER,1)
    49         ...S ^HLB(IEN,3,ORDER,2)=HLMSTATE("UNSTORED MSH",ORDER,2)
    50         ...S ^HLB(IEN,3,"B",ORDER,ORDER)=""
    51         ...I MSGID]"" S ^HLB("AE",MSGID,IEN_"^"_ORDER)="" ;whole file index for individual message id
    52         ..K HLMSTATE("UNSTORED MSH") S HLMSTATE("UNSTORED MSH")=0
    53         .;
    54         .;
    55         .I HLMSTATE("DIRECTION")="OUT" D
    56         ..;must build the MSH segments!
    57         ..N HDR,FS,MSG,CS
    58         ..S FS=HLMSTATE("HDR","FIELD SEPARATOR")
    59         ..S CS=$E(HLMSTATE("HDR","ENCODING CHARACTERS"),1)
    60         ..S HLMSTATE("HDR","MESSAGE TYPE")="   "
    61         ..S HLMSTATE("HDR","EVENT")="   "
    62         ..D BUILDHDR^HLOPBLD1(.HLMSTATE,"MSH",.HDR)
    63         ..S HLMSTATE("BATCH","CURRENT MESSAGE")=$O(^HLB(HLMSTATE("IEN"),3,"B",";"),-1)
    64         ..F  Q:'$$NEXTMSG(.HLMSTATE,.MSG)  D
    65         ...N MSGID,CUR
    66         ...S CUR=HLMSTATE("BATCH","CURRENT MESSAGE")
    67         ...S MSGID=HLMSTATE("HDR","BATCH CONTROL ID")_"-"_CUR
    68         ...S $P(HDR(2),FS,4)=MSG("MESSAGE TYPE")_CS_MSG("EVENT")
    69         ...S $P(HDR(2),FS,5)=MSGID
    70         ...S ^HLB(IEN,3,CUR,0)=CUR_"^"_MSGID_"^"_$G(HLMSTATE("BATCH","ACK TO",CUR))
    71         ...S ^HLB(IEN,3,CUR,1)=HDR(1)
    72         ...S ^HLB(IEN,3,CUR,2)=HDR(2)
    73         ...S ^HLB(IEN,3,"B",CUR,CUR)=""
    74         ...S ^HLB("AE",MSGID,IEN_"^"_CUR)="" ;whole file index for individual message id
    75         ..;
    76         .;if the messages are application acks, then update the original message
    77         .N SUBIEN S SUBIEN=0
    78         .F  S SUBIEN=$O(HLMSTATE("BATCH","ACK TO",SUBIEN)) Q:'SUBIEN  I $G(HLMSTATE("BATCH","ACK TO",SUBIEN,"IEN"))]"" D
    79         ..N ACKTO
    80         ..M ACKTO=HLMSTATE("BATCH","ACK TO",SUBIEN)
    81         ..;
    82         ..;for outgoing msgs, we just created the msgid, for incoming msgs we already had it
    83         ..S:HLMSTATE("DIRECTION")="OUT" ACKTO("ACK BY")=HLMSTATE("HDR","BATCH CONTROL ID")_"-"_SUBIEN
    84         ..;
    85         ..D ACKTO(.HLMSTATE,.ACKTO)
    86         .K HLMSTATE("BATCH","ACK TO")
    87         ;
    88         ;if the msg is an app ack, update the original if not done already
    89         I $G(HLMSTATE("ACK TO","IEN"))]"",'$G(HLMSTATE("ACK TO","DONE")) D
    90         .N ACKTO
    91         .M ACKTO=HLMSTATE("ACK TO")
    92         .S ACKTO("ACK BY")=$S(HLMSTATE("BATCH"):HLMSTATE("HDR","BATCH CONTROL ID"),1:HLMSTATE("HDR","MESSAGE CONTROL ID"))
    93         .D ACKTO(.HLMSTATE,.ACKTO)
    94         .S HLMSTATE("ACK TO","DONE")=1 ;so the update isn't done again
    95         ;
    96         Q HLMSTATE("IEN")
    97         ;
    98 NEXTMSG(HLMSTATE,MSG)   ;
    99         ;Traverses file 777 to return the next message in the batch - as
    100         ;indicated by HLMSTATE("BATCH","CURRENT MESSAGE")  Set to 0 to start,
    101         ;returns 0 when there are no more messages
    102         ;
    103         ;Input:  HLMSTATE (pass by reference,required)
    104         ;Output:
    105         ;  HLMSTATE
    106         ;     ("BATCH","CURRENT MESSAGE")
    107         ;  MSG -pass by reference:
    108         ;     ("EVENT")
    109         ;     ("MESSAGE TYPE")
    110         ;
    111         ;
    112         N SUBIEN,NODE
    113         K MSG
    114         Q:'$G(HLMSTATE("BODY")) 0
    115         S SUBIEN=$O(^HLA(HLMSTATE("BODY"),2,HLMSTATE("BATCH","CURRENT MESSAGE")))
    116         Q:'SUBIEN 0
    117         S NODE=$G(^HLA(HLMSTATE("BODY"),2,SUBIEN,0))
    118         S MSG("MESSAGE TYPE")=$P(NODE,"^",2)
    119         S MSG("EVENT")=$P(NODE,"^",3)
    120         S HLMSTATE("BATCH","CURRENT MESSAGE")=SUBIEN
    121         Q SUBIEN
    122         ;
    123 ACKTO(HLMSTATE,ACKTO)   ;if this is an application ack, update the original message - but do not overlay if already valued
    124         ;ACKTO = (msgid of msg being ack'd)
    125         ;        uses these subscripts ("IEN"=ien^subien),("ACK BY"=msgid of acking msg),("STATUS"=status for the initial msg determined by the ack)
    126         ;
    127         N STATUS,IEN,SUBIEN,NODE,SKIP
    128         S SKIP=0
    129         S STATUS=$G(ACKTO("STATUS"))
    130         S IEN=+ACKTO("IEN"),SUBIEN=$P(ACKTO("IEN"),"^",2)
    131         S NODE=$G(^HLB(IEN,0))
    132         I 'SUBIEN D
    133         .;ack is to a message NOT in a batch
    134         .I $P(NODE,"^",7)'="",$P(NODE,"^",7)'=ACKTO("ACK BY") S SKIP=1 Q
    135         .I STATUS="" S STATUS="SU"
    136         .S $P(NODE,"^",7)=ACKTO("ACK BY")
    137         .S $P(NODE,"^",20)=STATUS
    138         .S $P(NODE,"^",21)=$G(ACKTO("ERROR TEXT"))
    139         .S ^HLB(IEN,0)=NODE
    140         E  D
    141         .;ack is to a message that IS in a batch
    142         .S $P(^HLB(IEN,3,SUBIEN,0),"^",4)=$G(ACKTO("ACK BY"))
    143         .S $P(^HLB(IEN,3,SUBIEN,0),"^",5)=STATUS
    144         I (STATUS="ER"),'SKIP D
    145         .N APP
    146         .S APP=HLMSTATE("HDR","RECEIVING APPLICATION")
    147         .I APP="" S APP="UNKNOWN"
    148         .S ^HLB("ERRORS",APP,$$NOW^XLFDT,ACKTO("IEN"))=""
    149         .;don't count the error - the app ack was already counted as an error.
    150         .D COUNT^HLOESTAT("IN",$G(HLMSTATE("HDR","RECEIVING APPLICATION")),$G(HLMSTATE("HDR","SENDING APPLICATION")),$S(HLMSTATE("BATCH"):"BATCH",1:$G(HLMSTATE("HDR","MESSAGE TYPE"))),$G(HLMSTATE("HDR","EVENT")))
    151         Q
     1HLOF778 ;ALB/CJM-HL7 - Saving messages to file 778 ;03/15/2007
     2 ;;1.6;HEALTH LEVEL SEVEN;**126,134**;Oct 13, 1995;Build 30
     3 ;Per VHA Directive 2004-038, this routine should not be modified.
     4 ;
     5 ;
     6SAVEMSG(HLMSTATE) ;
     7 ;If a record has not yet been created in file 778, then it will be created. Will file any segments into 777 not yet stored.  For batch messages, will store the MSH segments in 778 as the individual messages are stored in 777.
     8 ;Input:
     9 ;  HLMSTATE (pass by reference) - contains information about the message
     10 ;    These subscripts must be defined:
     11 ;  ("BATCH")=1 if batch, 0 otherwise
     12 ;  ("BATCH","BTS")=BTS segment if end of batch reached
     13 ;  ("BODY")=ien file 777 if stored
     14 ;  ("DIRECTION")=<"IN" or "OUT">
     15 ;  ("IEN")=ien,file 778 if stored
     16 ;  ("UNSTORED LINES") - count of lines to be stored.  The lines are at the a lower subscript level <msg>,<segment>,<line>=<line to be stored>
     17 ;  ("UNSTORED MSH") For batch messages, set to 1 if there are MSH in cache. Cached MSH at ("UNSTORED MSH",<subfile ien>,<1 & 2>)
     18 ;
     19 ;Output:
     20 ;  Function - returns the ien of the msg (file 778)
     21 ;  HLMSTATE
     22 ;   ("BODY") - set to ien, file 777 if newly created
     23 ;   ("IEN") - set to ien, file 778 if newly created
     24 ;   ("UNSTORED LINES")-set to 0 as this function will store them
     25 ;   ("UNSTORED MSH")- set to 0 as this function will store it
     26 ;
     27 ;
     28 I '$D(HLMSTATE("DT/TM")) S HLMSTATE("DT/TM")=$S(HLMSTATE("DIRECTION")="IN":$$NOW^XLFDT,1:"")
     29 ;
     30 ;insure that 777 entry created & all segments stored
     31 I ('HLMSTATE("BODY"))!($G(HLMSTATE("UNSTORED LINES")))!($L($G(HLMSTATE("BATCH","BTS")))),'$$SAVEMSG^HLOF777(.HLMSTATE) Q 0
     32 ;
     33 ;insure 778 entry created
     34 I 'HLMSTATE("IEN") Q:'$$NEW^HLOF778A(.HLMSTATE) 0
     35 ;
     36 ;for batch messages, store MSH segments in 778
     37 I HLMSTATE("BATCH") D
     38 .N IEN S IEN=HLMSTATE("IEN")
     39 .;
     40 .;incoming messages cache the MSH segments in memory
     41 .I HLMSTATE("DIRECTION")="IN",HLMSTATE("UNSTORED MSH") D
     42 ..N ORDER S ORDER=0
     43 ..F  S ORDER=$O(HLMSTATE("UNSTORED MSH",ORDER)) Q:'ORDER  D
     44 ...N FS,MSGID
     45 ...S FS=$E(HLMSTATE("UNSTORED MSH",ORDER,1),4)
     46 ...S MSGID=$P(HLMSTATE("UNSTORED MSH",ORDER,2),FS,5)
     47 ...S ^HLB(IEN,3,ORDER,0)=ORDER_"^"_MSGID_"^"_$G(HLMSTATE("BATCH","ACK TO",ORDER))
     48 ...S ^HLB(IEN,3,ORDER,1)=HLMSTATE("UNSTORED MSH",ORDER,1)
     49 ...S ^HLB(IEN,3,ORDER,2)=HLMSTATE("UNSTORED MSH",ORDER,2)
     50 ...S ^HLB(IEN,3,"B",ORDER,ORDER)=""
     51 ...I MSGID]"" S ^HLB("AE",MSGID,IEN_"^"_ORDER)="" ;whole file index for individual message id
     52 ..K HLMSTATE("UNSTORED MSH") S HLMSTATE("UNSTORED MSH")=0
     53 .;
     54 .;
     55 .I HLMSTATE("DIRECTION")="OUT" D
     56 ..;must build the MSH segments!
     57 ..N HDR,FS,MSG,CS
     58 ..S FS=HLMSTATE("HDR","FIELD SEPARATOR")
     59 ..S CS=$E(HLMSTATE("HDR","ENCODING CHARACTERS"),1)
     60 ..S HLMSTATE("HDR","MESSAGE TYPE")="   "
     61 ..S HLMSTATE("HDR","EVENT")="   "
     62 ..D BUILDHDR^HLOPBLD1(.HLMSTATE,"MSH",.HDR)
     63 ..S HLMSTATE("BATCH","CURRENT MESSAGE")=$O(^HLB(HLMSTATE("IEN"),3,"B",";"),-1)
     64 ..F  Q:'$$NEXTMSG(.HLMSTATE,.MSG)  D
     65 ...N MSGID,CUR
     66 ...S CUR=HLMSTATE("BATCH","CURRENT MESSAGE")
     67 ...S MSGID=HLMSTATE("HDR","BATCH CONTROL ID")_"-"_CUR
     68 ...S $P(HDR(2),FS,4)=MSG("MESSAGE TYPE")_CS_MSG("EVENT")
     69 ...S $P(HDR(2),FS,5)=MSGID
     70 ...S ^HLB(IEN,3,CUR,0)=CUR_"^"_MSGID_"^"_$G(HLMSTATE("BATCH","ACK TO",CUR))
     71 ...S ^HLB(IEN,3,CUR,1)=HDR(1)
     72 ...S ^HLB(IEN,3,CUR,2)=HDR(2)
     73 ...S ^HLB(IEN,3,"B",CUR,CUR)=""
     74 ...S ^HLB("AE",MSGID,IEN_"^"_CUR)="" ;whole file index for individual message id
     75 ..;
     76 .;if the messages are application acks, then update the original message
     77 .N SUBIEN S SUBIEN=0
     78 .F  S SUBIEN=$O(HLMSTATE("BATCH","ACK TO",SUBIEN)) Q:'SUBIEN  I $G(HLMSTATE("BATCH","ACK TO",SUBIEN,"IEN"))]"" D
     79 ..N ACKTO
     80 ..M ACKTO=HLMSTATE("BATCH","ACK TO",SUBIEN)
     81 ..;
     82 ..;for outgoing msgs, we just created the msgid, for incoming msgs we already had it
     83 ..S:HLMSTATE("DIRECTION")="OUT" ACKTO("ACK BY")=HLMSTATE("HDR","BATCH CONTROL ID")_"-"_SUBIEN
     84 ..;
     85 ..D ACKTO(.HLMSTATE,.ACKTO)
     86 .K HLMSTATE("BATCH","ACK TO")
     87 ;
     88 ;if the msg is an app ack, update the original if not done already
     89 I $G(HLMSTATE("ACK TO","IEN"))]"",'$G(HLMSTATE("ACK TO","DONE")) D
     90 .N ACKTO
     91 .M ACKTO=HLMSTATE("ACK TO")
     92 .S ACKTO("ACK BY")=$S(HLMSTATE("BATCH"):HLMSTATE("HDR","BATCH CONTROL ID"),1:HLMSTATE("HDR","MESSAGE CONTROL ID"))
     93 .D ACKTO(.HLMSTATE,.ACKTO)
     94 .S HLMSTATE("ACK TO","DONE")=1 ;so the update isn't done again
     95 ;
     96 Q HLMSTATE("IEN")
     97 ;
     98NEXTMSG(HLMSTATE,MSG) ;
     99 ;Traverses file 777 to return the next message in the batch - as
     100 ;indicated by HLMSTATE("BATCH","CURRENT MESSAGE")  Set to 0 to start,
     101 ;returns 0 when there are no more messages
     102 ;
     103 ;Input:  HLMSTATE (pass by reference,required)
     104 ;Output:
     105 ;  HLMSTATE
     106 ;     ("BATCH","CURRENT MESSAGE")
     107 ;  MSG -pass by reference:
     108 ;     ("EVENT")
     109 ;     ("MESSAGE TYPE")
     110 ;
     111 ;
     112 N SUBIEN,NODE
     113 K MSG
     114 Q:'$G(HLMSTATE("BODY")) 0
     115 S SUBIEN=$O(^HLA(HLMSTATE("BODY"),2,HLMSTATE("BATCH","CURRENT MESSAGE")))
     116 Q:'SUBIEN 0
     117 S NODE=$G(^HLA(HLMSTATE("BODY"),2,SUBIEN,0))
     118 S MSG("MESSAGE TYPE")=$P(NODE,"^",2)
     119 S MSG("EVENT")=$P(NODE,"^",3)
     120 S HLMSTATE("BATCH","CURRENT MESSAGE")=SUBIEN
     121 Q SUBIEN
     122 ;
     123ACKTO(HLMSTATE,ACKTO) ;if this is an application ack, update the original message - but do not overlay if already valued
     124 ;ACKTO = (msgid of msg being ack'd)
     125 ;        uses these subscripts ("IEN"=ien^subien),("ACK BY"=msgid of acking msg),("STATUS"=status for the initial msg determined by the ack)
     126 ;
     127 N STATUS,IEN,SUBIEN,NODE,SKIP
     128 S SKIP=0
     129 S STATUS=$G(ACKTO("STATUS"))
     130 S IEN=+ACKTO("IEN"),SUBIEN=$P(ACKTO("IEN"),"^",2)
     131 S NODE=$G(^HLB(IEN,0))
     132 I 'SUBIEN D
     133 .;ack is to a message NOT in a batch
     134 .I $P(NODE,"^",7)'="",$P(NODE,"^",7)'=ACKTO("ACK BY") S SKIP=1 Q
     135 .I STATUS="" S STATUS="SU"
     136 .S $P(NODE,"^",7)=ACKTO("ACK BY")
     137 .S $P(NODE,"^",20)=STATUS
     138 .S $P(NODE,"^",21)=$G(ACKTO("ERROR TEXT"))
     139 .S ^HLB(IEN,0)=NODE
     140 E  D
     141 .;ack is to a message that IS in a batch
     142 .S $P(^HLB(IEN,3,SUBIEN,0),"^",4)=$G(ACKTO("ACK BY"))
     143 .S $P(^HLB(IEN,3,SUBIEN,0),"^",5)=STATUS
     144 I (STATUS="AE"),'SKIP D
     145 .N APP
     146 .S APP=HLMSTATE("HDR","SENDING APPLICATION")
     147 .I APP="" S APP="UNKNOWN"
     148 .S ^HLB("ERRORS","AE",APP,$$NOW^XLFDT,ACKTO("IEN"))=""
     149 .;don't count the error - the app ack was already counted as an error.
     150 .D COUNT^HLOESTAT("IN",$G(HLMSTATE("HDR","RECEIVING APPLICATION")),$G(HLMSTATE("HDR","SENDING APPLICATION")),$S(HLMSTATE("BATCH"):"BATCH",1:$G(HLMSTATE("HDR","MESSAGE TYPE"))),$G(HLMSTATE("HDR","EVENT")))
     151 Q
Note: See TracChangeset for help on using the changeset viewer.