source: ccr/trunk/p/C0CBAT.m@ 440

Last change on this file since 440 was 440, checked in by George Lilly, 15 years ago

updates to Batch processing

File size: 8.9 KB
Line 
1C0CBAT ; CCDCCR/GPL - CCR Batch utilities; 4/21/09
2 ;;0.1;CCDCCR;nopatch;noreleasedate
3 ;Copyright 2009 George Lilly. Licensed under the terms of the GNU
4 ;General Public License See attached copy of the License.
5 ;
6 ;This program is free software; you can redistribute it and/or modify
7 ;it under the terms of the GNU General Public License as published by
8 ;the Free Software Foundation; either version 2 of the License, or
9 ;(at your option) any later version.
10 ;
11 ;This program is distributed in the hope that it will be useful,
12 ;but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;GNU General Public License for more details.
15 ;
16 ;You should have received a copy of the GNU General Public License along
17 ;with this program; if not, write to the Free Software Foundation, Inc.,
18 ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 ;
20 W "This is the CCR Batch Utility Library ",!
21 Q
22 ;
23STOP ; STOP A CURRENTLY RUNNING BATCH JOB
24 I '$D(^TMP("C0CBAT","RUNNING")) Q ;
25 W !,!,"HALTING CCR BATCH",!
26 S ^TMP("C0CBAT","STOP")="" ; SIGNAL JOB TO TERMINATE
27 H 10 ; WAIT TEN SECONDS FOR SIGNAL TO BE RECEIVED
28 I '$D(^TMP("C0CBAT","STOP")) D ; SIGNAL RECEIVED
29 . W "CCR BATCH JOB TERMINATING",!
30 E K ^TMP("C0CBAT","STOP") ; STOP SIGNALING
31 Q
32 ;
33START ; STARTS A TAKSMAN CCR BATCH JOB - FOR USE IN A MENU OPTION
34 ;
35 I $D(^TMP("C0CBAT","RUNNING")) D Q ; ONLY ONE ALLOWED AT A TIME
36 . W !,"CCR BATCH ALREADY RUNNING",!
37 . W !,"STOP FIRST WITH STOP^C0CBAT",!
38 N ZTRTN,ZTDESC,ZTDTH,ZTSAVE,ZTSK,ZTIO
39 S ZTRTN="EN^C0CBAT",ZTDESC="CCR Batch"
40 S ZTDTH=$H ;
41 ;S ZTDTH=$S(($P(ZTDTH,",",2)+10)\86400:(1+ZTDTH)_","_((($P(ZTDTH,",",2)+10)#86400)/100000),1:(+ZTDTH)_","_($P(ZTDTH,",",2)+10))
42 S ZTSAVE("C0C")="",ZTSAVE("C0C*")=""
43 S ZTIO="NULL" ;
44 W !,!,"CCR BATCH JOB STARTED",!
45 D ^%ZTLOAD
46 Q
47 ;
48EN ; BATCH ENTRY POINT
49 ; PROCESSES THE SUBSCRIPTION FILE, EXTRACTING CCR VARIABLES FOR EACH
50 ; PATIENT WITH AN ACTIVE SUBSCRIPTION, AND IF CHECKSUMS INDICATE A CHANGE,
51 ; GENERATES A NEW CCR FOR THE PATIENT
52 ; UPDATES THE E2 CCR ELEMENTS FILE
53 ;
54 S C0CQT=1 ; QUIET MODE
55 I $D(^TMP("C0CBAT","RUNNING")) Q ; ONLY ONE AT A TIME
56 S ^TMP("C0CBAT","RUNNING")="" ; RUNNING SIGNAL
57 S C0CBDT=$$NOW^XLFDT ; DATE OF THIS RUN
58 S C0CBF=177.301 ; FILE NUMBER OF C0C BATCH CONTROL FILE
59 S C0CBFR=177.3013 ; FILE NUMBER OF UPDATE SUBFILE
60 S C0CBB=$NA(^TMP("C0CBATCH",C0CBDT)) ; BATCH WORK AREA
61 I $D(@C0CBB@(0)) D ; ERROR SHOULDN'T EXIST
62 . W "WORK AREA ERROR",!
63 . B
64 S @C0CBB@(0)="V22" ; VERSION USED TO CREATE THIS WORK AREA
65 S C0CBH=$NA(@C0CBB@("HOTLIST")) ; BASE FOR HOT LIST
66 S C0CBS=$NA(^C0CS("B")) ; SUBSCRIPTION LIST BASE
67 ;I $D(^C0CB("B",C0CDT)) D ; BATCH RECORD EXISTS
68 ;. H 10 ; HANG 10 SECONDS
69 ;. S C0CBDT=$$NOW^XLFDT ; NEW DATE FOR THIS RUN
70 ;. I $D(^C0CB("B",C0CDT)) B ;DIDN'T WORK
71 D BLDHOT(C0CBH) ; BUILD THE HOT LIST
72 S C0CHN=$$COUNT(C0CBH) ;COUNT NUMBER IN HOT LIST
73 S C0CSN=$$COUNT(C0CBS) ;COUNT NUMBER OF PATIENTS WITH SUBSCRIPTIONS
74 S C0CFDA(C0CBF,"+1,",.01)=C0CBDT ; DATE KEY OF BATCH CONTROL
75 S C0CFDA(C0CBF,"+1,",.02)=C0CBDT ; BATCH ID IS DATE IN STRING FORM
76 S C0CFDA(C0CBF,"+1,",1)=C0CSN ; TOTAL SUBSCRIPTIONS
77 S C0CFDA(C0CBF,"+1,",2)=C0CHN ; TOTAL HOT LIST
78 D UPDIE ; CREATE THE BATCH RECORD
79 S C0CIEN=$O(^C0CB("B",C0CBDT,""))
80 S (C0CN,C0CNH)=0 ; COUNTERS FOR TOTAL AND HOT LIST
81 S C0CBCUR="" ; CURRENT PATIENT
82 S C0CSTOP=0 ; STOP FLAG FOR HALTING BATCH SET ^TMP("C0CBAT","STOP")=""
83 ;F S C0CBCUR=$O(@C0CBH@(C0CBCUR),-1) Q:C0CBCUR="" D ; HOT LIST LATEST FIRST
84 F S C0CBCUR=$O(@C0CBH@(C0CBCUR)) Q:(C0CSTOP)!(C0CBCUR="") D ; HOT LIST FIRST
85 . D ANALYZE^C0CRIMA(C0CBCUR,1,"LABLIMIT:T-760^VITLIMIT:T-760")
86 . I $G(C0CCHK) D ;
87 . . D PUTRIM^C0CFM2(C0CBCUR)
88 . . D XPAT^C0CCCR(C0CBCUR) ; IF VARIABLES HAVE CHANGED GENERATE CCR
89 . . K C0CFDA
90 . . S C0CFDA(C0CBFR,"+1,"_C0CIEN_",",.01)=C0CBCUR
91 . . S C0CFDA(C0CBFR,"+1,"_C0CIEN_",",1)="Y"
92 . . S C0CFDA(C0CBFR,"+1,"_C0CIEN_",",2)=$G(^TMP("C0CCCR","FNAME",C0CBCUR))
93 . . D UPDIE ; CREATE UPDATE SUBFILE
94 . S C0CN=C0CN+1 ; INCREMENT NUMBER IN TOTAL
95 . S C0CNH=C0CNH+1 ; INCREMENT HOT LIST TOTAL
96 . S C0CFDA(C0CBF,C0CIEN_",",1.1)=C0CN ;UPDATE TOTAL PROGRESS
97 . S C0CFDA(C0CBF,C0CIEN_",",2.1)=C0CNH ; UPDATE HOT LIST PROGRESS
98 . S C0CNOW=$$NOW^XLFDT
99 . S C0CFDA(C0CBF,C0CIEN_",",4)=C0CNOW ; LAST UPDATED FIELD
100 . S C0CELPS=$$FMDIFF^XLFDT(C0CNOW,C0CBDT,2) ; DIFFERENCE IN SECONDS
101 . S C0CAVG=C0CELPS/C0CN ; AVERAGE ELAPSED TIME
102 . S C0CFDA(C0CBF,C0CIEN_",",4.1)=C0CAVG ; AVERAGE ELAPSED TIME
103 . S C0CETOT=C0CAVG*C0CSN ; EST TOT ELASPSED TIME
104 . S C0CEST=$$FMADD^XLFDT(C0CBDT,0,0,0,C0CETOT) ; ADD SECONDS TO BATCH START
105 . S C0CFDA(C0CBF,C0CIEN_",",4.2)=C0CEST ;ESTIMATED COMPLETION TIME
106 . D UPDIE ;
107 . I $D(^TMP("C0CBAT","STOP")) D ; IF STOP SIGNAL DETECTED
108 . . S C0CSTOP=1
109 . . K ^TMP("C0CBAT","STOP") ; SIGNAL RECEIVED
110 . H 1 ; GIVE OTHERS A CHANCE
111 F S C0CBCUR=$O(@C0CBS@(C0CBCUR)) Q:(C0CSTOP)!(C0CBCUR="") D ; SUBS LIST
112 . I $D(@C0CBH@(C0CBCUR)) Q ; SKIP IF IN HOT LIST - ALREADY DONE
113 . D ANALYZE^C0CRIMA(C0CBCUR,1,"LABLIMIT:T-760^VITLIMIT:T-760")
114 . I $G(C0CCHK) D ;
115 . . D PUTRIM^C0CFM2(C0CBCUR)
116 . . D XPAT^C0CCCR(C0CBCUR) ; IF VARIABLES HAVE CHANGED GENERATE CCR
117 . . K C0CFDA
118 . . S C0CFDA(C0CBFR,"+1,"_C0CIEN_",",.01)=C0CBCUR
119 . . S C0CFDA(C0CBFR,"+1,"_C0CIEN_",",1)="Y"
120 . . S C0CFDA(C0CBFR,"+1,"_C0CIEN_",",2)=$G(^TMP("C0CCCR","FNAME",C0CBCUR))
121 . . D UPDIE ; CREATE UPDATE SUBFILE
122 . S C0CN=C0CN+1 ; INCREMENT NUMBER IN TOTAL
123 . S C0CFDA(C0CBF,C0CIEN_",",1.1)=C0CN ;UPDATE TOTAL PROGRESS
124 . S C0CNOW=$$NOW^XLFDT
125 . S C0CFDA(C0CBF,C0CIEN_",",4)=C0CNOW ; LAST UPDATED FIELD
126 . S C0CELPS=$$FMDIFF^XLFDT(C0CNOW,C0CBDT,2) ; DIFFERENCE IN SECONDS
127 . S C0CAVG=C0CELPS/C0CN ; AVERAGE ELAPSED TIME
128 . S C0CFDA(C0CBF,C0CIEN_",",4.1)=C0CAVG ; AVERAGE ELAPSED TIME
129 . S C0CETOT=C0CAVG*C0CSN ; EST TOT ELASPSED TIME
130 . S C0CEST=$$FMADD^XLFDT(C0CBDT,0,0,0,C0CETOT) ; ADD SECONDS TO BATCH START
131 . S C0CFDA(C0CBF,C0CIEN_",",4.2)=C0CEST ;ESTIMATED COMPLETION TIME
132 . D UPDIE ;
133 . I $D(^TMP("C0CBAT","STOP")) D ; IF STOP SIGNAL DETECTED
134 . . S C0CSTOP=1
135 . . K ^TMP("C0CBAT","STOP") ; SIGNAL RECEIVED
136 . H 1 ; GIVE IT A BREAK
137 K ^TMP("C0CBAT","RUNNING")
138 Q
139 ;
140BLDHOT(ZHB) ; BUILD HOT LIST AT GLOBAL ZHB, PASSED BY NAME
141 ; SEARCHS FOR PATIENTS IN THE "AC" INDEX OF THE ORDER FILE
142 N ZDFN
143 S ZDFN=""
144 F S ZDFN=$O(^OR(100,"AC",ZDFN)) Q:ZDFN="" D ; ALL PATIENTS IN THE AC INDX
145 . S ZZDFN=$P(ZDFN,";",1) ; FORMAT IS "N;DPT("
146 . I '$D(@C0CBS@(ZZDFN)) Q ; SKIP IF NOT IN SUBSCRIPTION LIST
147 . S @ZHB@(ZZDFN)="" ;ADD PATIENT TO THE HOT LIST
148 Q
149 ;
150COUNT(ZB) ; EXTRINSIC THAT RETURNS THE NUMBER OF ARRAY ELEMENTS
151 N ZI,ZN
152 S ZN=0
153 S ZI=""
154 F S ZI=$O(@ZB@(ZI)) Q:ZI="" D ;
155 . S ZN=ZN+1
156 Q ZN
157 ;
158UPDIEVARPTR(ZVAR,ZTYP) ;EXTRINSIC WHICH RETURNS THE POINTER TO ZVAR IN THE
159 ; CCR DICTIONARY. IT IS LAYGO, AS IT WILL ADD THE VARIABLE TO
160 ; THE CCR DICTIONARY IF IT IS NOT THERE. ZTYP IS REQUIRED FOR LAYGO
161 ;
162 N ZCCRD,ZVARN,C0CFDA2
163 S ZCCRD=170 ; FILE NUMBER FOR CCR DICTIONARY
164 S ZVARN=$O(^C0CDIC(170,"B",ZVAR,"")) ;FIND IEN OF VARIABLE
165 I ZVARN="" D ; VARIABLE NOT IN CCR DICTIONARY - ADD IT
166 . I '$D(ZTYP) D Q ; WON'T ADD A VARIABLE WITHOUT A TYPE
167 . . W "CANNOT ADD VARIABLE WITHOUT A TYPE: ",ZVAR,!
168 . S C0CFDA2(ZCCRD,"?+1,",.01)=ZVAR ; NAME OF NEW VARIABLE
169 . S C0CFDA2(ZCCRD,"?+1,",12)=ZTYP ; TYPE EXTERNAL OF NEW VARIABLE
170 . D CLEAN^DILF ;MAKE SURE ERRORS ARE CLEAN
171 . D UPDATE^DIE("E","C0CFDA2","","ZERR") ;ADD VAR TO CCR DICTIONARY
172 . I $D(ZERR) D ; LAYGO ERROR
173 . . W "ERROR ADDING "_ZC0CI_" TO CCR DICTIONARY",!
174 . E D ;
175 . . D CLEAN^DILF ; CLEAN UP
176 . . S ZVARN=$O(^C0CDIC(170,"B",ZVAR,"")) ;FIND IEN OF VARIABLE
177 . . W "ADDED ",ZVAR," TO CCR DICTIONARY, IEN:",ZVARN,!
178 Q ZVARN
179 ;
180UPDIE ; INTERNAL ROUTINE TO CALL UPDATE^DIE AND CHECK FOR ERRORS
181 K ZERR
182 D CLEAN^DILF
183 D UPDATE^DIE("","C0CFDA","","ZERR")
184 I $D(ZERR) D ;
185 . W "ERROR",!
186 . ZWR ZERR
187 . B
188 K C0CFDA
189 Q
190 ;
191SETFDA(C0CSN,C0CSV) ; INTERNAL ROUTINE TO MAKE AN FDA ENTRY FOR FIELD C0CSN
192 ; TO SET TO VALUE C0CSV.
193 ; C0CFDA,C0CC,C0CZX ARE ASSUMED FROM THE CALLING ROUTINE
194 ; C0CSN,C0CSV ARE PASSED BY VALUE
195 ;
196 N C0CSI,C0CSJ
197 S C0CSI=$$ZFILE(C0CSN,"C0CC") ; FILE NUMBER
198 S C0CSJ=$$ZFIELD(C0CSN,"C0CC") ; FIELD NUMBER
199 S C0CFDA(C0CSI,C0CZX_",",C0CSJ)=C0CSV
200 Q
201ZFILE(ZFN,ZTAB) ; EXTRINSIC TO RETURN FILE NUMBER FOR FIELD NAME PASSED
202 ; BY VALUE IN ZFN. FILE NUMBER IS PIECE 1 OF C0CA(ZFN)
203 ; IF ZTAB IS NULL, IT DEFAULTS TO C0CA
204 I '$D(ZTAB) S ZTAB="C0CA"
205 N ZR
206 I $D(@ZTAB@(ZFN)) S ZR=$P(@ZTAB@(ZFN),"^",1)
207 E S ZR=""
208 Q ZR
209ZFIELD(ZFN,ZTAB) ;EXTRINSIC TO RETURN FIELD NUMBER FOR FIELD NAME PASSED
210 ; BY VALUE IN ZFN. FILE NUMBER IS PIECE 2 OF C0CA(ZFN)
211 ; IF ZTAB IS NULL, IT DEFAULTS TO C0CA
212 I '$D(ZTAB) S ZTAB="C0CA"
213 N ZR
214 I $D(@ZTAB@(ZFN)) S ZR=$P(@ZTAB@(ZFN),"^",2)
215 E S ZR=""
216 Q ZR
217 ;
218ZVALUE(ZFN,ZTAB) ;EXTRINSIC TO RETURN VALUE FOR FIELD NAME PASSED
219 ; BY VALUE IN ZFN. FILE NUMBER IS PIECE 3 OF C0CA(ZFN)
220 ; IF ZTAB IS NULL, IT DEFAULTS TO C0CA
221 I '$D(ZTAB) S ZTAB="C0CA"
222 N ZR
223 I $D(@ZTAB@(ZFN)) S ZR=$P(@ZTAB@(ZFN),"^",3)
224 E S ZR=""
225 Q ZR
226 ;
Note: See TracBrowser for help on using the repository browser.