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