| 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))
 | 
|---|