[613] | 1 | ECXUTLA ;ALB/JAP - Utilities for Audit Reports ;Sep 25, 1997
|
---|
| 2 | ;;3.0;DSS EXTRACTS;**8,14**;Dec 22, 1997
|
---|
| 3 | ;
|
---|
| 4 | AUDIT(ECXHEAD,ECXERR,ECXARRAY,ECXAUD) ;set audit report parameters
|
---|
| 5 | ; input
|
---|
| 6 | ; ECXHEAD = extract HEADER CODE (required)
|
---|
| 7 | ; (from file #727.1, field #7)
|
---|
| 8 | ; ECXERR = passed-by-reference variable (required)
|
---|
| 9 | ; ECXARRAY = passed-by-reference array (required)
|
---|
| 10 | ; ECXAUD = 0/1 (optional)
|
---|
| 11 | ; 0 --> extract audit (default)
|
---|
| 12 | ; 1 --> SAS audit
|
---|
| 13 | ; output
|
---|
| 14 | ; ECXARRAY = array of audit parameters
|
---|
| 15 | ; ECXARRAY("DEF") = ien of extract type in file #727.1
|
---|
| 16 | ; ECXARRAY("TYPE") = print name for extract; field #7 in file #727.1
|
---|
| 17 | ; ECXARRAY("EXTRACT") = ien of extract in file #727
|
---|
| 18 | ; ECXARRAY("START") = start date for extract audit
|
---|
| 19 | ; ECXARRAY("END") = end date for extract audit
|
---|
| 20 | ; ECXARRAY("ERUN") = date on which extract was generated
|
---|
| 21 | ; ECXARRAY("DIV") = ien of station if file #4
|
---|
| 22 | ; error CODE
|
---|
| 23 | ; ECXERR = 1, if input problem occurs
|
---|
| 24 | ; 0, otherwise
|
---|
| 25 | ;
|
---|
| 26 | N X,Y,N,DA,DIC,DIQ,DIR,DTOUT,DUOUT,DIRUT,ECXDA,ECXTYPE,ECXSTART,ECXEND,ECXARR
|
---|
| 27 | S ECXERR=0
|
---|
| 28 | S N=$O(^ECX(727.1,"C",ECXHEAD,"")) S:N="" ECXERR=1
|
---|
| 29 | Q:ECXERR
|
---|
| 30 | S DIC="^ECX(727.1,",DIC(0)="NZ",X=N
|
---|
| 31 | D ^DIC I Y=-1 S ECXERR=1 Q
|
---|
| 32 | S ECXTYPE=$P(Y(0),U,7)_U_+Y K X,Y,DIC
|
---|
| 33 | I $G(ECXAUD)=1,ECXHEAD'="DEN",ECXHEAD'="PRE",ECXHEAD'="RAD",ECXHEAD'="SUR" S ECXERR=1
|
---|
| 34 | Q:ECXERR
|
---|
| 35 | S DIC="^ECX(727,",DIC(0)="AEMQ",DIC("S")="I $P(^(0),U,3)=$P(ECXTYPE,U),'$D(^(""PURG""))"
|
---|
| 36 | D ^DIC
|
---|
| 37 | I Y=-1!($G(DUOUT))!($G(DTOUT)) S ECXERR=1 Q
|
---|
| 38 | S DIC="^ECX(727,",(DA,ECXDA)=+Y,DR=".01;1;2;3;4;5;15;300",DIQ="ECXARR",DIQ(0)="IE"
|
---|
| 39 | D EN^DIQ1
|
---|
| 40 | W !!,?5,"Extract: ",ECXARR(727,ECXDA,2,"E")," #",ECXDA
|
---|
| 41 | W !!,?5,"Start date: ",ECXARR(727,ECXDA,3,"E")
|
---|
| 42 | W !,?5,"End date: ",ECXARR(727,ECXDA,4,"E")
|
---|
| 43 | W !,?5,"# of Records: ",ECXARR(727,ECXDA,5,"E")
|
---|
| 44 | I ECXHEAD="PRO" W !,?5,"Station: ",ECXARR(727,ECXDA,15,"E")
|
---|
| 45 | ;if transmit date exists, then ask user if audit still needed
|
---|
| 46 | I $L(ECXARR(727,ECXDA,300,"E"))>0 D
|
---|
| 47 | .W !!,?5,"The extract which you have chosen to audit"
|
---|
| 48 | .W !,?5,"was transmitted to AAC/DSS on ",ECXARR(727,ECXDA,300,"E"),".",!
|
---|
| 49 | .S DIR(0)="Y",DIR("A")="Do you want to continue with this audit report",DIR("B")="NO" D ^DIR
|
---|
| 50 | .S:$G(DIRUT) ECXERR=1 S:Y=0 ECXERR=1
|
---|
| 51 | Q:ECXERR
|
---|
| 52 | ;setup the return array
|
---|
| 53 | S ECXARRAY("EXTRACT")=ECXARR(727,ECXDA,.01,"E"),ECXARRAY("DIV")=ECXARR(727,ECXDA,15,"I"),ECXARRAY("TYPE")=$P(ECXTYPE,U),ECXARRAY("DEF")=$P(ECXTYPE,U,2)
|
---|
| 54 | S ECXARRAY("START")=ECXARR(727,ECXDA,3,"E"),ECXARRAY("END")=ECXARR(727,ECXDA,4,"E"),ECXARRAY("ERUN")=ECXARR(727,ECXDA,1,"E")
|
---|
| 55 | ;determine date range only for extract audit reports
|
---|
| 56 | I $G(ECXAUD)=0 D
|
---|
| 57 | .S ECXSTART=ECXARRAY("START"),ECXEND=ECXARRAY("END") D RANGE^ECXUTLA(.ECXSTART,.ECXEND,.ECXERR)
|
---|
| 58 | .I ECXERR K ECXARRAY
|
---|
| 59 | .Q:ECXERR
|
---|
| 60 | .S ECXARRAY("START")=ECXSTART,ECXARRAY("END")=ECXEND
|
---|
| 61 | Q
|
---|
| 62 | ;
|
---|
| 63 | RANGE(ECXSTART,ECXEND,ECXERR) ;determine date range for extract audit report
|
---|
| 64 | ; input
|
---|
| 65 | ; ECXSTART = start date of extract in file #727 (required)
|
---|
| 66 | ; passed by reference
|
---|
| 67 | ; ECXEND = end date of extract in file #727 (required)
|
---|
| 68 | ; passed by reference
|
---|
| 69 | ; ECXERR = passed by reference (required)
|
---|
| 70 | ; output
|
---|
| 71 | ; ECXSTART = user selected start date
|
---|
| 72 | ; ECXEND = user selected end date
|
---|
| 73 | ; error CODE
|
---|
| 74 | ; ECXERR = 1, if input problem occurs
|
---|
| 75 | ; 0, otherwise
|
---|
| 76 | ;
|
---|
| 77 | ;
|
---|
| 78 | ;convert dates to internal format
|
---|
| 79 | N DATEA,DATEB,X,Y,%DT,DTOUT,OUT
|
---|
| 80 | S (ECXERR,OUT)=0
|
---|
| 81 | S X=ECXSTART D ^%DT S DATEA=Y
|
---|
| 82 | S X=ECXEND D ^%DT S DATEB=Y
|
---|
| 83 | ;allow user to select start date
|
---|
| 84 | ;can't be less than ecxstart or greater than ecxend
|
---|
| 85 | W !!,?5,"You can narrow the date range, if you wish.",!
|
---|
| 86 | W !,?5,"The Start Date can't be earlier than ",ECXSTART,","
|
---|
| 87 | W !,?5,"or later than ",ECXEND,".",!
|
---|
| 88 | F Q:OUT!ECXERR D
|
---|
| 89 | .S %DT="AEX",%DT("A")="Select Start Date: ",%DT("B")=ECXSTART,%DT(0)=DATEA
|
---|
| 90 | .D ^%DT S:Y=-1 ECXERR=1 S:$G(DTOUT) ECXERR=1
|
---|
| 91 | .Q:ECXERR
|
---|
| 92 | .I Y>DATEB D Q
|
---|
| 93 | ..W !,?5,"But that's later than ",ECXEND,"...try again.",!
|
---|
| 94 | .S DATEA=Y,OUT=1
|
---|
| 95 | I ECXERR K ECXSTART,ECXEND
|
---|
| 96 | Q:ECXERR
|
---|
| 97 | S Y=DATEA D DD^%DT S ECXSTART=Y
|
---|
| 98 | ;allow user to select end date
|
---|
| 99 | ;can't be less than ecxstart or greater than ecxend
|
---|
| 100 | W !!,?5,"The End Date can't be earlier than ",ECXSTART
|
---|
| 101 | W !,?5,"(the Start Date you selected), or later than ",ECXEND,".",!
|
---|
| 102 | S OUT=0
|
---|
| 103 | F Q:OUT!ECXERR D
|
---|
| 104 | .S %DT="AEX",%DT("A")="Select End Date: ",%DT("B")=ECXEND,%DT(0)=-DATEB
|
---|
| 105 | .D ^%DT S:Y=-1 ECXERR=1 S:$G(DTOUT) ECXERR=1
|
---|
| 106 | .Q:ECXERR
|
---|
| 107 | .I Y<DATEA D Q
|
---|
| 108 | ..W !,?5,"But that's earlier than ",ECXSTART,"...try again.",!
|
---|
| 109 | .S DATEB=Y,OUT=1
|
---|
| 110 | I ECXERR K ECXSTART,ECXEND
|
---|
| 111 | Q:ECXERR
|
---|
| 112 | S Y=DATEB D DD^%DT S ECXEND=Y
|
---|
| 113 | Q
|
---|
| 114 | ;
|
---|
| 115 | DEVICE(ZTRTN,ZTDESC,ZTSAVE) ;get print device and optionally task to background
|
---|
| 116 | ; input
|
---|
| 117 | ; ZTRTN = line^routine; task entry point (required)
|
---|
| 118 | ; variable for %ZTLOAD
|
---|
| 119 | ; ZTDESC = task description (required)
|
---|
| 120 | ; variable for %ZTLOAD
|
---|
| 121 | ; ZTSAVE = array; passed by reference (required)
|
---|
| 122 | ; variables for %ZTLOAD
|
---|
| 123 | ; output
|
---|
| 124 | ; ZTSAVE = returns ZTSAVE("POP"),ZTSAVE("ZTSK")
|
---|
| 125 | ;
|
---|
| 126 | N POP,ZTSK
|
---|
| 127 | S ZTSAVE("POP")=0,ZTSAVE("ZTSK")=0
|
---|
| 128 | ;return ztsave("pop")=1 and quit if required input not available
|
---|
| 129 | I '$L(ZTRTN)!('$L(ZTDESC))!('$D(ZTSAVE)) S ZTSAVE("POP")=1 Q
|
---|
| 130 | ;get print device
|
---|
| 131 | K IO("Q") S %ZIS="QM" D ^%ZIS
|
---|
| 132 | S ZTSAVE("POP")=POP
|
---|
| 133 | I POP D
|
---|
| 134 | .W !,"No device selected...exiting.",!
|
---|
| 135 | Q:POP
|
---|
| 136 | I $D(IO("Q")) D
|
---|
| 137 | .S ZTSAVE("ZTREQ")="@"
|
---|
| 138 | .D ^%ZTLOAD
|
---|
| 139 | .I $G(ZTSK)>0 D
|
---|
| 140 | ..W !,"Request queued as Task #",ZTSK,".",!
|
---|
| 141 | ..S ZTSAVE("ZTSK")=ZTSK
|
---|
| 142 | ..S ZTSAVE("POP")=0
|
---|
| 143 | .I '$G(ZTSK) D
|
---|
| 144 | ..W !,"Request to queue cancelled...exiting.",!
|
---|
| 145 | ..S ZTSAVE("ZTSK")=0
|
---|
| 146 | ..S ZTSAVE("POP")=1
|
---|
| 147 | Q
|
---|
| 148 | ;
|
---|
| 149 | WARDS(ECXALL,ECXDIV) ;get wards for selected divisions
|
---|
| 150 | ; input
|
---|
| 151 | ; ECXALL = 1/0 (optional)
|
---|
| 152 | ; 1==> user selected all divisions OR
|
---|
| 153 | ; facility is non-divisional
|
---|
| 154 | ; 0==> user selected some divisions
|
---|
| 155 | ; if ECXALL not defined, then assume 1
|
---|
| 156 | ; ECXDIV = array of divisions selected (optional)
|
---|
| 157 | ; passed by reference array containing
|
---|
| 158 | ; selected divisions;
|
---|
| 159 | ; if ECXALL=1, then ECXDIV array isn't
|
---|
| 160 | ; required; information for all wards will be obtained
|
---|
| 161 | ; if ECXALL=0, then only wards for divisions in ECXDIV
|
---|
| 162 | ; output
|
---|
| 163 | ; ^TMP($J,"ECXWARD", contains ward name, division, g&l order
|
---|
| 164 | ; ^TMP($J,"ECXORDER", contains ward grouping info
|
---|
| 165 | ;
|
---|
| 166 | N IEN,WARD,ORDX,NAME,NM,ORDER,DIV,HIEN,GROUP,DATA,DEPT,NAMEDEPT
|
---|
| 167 | K ^TMP($J,"ECXWARD"),^TMP($J,"ECXORDER")
|
---|
| 168 | ;if ecxall not here, then set ecxall=1
|
---|
| 169 | S:'$D(ECXALL) ECXALL=1 S:ECXALL="" ECXALL=1
|
---|
| 170 | S ORDX=0,NM=""
|
---|
| 171 | F S NM=$O(^DIC(42,"B",NM)) Q:NM="" S IEN=0 F S IEN=$O(^DIC(42,"B",NM,IEN)) Q:IEN="" D
|
---|
| 172 | .S DIV=+$P(^DIC(42,IEN,0),U,11) Q:DIV=0
|
---|
| 173 | .I ECXALL=0,'$D(ECXDIV(DIV)) Q
|
---|
| 174 | .S (NAME,ORDER,DEPT)="",NAME=$P(^DIC(42,IEN,0),U,1),ORDER=+$P($G(^DIC(42,IEN,"ORDER")),U,1),DEPT=$P($G(^ECX(727.4,IEN,0)),U,2)
|
---|
| 175 | .;'unordered' ward is probably inactive, but get basic data anyway
|
---|
| 176 | .I ORDER=0 S ORDX=ORDX+1,ORDER="99999"_ORDX,ORDER=+ORDER
|
---|
| 177 | .;get this ward's ien in file #44; file #727.802 & #727.808 use pointers to file #44
|
---|
| 178 | .S HIEN=+$P($G(^DIC(42,IEN,44)),U,1) Q:HIEN=0
|
---|
| 179 | .;if this is last ward in group, then get the group name
|
---|
| 180 | .K GROUP I $D(^DIC(42,IEN,1,1,0)) S GROUP=$P(^DIC(42,IEN,1,1,0),U,1) I GROUP="" K GROUP
|
---|
| 181 | .S ^TMP($J,"ECXWARD",HIEN)=ORDER_U_NAME_U_DIV_U_IEN_U_DEPT
|
---|
| 182 | .I $D(GROUP) S ^TMP($J,"ECXWARD",HIEN,1)=GROUP
|
---|
| 183 | ;after all wards in file #42 are processed, arrange by g&l order
|
---|
| 184 | S HIEN=0
|
---|
| 185 | F S HIEN=$O(^TMP($J,"ECXWARD",HIEN)) Q:HIEN="" S DATA=^TMP($J,"ECXWARD",HIEN) D
|
---|
| 186 | .S ORDER=$P(DATA,U,1),NAME=$P(DATA,U,2),DIV=$P(DATA,U,3),DEPT=$P(DATA,U,5)
|
---|
| 187 | .S NAMEDEPT=NAME S:DEPT]"" NAMEDEPT=NAME_" <"_DEPT_">"
|
---|
| 188 | .S ^TMP($J,"ECXORDER",DIV,ORDER)=HIEN_U_NAMEDEPT_U
|
---|
| 189 | .I $D(^TMP($J,"ECXWARD",HIEN,1)) S GROUP=^(1),^TMP($J,"ECXORDER",DIV,ORDER,1)=1_U_GROUP_U
|
---|
| 190 | Q
|
---|
| 191 | ;
|
---|
| 192 | SASHEAD(ECXFL,ECXHEAD,ECXDIV,ECXARRAY,ECXPG,ECXTAB) ;header and page control
|
---|
| 193 | ;
|
---|
| 194 | ; ECXFL = feeder location (division) (required)
|
---|
| 195 | ; ECXHEAD = extract header from file #727.1 (required)
|
---|
| 196 | ; ECXDIV = array of divisions selected (required)
|
---|
| 197 | ; ECXPG = page number (required)
|
---|
| 198 | ; ECXTAB = tab location;
|
---|
| 199 | ; allows for proper spacing in sub-header line (optional)
|
---|
| 200 | ;
|
---|
| 201 | N JJ,SS,LN
|
---|
| 202 | S $P(LN,"-",80)=""
|
---|
| 203 | I $G(ECXTAB)="" S ECXTAB=40
|
---|
| 204 | I $E(IOST)="C" D
|
---|
| 205 | .S SS=22-$Y F JJ=1:1:SS W !
|
---|
| 206 | .I PG>0 S DIR(0)="E" W ! D ^DIR K DIR S:'Y QFLG=1
|
---|
| 207 | Q:QFLG
|
---|
| 208 | W:$Y!($E(IOST)="C") @IOF S ECXPG=ECXPG+1
|
---|
| 209 | W !,"SAS Audit Report for "_ECXARRAY("TYPE")_" ("_ECXHEAD_") Extract"
|
---|
| 210 | W !,"DSS Extract Log #: "_ECXARRAY("EXTRACT")
|
---|
| 211 | W !,"Date Range of Audit: "_ECXARRAY("START")_" to "_ECXARRAY("END")
|
---|
| 212 | W !,"Report Run Date/Time: "_ECXRUN
|
---|
| 213 | I $D(ECXDIV(ECXFL)) W !,"Division/Site: "_$P(ECXDIV(ECXFL),U,2)_" ("_ECXFL_")",?68,"Page: "_ECXPG
|
---|
| 214 | I '$D(ECXDIV(ECXFL)) W !,"Division/Site: "_"Unknown",?68,"Page: "_ECXPG
|
---|
| 215 | W !!,"Feeder Location",?ECXTAB,"Feeder Key",?68,"Quantity"
|
---|
| 216 | W !,LN,!
|
---|
| 217 | Q
|
---|