[613] | 1 | ALPBUTL ;OIFO-DALLAS MW,SED,KC-BCMA BCBU REPORT FUNCTIONS AND UTILITIES ;01/01/03
|
---|
| 2 | ;;3.0;BAR CODE MED ADMIN;**8**;Mar 2004
|
---|
| 3 | ;
|
---|
| 4 | DEFPRT() ; fetch and return default printer...
|
---|
| 5 | ; returns default printer entry from Device file based on entry in
|
---|
| 6 | ; DEFAULT MAR PRINTER field in BCMA BACKUP PARAMETERS file (53.71)
|
---|
| 7 | N X
|
---|
| 8 | S X=+$O(^ALPB(53.71,0))
|
---|
| 9 | I X=0 Q ""
|
---|
| 10 | Q $P($G(^%ZIS(1,+$P(^ALPB(53.71,X,0),"^",3),0)),U)
|
---|
| 11 | ;
|
---|
| 12 | DEFDAYS() ; fetch and return default days for MAR printing...
|
---|
| 13 | ; returns default number of days to print MARs based on entry in
|
---|
| 14 | ; DEFAULT DAYS FOR MAR field in BCMA BACKUP PARAMETERS file (53.71)
|
---|
| 15 | ; if null or undefined, returns default of 3 (days)
|
---|
| 16 | N X
|
---|
| 17 | S X=+$O(^ALPB(53.71,0))
|
---|
| 18 | I X=0 Q 7
|
---|
| 19 | Q +$P(^ALPB(53.71,X,0),"^",2)
|
---|
| 20 | ;
|
---|
| 21 | MLRANGE(IEN) ; find first and last Med Log entries' date/time...
|
---|
| 22 | ; IEN = patient's record number in file 53.7
|
---|
| 23 | ; returns a delimited string = first Med Log date/time^last Med Log date/time
|
---|
| 24 | N FIRST,LAST
|
---|
| 25 | S FIRST=$O(^ALPB(53.7,IEN,"AMLOG",""))
|
---|
| 26 | I FIRST="" Q "^"
|
---|
| 27 | S FIRST=FIRST\1
|
---|
| 28 | S LAST=$O(^ALPB(53.7,IEN,"AMLOG",""),-1)
|
---|
| 29 | I LAST'="" S LAST=LAST\1
|
---|
| 30 | I FIRST=LAST Q FIRST_"^"
|
---|
| 31 | Q FIRST_"^"_LAST
|
---|
| 32 | ;
|
---|
| 33 | PAD(STRING,SPACES) ; pad a string...
|
---|
| 34 | ; STRING = a string passed by reference
|
---|
| 35 | ; SPACES = number of spaces to concatenate onto STRING
|
---|
| 36 | ; returns STRING padded with SPACES number of blank spaces
|
---|
| 37 | N I,RESULT
|
---|
| 38 | I $G(STRING)="" S STRING=" "
|
---|
| 39 | I $G(SPACES)="" Q STRING
|
---|
| 40 | S RESULT=STRING F I=$L(RESULT):1:SPACES S RESULT=RESULT_" "
|
---|
| 41 | Q RESULT
|
---|
| 42 | ;
|
---|
| 43 | FDAYS(START,DAYS,SPACE) ; format a sequence of DAYS beginning with START separated by SPACE...
|
---|
| 44 | ; START = a date in FileMan internal format from which the formatted string will start
|
---|
| 45 | ; DAYS = the number of consecutive days to return in the formatted string
|
---|
| 46 | ; SPACE = the number of spaces between each number in the formatted string
|
---|
| 47 | ; (if not passed, defaults to 4 spaces)
|
---|
| 48 | ; returns a formatted string (example: 1 2 3)
|
---|
| 49 | N DIM,I,J,RESULT,TODAY
|
---|
| 50 | I $G(START)=""!($G(DAYS)="") Q ""
|
---|
| 51 | I $G(SPACE)="" S SPACE=4
|
---|
| 52 | S (RESULT,TODAY)=+$E(START,6,7)
|
---|
| 53 | F I=1:1:SPACE S RESULT=RESULT_" "
|
---|
| 54 | S DIM=$$DIM(START)
|
---|
| 55 | F I=DAYS-1:-1:1 D
|
---|
| 56 | .S TODAY=TODAY+1
|
---|
| 57 | .I TODAY>DIM S TODAY=1
|
---|
| 58 | .S RESULT=RESULT_$S(TODAY<10:"0"_TODAY,1:TODAY)
|
---|
| 59 | .I I>1 D
|
---|
| 60 | ..F J=1:1:SPACE S RESULT=RESULT_" "
|
---|
| 61 | Q RESULT
|
---|
| 62 | ;
|
---|
| 63 | FMONS(START,DAYS,SPACE) ; format a sequence of months given a START date separated by SPACE...
|
---|
| 64 | ; START = a date in FileMan internal format the month of which will be the string starting point
|
---|
| 65 | ; DAYS = the number of days that will be displayed
|
---|
| 66 | ; SPACE = the number of spaces between each month (defaults to 1 space)
|
---|
| 67 | ; returns a string equal to the month or months depending upon the number of days passed
|
---|
| 68 | ; for example: if START=3021031 (Oct 31, 2002) and DAYS=3 then two month names will be
|
---|
| 69 | ; returned: OCT NOV
|
---|
| 70 | N DIM,I,J,MON,MON1,NEXTMON,RESULT,TODAY,XSPACE
|
---|
| 71 | I $G(START)=""!($G(DAYS)="") Q ""
|
---|
| 72 | I $G(SPACE)="" S SPACE=4
|
---|
| 73 | S (XSPACE,XSTRIP)=""
|
---|
| 74 | F I=1:1:SPACE+1 S XSPACE=XSPACE_"*",XSTRIP=XSTRIP_" "
|
---|
| 75 | S DIM=$$DIM(START),TODAY=+$E(START,6,7),MON1=+$E(START,4,5)
|
---|
| 76 | S (RESULT,MON)=$$MONN(MON1)
|
---|
| 77 | I (TODAY+DAYS)<DIM!(TODAY+DAYS=DIM) Q RESULT
|
---|
| 78 | F I=1:1:DAYS D
|
---|
| 79 | .S RESULT=RESULT_XSPACE
|
---|
| 80 | .S TODAY=TODAY+1
|
---|
| 81 | .I TODAY<DIM!(TODAY=DIM) Q
|
---|
| 82 | .S MON1=MON1+1
|
---|
| 83 | .I MON1>12 S MON1=1
|
---|
| 84 | .S MON=$$MONN(MON1),RESULT=RESULT_MON
|
---|
| 85 | .S DIM=$$DIM($E(START,1,3)_$S(MON1<10:"0"_MON1,1:MON1)),TODAY=0
|
---|
| 86 | F I=$L(RESULT):-1 Q:$E(RESULT,I)'="*"!(I=0)
|
---|
| 87 | S RESULT=$E(RESULT,1,I),RESULT=$TR(RESULT,XSPACE,XSTRIP)
|
---|
| 88 | Q RESULT
|
---|
| 89 | ;
|
---|
| 90 | FDATES(START,DAYS,RESULTS) ;
|
---|
| 91 | N I,X,X1,X2
|
---|
| 92 | S RESULTS(0)=" "_$E(START,4,5)_"/"_$E(START,6,7)_" ",RESULTS(1)=START
|
---|
| 93 | F I=1:1:DAYS-1 D
|
---|
| 94 | .S X1=START,X2=I
|
---|
| 95 | .D C^%DTC
|
---|
| 96 | .S RESULTS(I+1)=X,RESULTS(0)=RESULTS(0)_" "_$E(X,4,5)_"/"_$E(X,6,7)_" "
|
---|
| 97 | .K X,X1,X2
|
---|
| 98 | Q
|
---|
| 99 | ;
|
---|
| 100 | DIM(X) ; number of days in a specified month...
|
---|
| 101 | ; X = a date in internal FileMan format (can be partial: YYYMM)
|
---|
| 102 | ; returns a number representing the number of days in month X
|
---|
| 103 | I $G(X)="" Q 0
|
---|
| 104 | N DAYS,MON,YEAR
|
---|
| 105 | S MON=+$E(X,4,5)
|
---|
| 106 | I MON<1 Q 0
|
---|
| 107 | S DAYS=$S(MON=1:31,MON=2:28,MON=3:31,MON=4:30,MON=5:31,MON=6:30,MON=7:31,MON=8:31,MON=9:30,MON=10:31,MON=11:30,MON=12:31,1:0)
|
---|
| 108 | ; if passed date is in Feb, check for leap year and adjust days if needed...
|
---|
| 109 | I MON=2 D
|
---|
| 110 | .S YEAR=+$E(X,1,3)+1700
|
---|
| 111 | .I $$LEAP^XLFDT2(YEAR) S DAYS=29
|
---|
| 112 | Q DAYS
|
---|
| 113 | ;
|
---|
| 114 | MONN(X) ; month name...
|
---|
| 115 | ; X = month number (1-12)
|
---|
| 116 | ; returns name of month specified in X
|
---|
| 117 | I $G(X)="" Q ""
|
---|
| 118 | S X=+X
|
---|
| 119 | Q $S(X=1:"JAN",X=2:"FEB",X=3:"MAR",X=4:"APR",X=5:"MAY",X=6:"JUN",X=7:"JUL",X=8:"AUG",X=9:"SEP",X=10:"OCT",X=11:"NOV",X=12:"DEC",1:"")
|
---|
| 120 | ;
|
---|
| 121 | FDATE(X) ; special format for a FileMan date/time...
|
---|
| 122 | ; X = date and time (time is optional) in FileMan format
|
---|
| 123 | ; returns the FileMan date/time in the format MM/DD/YY@HH:MM
|
---|
| 124 | N DATE,FMDATE
|
---|
| 125 | S DATE=$E(X,4,5)_"/"_$E(X,6,7)_"/"_$E(X,2,3)
|
---|
| 126 | S FMDATE=$$FMTE^XLFDT(X)
|
---|
| 127 | I $P(FMDATE,"@",2)'="" S DATE=DATE_"@"_$P($P(FMDATE,"@",2),":")_":"_$P($P(FMDATE,"@",2),":",2)
|
---|
| 128 | Q DATE
|
---|
| 129 | ;
|
---|
| 130 | WARDLIST(DTYPE) ; list of wards on file...
|
---|
| 131 | ; DTYPE = 'C' for vertical (columnar) list
|
---|
| 132 | ; 'L' for horizontal list
|
---|
| 133 | I $G(DTYPE)="" S DTYPE="L"
|
---|
| 134 | N ALPBWARD
|
---|
| 135 | W !,"Wards with BCMA Backup Data on this workstation:",!
|
---|
| 136 | S ALPBWARD=""
|
---|
| 137 | F S ALPBWARD=$O(^ALPB(53.7,"AW",ALPBWARD)) Q:ALPBWARD="" D
|
---|
| 138 | .I DTYPE="L" D Q
|
---|
| 139 | ..I $X+$L(ALPBWARD)>IOM W !
|
---|
| 140 | ..W ALPBWARD
|
---|
| 141 | ..I $O(^ALPB(53.7,"AW",ALPBWARD))'="" W ", "
|
---|
| 142 | .W !?5,ALPBWARD
|
---|
| 143 | Q
|
---|
| 144 | ;
|
---|
| 145 | WARDSEL(WARD,RESULTS) ; find a selected ward...
|
---|
| 146 | ; WARD = a string representing a ward input by the user
|
---|
| 147 | ; RESULTS = an array passed by reference in which possible matches are stored
|
---|
| 148 | ; returns possible matches for the WARD in RESULTS
|
---|
| 149 | N ALPBWARD,ALPBX
|
---|
| 150 | S RESULTS(0)=0
|
---|
| 151 | S ALPBWARD=""
|
---|
| 152 | F S ALPBWARD=$O(^ALPB(53.7,"AW",ALPBWARD)) Q:ALPBWARD="" D
|
---|
| 153 | .I ALPBWARD=WARD D Q
|
---|
| 154 | ..S RESULTS(0)=RESULTS(0)+1,RESULTS(RESULTS(0))=ALPBWARD
|
---|
| 155 | .I ALPBWARD[WARD D
|
---|
| 156 | ..S RESULTS(0)=RESULTS(0)+1,RESULTS(RESULTS(0))=ALPBWARD
|
---|
| 157 | ; if a straight lookup failed, let's try making any alphas
|
---|
| 158 | ; entered by the user uppercase and try it once more...
|
---|
| 159 | I RESULTS(0)=0 D
|
---|
| 160 | .S WARD=$$UP^XLFSTR(WARD)
|
---|
| 161 | .S ALPBWARD=""
|
---|
| 162 | .F S ALPBWARD=$O(^ALPB(53.7,"AW",ALPBWARD)) Q:ALPBWARD="" D
|
---|
| 163 | ..I ALPBWARD=WARD D Q
|
---|
| 164 | ...S RESULTS(0)=RESULTS(0)+1,RESULTS(RESULTS(0))=ALPBWARD
|
---|
| 165 | ..I ALPBWARD[WARD D
|
---|
| 166 | ...S RESULTS(0)=RESULTS(0)+1,RESULTS(RESULTS(0))=ALPBWARD
|
---|
| 167 | Q
|
---|
| 168 | ;
|
---|
| 169 | OTYP(CODE) ; expand order type for printing...
|
---|
| 170 | ; CODE = a character representing an order type
|
---|
| 171 | ; returns expanded order type from ^DD(53.79,6,0)
|
---|
| 172 | I $G(CODE)="" Q ""
|
---|
| 173 | Q $S(CODE="U":"UNIT DOSE",CODE="V":"IV",CODE="P":"PENDING",1:CODE)
|
---|
| 174 | ;
|
---|
| 175 | ORDS(IEN,DATE,RESULTS) ; retrieve orders for a given patient...
|
---|
| 176 | ; IEN = patient's record number in file 53.7
|
---|
| 177 | ; DATE = the date/time used to determine whether all or only current
|
---|
| 178 | ; orders are returned:
|
---|
| 179 | ; >passed as a date/time in FileMan internal format -- only orders
|
---|
| 180 | ; with a stop date/time equal to or greater than DATE are returned
|
---|
| 181 | ; >passed = "" then all orders are returned regardless of status
|
---|
| 182 | ; returns RESULTS(order# ien) -- note: RESULTS(0)=count of active orders
|
---|
| 183 | I +$G(IEN)=0 S RESULTS(0)=0 Q
|
---|
| 184 | N ALPBX,ALPBY,ORDERDAT,ORDERIEN,ORDERST
|
---|
| 185 | S (ORDERIEN,RESULTS(0))=0
|
---|
| 186 | F S ORDERIEN=$O(^ALPB(53.7,IEN,2,ORDERIEN)) Q:'ORDERIEN D
|
---|
| 187 | .S ORDERDAT(0)=$G(^ALPB(53.7,IEN,2,ORDERIEN,0))
|
---|
| 188 | .S ORDERDAT(1)=$G(^ALPB(53.7,IEN,2,ORDERIEN,1))
|
---|
| 189 | .S ORDERDAT(3)=$G(^ALPB(53.7,IEN,2,ORDERIEN,3))
|
---|
| 190 | .S ORDERDAT(4)=$G(^ALPB(53.7,IEN,2,ORDERIEN,4))
|
---|
| 191 | .S ORDERST=$P($P(ORDERDAT(0),"^",3),"~")
|
---|
| 192 | .; is this order current?...
|
---|
| 193 | .I $G(DATE)'=""&($P(ORDERDAT(1),"^",2)<$G(DATE)) K ORDERDAT Q
|
---|
| 194 | .; if current, is it still active?...
|
---|
| 195 | .I $G(DATE)'=""&(ORDERST'="CM")&(ORDERST'="ZS")&(ORDERST'="ZU") K ORDERDAT Q
|
---|
| 196 | .S RESULTS(0)=RESULTS(0)+1
|
---|
| 197 | .S RESULTS(ORDERIEN)=$P(ORDERDAT(0),"^")
|
---|
| 198 | .S RESULTS("B",$P(ORDERDAT(0),"^"))=ORDERIEN
|
---|
| 199 | .S RESULTS(ORDERIEN,1)=$S($P(ORDERDAT(3),"^")="V":"IV",$P(ORDERDAT(3),"^")="U":"UD",1:$P(ORDERDAT(3),"^"))
|
---|
| 200 | .S RESULTS(ORDERIEN,2)=ORDERST
|
---|
| 201 | .S RESULTS(ORDERIEN,3,0)=0
|
---|
| 202 | .;S RESULTS(ORDERIEN,4)=$P($G(ORDERDAT(4)),"^",3)
|
---|
| 203 | .S RESULTS(ORDERIEN,4)=$G(ORDERDAT(4))
|
---|
| 204 | .I +$O(^ALPB(53.7,IEN,2,ORDERIEN,7,0)) D
|
---|
| 205 | ..S ALPBX=0
|
---|
| 206 | ..F S ALPBX=$O(^ALPB(53.7,IEN,2,ORDERIEN,7,ALPBX)) Q:'ALPBX D
|
---|
| 207 | ...S ALPBY=RESULTS(ORDERIEN,3,0)+1
|
---|
| 208 | ...S RESULTS(ORDERIEN,3,ALPBY)=$P(^ALPB(53.7,IEN,2,ORDERIEN,7,ALPBX,0),"^",2)
|
---|
| 209 | ...S RESULTS(ORDERIEN,3,0)=ALPBY
|
---|
| 210 | .I +$O(^ALPB(53.7,IEN,2,ORDERIEN,8,0)) D
|
---|
| 211 | ..S ALPBX=0
|
---|
| 212 | ..F S ALPBX=$O(^ALPB(53.7,IEN,2,ORDERIEN,8,ALPBX)) Q:'ALPBX D
|
---|
| 213 | ...S ALPBY=RESULTS(ORDERIEN,3,0)+1
|
---|
| 214 | ...S RESULTS(ORDERIEN,3,ALPBY)=$P(^ALPB(53.7,IEN,2,ORDERIEN,8,ALPBX,0),"^",2)_" (Additive)"
|
---|
| 215 | ...S RESULTS(ORDERIEN,3,0)=ALPBY
|
---|
| 216 | .I +$O(^ALPB(53.7,IEN,2,ORDERIEN,9,0)) D
|
---|
| 217 | ..S ALPBX=0
|
---|
| 218 | ..F S ALPBX=$O(^ALPB(53.7,IEN,2,ORDERIEN,9,ALPBX)) Q:'ALPBX D
|
---|
| 219 | ...S ALPBY=RESULTS(ORDERIEN,3,0)+1
|
---|
| 220 | ...S RESULTS(ORDERIEN,3,ALPBY)=$P(^ALPB(53.7,IEN,2,ORDERIEN,9,ALPBX,0),"^",2)_" (Solution)"
|
---|
| 221 | ...S RESULTS(ORDERIEN,3,0)=ALPBY
|
---|
| 222 | Q
|
---|
| 223 | ;
|
---|
| 224 | DELPT(IEN) ; delete a patient's entire record...
|
---|
| 225 | ; IEN = patient's record number in file 53.7
|
---|
| 226 | N DA,DIK,X,Y
|
---|
| 227 | S DA=IEN,DIK="^ALPB(53.7,"
|
---|
| 228 | D ^DIK
|
---|
| 229 | ; after deleting the patient, check for any error log
|
---|
| 230 | ; entries and delete them...
|
---|
| 231 | D CLEAN^ALPBUTL1(IEN)
|
---|
| 232 | Q
|
---|
| 233 | ;
|
---|
| 234 | DELORD(IEN,OIEN) ; delete an order from a patient's record...
|
---|
| 235 | ; IEN = patient's record number in file 53.7
|
---|
| 236 | ; OIEN = order number's record number
|
---|
| 237 | N DA,DIK,X,Y
|
---|
| 238 | S DA=OIEN,DA(1)=IEN,DIK="^ALPB(53.7,"_DA(1)_",2,"
|
---|
| 239 | D ^DIK
|
---|
| 240 | Q
|
---|
| 241 | ;
|
---|
| 242 | STATUS ; return last update date/time and count of any errors...
|
---|
| 243 | N ALPBCNT,ALPBPARM
|
---|
| 244 | S ALPBPARM=+$O(^ALPB(53.71,0))
|
---|
| 245 | I ALPBPARM=0 W !,"NOTICE! There is no entry in the BCMA BACKUP PARAMETERS FILE!" Q
|
---|
| 246 | W !,"BCMA Backup System was last updated: ",$S($P($G(^ALPB(53.71,ALPBPARM,2)),"^")'="":$$FMTE^XLFDT($P(^ALPB(53.71,ALPBPARM,2),"^")),1:"UNKNOWN")
|
---|
| 247 | S ALPBCNT=$$ERRCT^ALPBUTL2()
|
---|
| 248 | I ALPBCNT>0 W !,"NOTICE! ",ALPBCNT_" filing error"_$S(ALPBCNT=1:" has",1:"s have")_" been logged."
|
---|
| 249 | Q
|
---|