1 | HLOF777 ;ALB/CJM-HL7 - API'S for saving data to file 777 ;02/04/2004
|
---|
2 | ;;1.6;HEALTH LEVEL SEVEN;**126**;Oct 13, 1995
|
---|
3 | ;
|
---|
4 | SAVEMSG(HLMSTATE) ;
|
---|
5 | ;If a record has not yet been created in file 777, then it will be created. Otherwise, it just stores the segments not yet stored.
|
---|
6 | ;Input:
|
---|
7 | ; HLMSTATE (pass by reference) - contains information about the message
|
---|
8 | ; These subscripts must be defined:
|
---|
9 | ; ("BATCH")=1 if batch, 0 otherwise
|
---|
10 | ; ("BODY")=ien file 777
|
---|
11 | ; ("UNSTORED LINES") - count of lines to be stored. The lines are stored at a lower subscript <message#>,<segment#>,<line#>
|
---|
12 | ;Output:
|
---|
13 | ; HLMSTATE("UNSTORED LINES")-set to 0
|
---|
14 | ;
|
---|
15 | ;if the record has not been created yet,then create it
|
---|
16 | I 'HLMSTATE("BODY"),'$$NEW(.HLMSTATE) Q 0
|
---|
17 | ;
|
---|
18 | ;any segments to store to disk?
|
---|
19 | Q:'HLMSTATE("UNSTORED LINES") HLMSTATE("BODY")
|
---|
20 | ;
|
---|
21 | I 'HLMSTATE("BATCH") D
|
---|
22 | .N ARY,SEG,LINE
|
---|
23 | .S ARY="^HLA("_HLMSTATE("BODY")_",1)"
|
---|
24 | .S SEG=0
|
---|
25 | .F S SEG=$O(HLMSTATE("UNSTORED LINES",1,SEG)) Q:'SEG D
|
---|
26 | ..S LINE=0
|
---|
27 | ..F S LINE=$O(HLMSTATE("UNSTORED LINES",1,SEG,LINE)) Q:'LINE S @ARY@(LINE,0)=HLMSTATE("UNSTORED LINES",1,SEG,LINE)
|
---|
28 | .;
|
---|
29 | I HLMSTATE("BATCH") D
|
---|
30 | .;NOTE: will not store any segments that come before the first MSH!
|
---|
31 | .N MSG S MSG=0
|
---|
32 | .F S MSG=$O(HLMSTATE("UNSTORED LINES",MSG)) Q:'MSG D
|
---|
33 | ..N ARY,SEG,LINE
|
---|
34 | ..S ARY="^HLA("_HLMSTATE("BODY")_",2,"_MSG_")"
|
---|
35 | ..;
|
---|
36 | ..;if starting a new message, add its 0 node. The message type and event are stored in HLMSTATE("UNSTORED LINES",MSG)
|
---|
37 | ..I '$D(@ARY@(0)) D
|
---|
38 | ...S @ARY@(0)=MSG_"^"_$G(HLMSTATE("UNSTORED LINES",MSG))
|
---|
39 | ...;
|
---|
40 | ...S ^HLA(HLMSTATE("BODY"),2,"B",MSG,MSG)=""
|
---|
41 | ..;
|
---|
42 | ..S SEG=0
|
---|
43 | ..F S SEG=$O(HLMSTATE("UNSTORED LINES",MSG,SEG)) Q:'SEG D
|
---|
44 | ...S LINE=0
|
---|
45 | ...F S LINE=$O(HLMSTATE("UNSTORED LINES",MSG,SEG,LINE)) Q:'LINE S @ARY@(1,LINE,0)=HLMSTATE("UNSTORED LINES",MSG,SEG,LINE)
|
---|
46 | ;
|
---|
47 | ;clear the cache
|
---|
48 | K HLMSTATE("UNSTORED LINES")
|
---|
49 | S HLMSTATE("UNSTORED LINES")=0
|
---|
50 | ;S:HLMSTATE("BATCH") HLMSTATE("BATCH","CURRENT MESSAGE")=0
|
---|
51 | Q HLMSTATE("BODY")
|
---|
52 | ;
|
---|
53 | NEW(HLMSTATE) ;
|
---|
54 | ;This function creates a new entry in file 777.
|
---|
55 | ;Input:
|
---|
56 | ; HLMSTATE (required, pass by reference) These subscripts are expected:
|
---|
57 | ; "DIRECTION"
|
---|
58 | ; "DT/TM" (optional, $$NOW used as default)
|
---|
59 | ; "BATCH"
|
---|
60 | ; "HDR","ENCODING CHARACTERS"
|
---|
61 | ; "HDR","EVENT"
|
---|
62 | ; "HDR","FIELD SEPARATOR"
|
---|
63 | ; "HDR","MESSAGE TYPE"
|
---|
64 | ; "HDR","VERSION"
|
---|
65 | ;
|
---|
66 | ;Output - the function returns the ien of the newly created record
|
---|
67 | ;
|
---|
68 | N IEN,TIME,NODE
|
---|
69 | S IEN=$$NEWIEN(HLMSTATE("DIRECTION"),$$TCP^HLOF778A)
|
---|
70 | Q:'IEN 0
|
---|
71 | K ^HLA(IEN)
|
---|
72 | S HLMSTATE("DT/TM CREATED")=$S($G(HLMSTATE("DT/TM")):HLMSTATE("DT/TM"),1:$$NOW^XLFDT)
|
---|
73 | ;
|
---|
74 | S NODE=HLMSTATE("DT/TM CREATED")_"^"_HLMSTATE("BATCH")_"^^^"_$G(HLMSTATE("HDR","VERSION"))
|
---|
75 | I 'HLMSTATE("BATCH") S $P(NODE,"^",3)=HLMSTATE("HDR","MESSAGE TYPE"),$P(NODE,"^",4)=HLMSTATE("HDR","EVENT")
|
---|
76 | S $P(NODE,"^",20)=HLMSTATE("HDR","FIELD SEPARATOR")_HLMSTATE("HDR","ENCODING CHARACTERS")
|
---|
77 | S ^HLA(IEN,0)=NODE
|
---|
78 | ;
|
---|
79 | ;for incoming msgs, set the "B" xref later
|
---|
80 | S:HLMSTATE("DIRECTION")="OUT" ^HLA("B",HLMSTATE("DT/TM CREATED"),IEN)=""
|
---|
81 | ;
|
---|
82 | S HLMSTATE("BODY")=IEN
|
---|
83 | Q IEN
|
---|
84 | ;
|
---|
85 | NEWIEN(DIR,TCP) ;
|
---|
86 | ;This function uses a counter to get the next available ien for file 777. There are 3 different counters, each assigned a specific number range, selected via the input parameters. It does not create a record.
|
---|
87 | ;Inputs:
|
---|
88 | ; DIR = "IN" or "OUT" (required)
|
---|
89 | ; TCP = 1,0 (optional)
|
---|
90 | ;Output - the function returns the next available ien. Several counters are used:
|
---|
91 | ; <"OUT">
|
---|
92 | ; <"IN","TCP">
|
---|
93 | ; <"IN","NOT TCP">
|
---|
94 | ;
|
---|
95 | N IEN,COUNTER
|
---|
96 | S:DIR="IN" COUNTER=$NA(^HLC("FILE777",DIR,$S(+$G(TCP):"TCP",1:"NOT TCP")))
|
---|
97 | S:DIR="OUT" COUNTER=$NA(^HLC("FILE777",DIR))
|
---|
98 | AGAIN ;
|
---|
99 | S IEN=$$INC^HLOSITE(COUNTER,1)
|
---|
100 | I IEN>100000000000 D
|
---|
101 | .L +@COUNTER:200
|
---|
102 | .I $T,@COUNTER>100000000000 S @COUNTER=1,IEN=1
|
---|
103 | .L -@COUNTER
|
---|
104 | I IEN>100000000000 G AGAIN
|
---|
105 | Q (IEN+$S(DIR="OUT":0,+$G(TCP):100000000000,1:200000000000))
|
---|