[613] | 1 | GECSSTTM ;WISC/RFJ-stacker file transmission (multi docs in a msg) ;08 Dec 93
|
---|
| 2 | ;;2.0;GCS;**4,5**;MAR 14, 1995
|
---|
| 3 | Q
|
---|
| 4 | ;
|
---|
| 5 | ;
|
---|
| 6 | TRANSALL ; transmit code sheets waiting for clock in stack file
|
---|
| 7 | ; check for another job transmitting stack code sheets
|
---|
| 8 | N DA,GECSFQUE
|
---|
| 9 | L +^GECS(2100.1,"ATRANSMIT"):10 I '$T Q
|
---|
| 10 | S GECSFQUE=1
|
---|
| 11 | K ^TMP($J,"GECSSTTR")
|
---|
| 12 | S DA=0 F S DA=$O(^GECS(2100.1,"AS","Q",DA)) Q:'DA D BUILD(DA)
|
---|
| 13 | D TRANSMIT^GECSSTTT
|
---|
| 14 | K ^TMP($J,"GECSSTTR")
|
---|
| 15 | L -^GECS(2100.1,"ATRANSMIT")
|
---|
| 16 | S ZTREQ="@"
|
---|
| 17 | Q
|
---|
| 18 | ;
|
---|
| 19 | ;
|
---|
| 20 | BUILD(DA) ; build tmp global for stack entry da
|
---|
| 21 | ; $g(gecsfaut)=1 for immediate transmissions
|
---|
| 22 | I '$D(^GECS(2100.1,DA,0)) Q
|
---|
| 23 | L +^GECS(2100.1,DA):10 I '$T Q
|
---|
| 24 | ;
|
---|
| 25 | N %,BATCHDA,CHECKSUM,DA1,DATA,ENDOFCS,ENDOFMSG,FINDHOLD,GECSFLAG,GECSLPC,HOLDDATE,LINE,SEGMENT,SEQSIZE,SEQUENCE,STACSIZE,X,Y
|
---|
| 26 | ;
|
---|
| 27 | I $E($G(^GECS(2100.1,DA,10,1,0)),1,3)'="CTL" D SETSTAT^GECSSTAA(DA,"E"),ERROR^GECSSTTR(DA,"Control segment/first line of code sheet missing") L -^GECS(2100.1,DA) Q
|
---|
| 28 | ;
|
---|
| 29 | S SEGMENT=$P(^GECS(2100.1,DA,0),"^",5)
|
---|
| 30 | I SEGMENT="" D SETSTAT^GECSSTAA(DA,"E"),ERROR^GECSSTTR(DA,"Segment not defined for entry") L -^GECS(2100.1,DA) Q
|
---|
| 31 | S (ENDOFCS,ENDOFMSG)=""
|
---|
| 32 | I $P(SEGMENT,":",2)="FMS" S ENDOFCS="{",ENDOFMSG="}"
|
---|
| 33 | ;
|
---|
| 34 | S BATCHDA=+$P($G(^GECS(2101.2,+$O(^GECS(2101.2,"B",SEGMENT,0)),0)),"^",4)
|
---|
| 35 | I 'BATCHDA D SETSTAT^GECSSTAA(DA,"E"),ERROR^GECSSTTR(DA,"Batch type in file 2101.2 is incorrect") L -^GECS(2100.1,DA) Q
|
---|
| 36 | ;
|
---|
| 37 | S GECSLPC=$G(^%ZOSF("LPC")) I GECSLPC="" S GECSLPC="S Y="""""
|
---|
| 38 | ; for automatically created docs, check checksum and hold date
|
---|
| 39 | I $P($G(^GECS(2100.1,DA,0)),"^",6)="A" D I $G(GECSFLAG) L -^GECS(2100.1,DA) Q
|
---|
| 40 | . ; check hold date greater than today
|
---|
| 41 | . S HOLDDATE=$P($G(^GECS(2100.1,DA,11)),"^",3)
|
---|
| 42 | . ; for immediate transmissions, queue code sheet
|
---|
| 43 | . I HOLDDATE>DT D:$G(GECSFAUT) SETSTAT^GECSSTAA(DA,"Q") S GECSFLAG=1 Q
|
---|
| 44 | . ; compute checksum and find hold date if not defined
|
---|
| 45 | . S CHECKSUM=""
|
---|
| 46 | . S DA1=0 F S DA1=$O(^GECS(2100.1,DA,10,DA1)) Q:'DA1 S DATA=$G(^(DA1,0)) D Q:$G(GECSFLAG)
|
---|
| 47 | . . I 'HOLDDATE I $E($P(DATA,"^"),3)=2!($P(DATA,"^")="AT1") S FINDHOLD=$$HOLDDATE^GECSSTTR(DATA) I FINDHOLD S $P(^GECS(2100.1,DA,11),"^",3)=FINDHOLD,GECSFLAG=1 Q
|
---|
| 48 | . . S X=CHECKSUM_DATA X GECSLPC S CHECKSUM=Y
|
---|
| 49 | . ; for immediate transmissions, queue code sheet
|
---|
| 50 | . I $G(GECSFLAG) D:$G(GECSFAUT) SETSTAT^GECSSTAA(DA,"Q") Q
|
---|
| 51 | . ; compare checksums
|
---|
| 52 | . S X=$P($G(^GECS(2100.1,DA,11)),"^",2) I X="" Q
|
---|
| 53 | . I X'=CHECKSUM D SETSTAT^GECSSTAA(DA,"E"),ERROR^GECSSTTR(DA,"Code sheet has been altered since creation") S GECSFLAG=1
|
---|
| 54 | ;
|
---|
| 55 | ; change transmission date on ctl segment
|
---|
| 56 | S ^GECS(2100.1,DA,10,1,0)=$$CTLDATE^GECSSTTR(^GECS(2100.1,DA,10,1,0))
|
---|
| 57 | ;
|
---|
| 58 | ; fit code sheet in a sequence number if possible
|
---|
| 59 | S STACSIZE=$P($G(^GECS(2100.1,DA,11)),"^")
|
---|
| 60 | I STACSIZE>30000 D MULTIPLE L -^GECS(2100.1,DA) Q
|
---|
| 61 | S SEQUENCE=0 F S SEQUENCE=$O(^TMP($J,"GECSSTTR","SIZE",SEQUENCE)) Q:'SEQUENCE S SEQSIZE=^(SEQUENCE) I ($P(SEQSIZE,"^")+STACSIZE)<30000,^TMP($J,"GECSSTTR","BATCH",SEQUENCE)=BATCHDA Q
|
---|
| 62 | ; create a new sequence
|
---|
| 63 | I 'SEQUENCE D SEQUENCE S SEQSIZE="0^0"
|
---|
| 64 | ;
|
---|
| 65 | ; recompute checksum with new transmission date and time on ctl segment
|
---|
| 66 | S LINE=$P(SEQSIZE,"^",2),CHECKSUM=""
|
---|
| 67 | S DA1=0 F S DA1=$O(^GECS(2100.1,DA,10,DA1)) Q:'DA1 S DATA=$G(^(DA1,0)) I DATA'="" D
|
---|
| 68 | . S LINE=LINE+1,^TMP($J,"GECSSTTR","CS",SEQUENCE,LINE,0)=DATA
|
---|
| 69 | . S X=CHECKSUM_DATA X GECSLPC S CHECKSUM=Y
|
---|
| 70 | . ; check for last code sheet in stack entry
|
---|
| 71 | . I '$O(^GECS(2100.1,DA,10,DA1)),$L($G(ENDOFCS)) D Q
|
---|
| 72 | . . I DATA'[ENDOFCS S DATA=DATA_ENDOFCS
|
---|
| 73 | . . S ^TMP($J,"GECSSTTR","CS",SEQUENCE,LINE,0)=DATA
|
---|
| 74 | ;
|
---|
| 75 | ; store new checksum
|
---|
| 76 | S $P(^GECS(2100.1,DA,11),"^",2)=CHECKSUM
|
---|
| 77 | ;
|
---|
| 78 | D ENDSEQ($P(SEQSIZE,"^")+STACSIZE,LINE)
|
---|
| 79 | L -^GECS(2100.1,DA)
|
---|
| 80 | Q
|
---|
| 81 | ;
|
---|
| 82 | ;
|
---|
| 83 | MULTIPLE ; code sheet is larger than 30k, create multiple msgs
|
---|
| 84 | D SEQUENCE
|
---|
| 85 | N %,COUNT,SIZE,STRTSEQ,MAILMSGS
|
---|
| 86 | S STRTSEQ=SEQUENCE
|
---|
| 87 | S MAILMSGS=1,(LINE,SIZE)=0,CHECKSUM=""
|
---|
| 88 | S DA1=0 F S DA1=$O(^GECS(2100.1,DA,10,DA1)) Q:'DA1 S DATA=$G(^(DA1,0)) I DATA'="" D
|
---|
| 89 | . S LINE=LINE+1,^TMP($J,"GECSSTTR","CS",SEQUENCE,LINE,0)=DATA
|
---|
| 90 | . S X=CHECKSUM_DATA X GECSLPC S CHECKSUM=Y
|
---|
| 91 | . ; check for last code sheet in stack entry
|
---|
| 92 | . I '$O(^GECS(2100.1,DA,10,DA1)),$L($G(ENDOFCS)) D Q
|
---|
| 93 | . . I DATA'[ENDOFCS S DATA=DATA_ENDOFCS
|
---|
| 94 | . . S ^TMP($J,"GECSSTTR","CS",SEQUENCE,LINE,0)=DATA
|
---|
| 95 | . S SIZE=SIZE+$L(DATA)
|
---|
| 96 | . I SIZE>30000 D
|
---|
| 97 | . . I $L($G(ENDOFMSG)),DATA'[ENDOFMSG S ^TMP($J,"GECSSTTR","CS",SEQUENCE,LINE,0)=DATA_ENDOFMSG
|
---|
| 98 | . . D ENDSEQ(SIZE,LINE),SEQUENCE S MAILMSGS=MAILMSGS+1,LINE=2,SIZE=0
|
---|
| 99 | ;
|
---|
| 100 | ; store new checksum
|
---|
| 101 | S $P(^GECS(2100.1,DA,11),"^",2)=CHECKSUM
|
---|
| 102 | ;
|
---|
| 103 | ; modify sequence count
|
---|
| 104 | S DATA=^GECS(2100.1,DA,10,1,0),$P(DATA,"^",13)=$E("000",$L(MAILMSGS)+1,3)_MAILMSGS
|
---|
| 105 | S COUNT=1 F %=STRTSEQ:1 Q:'$D(^TMP($J,"GECSSTTR","CS",%)) S $P(DATA,"^",12)=$E("000",$L(COUNT)+1,3)_COUNT,^TMP($J,"GECSSTTR","CS",%,1,0)=DATA,COUNT=COUNT+1
|
---|
| 106 | ;
|
---|
| 107 | ; send size=30001 to prevent other code sheets from being added
|
---|
| 108 | D ENDSEQ(30001,LINE)
|
---|
| 109 | Q
|
---|
| 110 | ;
|
---|
| 111 | ;
|
---|
| 112 | ENDSEQ(SIZE,LINE) ; set end sequence control in tmp
|
---|
| 113 | ; size=size of code sheet; line=last line of sequence
|
---|
| 114 | N %
|
---|
| 115 | S ^TMP($J,"GECSSTTR","SIZE",SEQUENCE)=SIZE_"^"_LINE
|
---|
| 116 | S ^TMP($J,"GECSSTTR","LIST",SEQUENCE,DA)=""
|
---|
| 117 | S ^TMP($J,"GECSSTTR","BATCH",SEQUENCE)=BATCHDA
|
---|
| 118 | S %=$G(^TMP($J,"GECSSTTR","SEGS",SEQUENCE)) I %[$P(SEGMENT,":") Q
|
---|
| 119 | S ^TMP($J,"GECSSTTR","SEGS",SEQUENCE)=%_$S(%="":"",1:",")_$P(SEGMENT,":")
|
---|
| 120 | Q
|
---|
| 121 | ;
|
---|
| 122 | ;
|
---|
| 123 | SEQUENCE ; return next sequence number
|
---|
| 124 | S SEQUENCE=$G(^TMP($J,"GECSSTTR","SEQ"))+1,^TMP($J,"GECSSTTR","SEQ")=SEQUENCE
|
---|
| 125 | Q
|
---|