- PSJFTR ;BIR/JCH-INPATIENT MEDS FREE TEXT DOSAGE REPORT ;15 Nov 01 / 9:45 AM
- ;;5.0; INPATIENT MEDICATIONS ;**65,73,76,111**;16 Dec 97
- ;
- ; Reference to ^PSDRUG is supported by DBIA 2192.
- ; Reference to ^PS(55 is supported by DBIA 2191.
- ; Reference to ^PSSORPH is supported by DBIA 3234.
- ;
- ;List IP orders that have free text dosages for a given date range.
- ;Report is sorted by drug and physician.
- ;
- BEG ;Begin
- N BEGDT,ENDT
- W !,"This report searches for Free Text Dosages in Inpatient Unit Dose Orders"
- W !,"for a range of dates. Orders with Stop Dates that fall within the range"
- W !,"are included in the report."
- W ! K %DT S %DT("A")="Beginning Date: ",%DT="APE"
- D ^%DT G:Y<0!($D(DTOUT)) EXIT S (%DT(0),BEGDT)=Y
- W ! S %DT("A")="Ending Date: "
- D ^%DT G:Y<0!($D(DTOUT)) EXIT S ENDT=Y D:+$E(Y,6,7)=0 DTC
- K %DT(0)
- ;
- DEV ;Device
- K %ZIS,IOP,POP,ZTSK S PSJION=$I,%ZIS="QM"
- D ^%ZIS K %ZIS
- I POP S IOP=PSJION D ^%ZIS K IOP,PSJION W !,"Please try later!" G EXIT
- K PSJION I $D(IO("Q")) D G EXIT
- .S ZTDESC="Rx free text dosage report",ZTRTN="START^PSJFTR"
- .F G="BEGDT","ENDT" S:$D(@G) ZTSAVE(G)=""
- .K IO("Q") D ^%ZTLOAD W:$D(ZTSK) !,"Report is Queued to print!" K ZTSK
- START ;Start processing date range
- N PSGND0,PSGDT,PSGORD,PSJDOSE,PSGDRG,PSJDRN,PSJPR,PSJCNT
- N PSJL,PSJY,PSJC,STOPDT,DRGNODE,STDT
- K ^TMP("PSJFTR",$J)
- S Q=0 W:$E(IOST)="C" !!!,"Working - please wait.."
- UD ;
- ST1 ;
- S PSGDFN=0,STOPDT=ENDT_".99999"
- F S PSGDFN=$O(^PS(55,PSGDFN)) Q:'PSGDFN!$D(DIRUT) D
- .S STDT=BEGDT-.0001
- .F S STDT=$O(^PS(55,PSGDFN,5,"AUS",STDT)) Q:'STDT!(STDT>STOPDT)!$D(DIRUT) D
- ..S PSGORD="" I PSGDFN=740 S JCH=$G(JCH)+1
- ..F S PSGORD=$O(^PS(55,PSGDFN,5,"AUS",STDT,PSGORD)) Q:PSGORD=""!$D(DIRUT) D
- ...Q:'$D(^PS(55,PSGDFN,5,PSGORD,1,0))
- ...S PSGDCNT=0 F S PSGDCNT=$O(^PS(55,PSGDFN,5,PSGORD,1,PSGDCNT)) Q:'PSGDCNT D
- ....N PKG,LOCNOD,ORDOSE,FMDOSE,FMUNIT,NOTXT,NXT,DARRAY,POSDOSE,LOCDOSE
- ....S NOTXT=0
- ....S PSGDRG=+$G(^PS(55,PSGDFN,5,PSGORD,1,PSGDCNT,0))
- ....Q:'$D(^PSDRUG(PSGDRG))!'PSGDRG
- ....S DRGNODE=$G(^PS(55,PSGDFN,5,PSGORD,.2)),PSGND0=^PS(55,PSGDFN,5,PSGORD,0)
- ....S FMDOSE=$P(DRGNODE,"^",5),FMUNIT=$P(DRGNODE,"^",6)
- ....I FMDOSE]"",FMUNIT]"" Q
- ....S ORDOSE=$P(DRGNODE,"^",2) Q:ORDOSE="" ; Nothing there?
- ....I $E(IOST)="C" S Q=Q+1 W:'(Q#50) "."
- ....K DARRAY S DARRAY="" D DOSE^PSSORPH(.DARRAY,PSGDRG,"U")
- ....I '$G(DARRAY(1)) D CHKLOC ; check local doses
- ....I $G(DARRAY(1)) D CHKPOS ; check possible doses
- ....Q:NOTXT ; Not free text
- ....D PRD
- U IO S PSJPG=1,PSJCNT=0 D HD
- I '$D(^TMP("PSJFTR",$J,"B")) W !!,"***** No Records were found for this period *****",!! G EXIT
- DET ;
- S J="" F S J=$O(^TMP("PSJFTR",$J,"B",J)) Q:J="" D Q:$D(DIRUT)
- .S L="",Q=0,Q2=0
- .F S L=$O(^TMP("PSJFTR",$J,"B",J,L)) Q:L="" D Q:$D(DIRUT)
- ..S PSGDRG=$O(^TMP("PSJFTR",$J,"B",J,L,0))
- ..Q:'PSGDRG
- ..S Y=^TMP("PSJFTR",$J,"B",J,L,PSGDRG,0)
- ..W:'Q !,$E(J,1,30)_" ("_PSGDRG_")"
- ..W:Q2'=Q !,$E(J,1,30)_" ("_PSGDRG_")"," - (Continued)",!
- ..W:$L(L)>35 ?40,$E(L,1,35),!,?40,$E(L,36,99) W:$L(L)'>35 ?40,L
- ..W ?75,+Y,!," "
- ..S Q=Q+1,Q2=Q
- ..S PR=0 F S PR=$O(^TMP("PSJFTR",$J,"B",J,L,PSGDRG,PR)) Q:'PR D
- ...S Y=^TMP("PSJFTR",$J,"B",J,L,PSGDRG,PR),T=$S(PR=.1:"PROVIDER NOT FOUND",1:$P(^VA(200,+PR,0),"^"))
- ...S T=T_":"_Y_" "
- ...W:($X+$L(T))>74 !?4
- ...W T
- ..W ! I ($Y+5)>IOSL D HD S Q2=0
- EXIT W ! D ^%ZISC K DIR,DTOUT,DUOUT,DIROUT,DIRUT,^TMP("PSJFTR",$J),I,X,T,J,L,Q,Y
- S:$D(ZTQUEUED) ZTREQ="@"
- Q
- PRD ;
- S PSJDRN=$P(^PSDRUG(PSGDRG,0),"^"),PSJPR=+$P(PSGND0,"^",2)
- I 'PSJPR S PSJPR=.1
- I '$D(^TMP("PSJFTR",$J,"B",PSJDRN,ORDOSE,PSGDRG,PSJPR)) D Q
- .S ^TMP("PSJFTR",$J,"B",PSJDRN,ORDOSE,PSGDRG,PSJPR)=1
- .S ^TMP("PSJFTR",$J,"B",PSJDRN,ORDOSE,PSGDRG,0)=$G(^TMP("PSJFTR",$J,"B",PSJDRN,ORDOSE,PSGDRG,0))+1
- I $D(^TMP("PSJFTR",$J,"B",PSJDRN,ORDOSE,PSGDRG,PSJPR)) D Q
- .S Y=^TMP("PSJFTR",$J,"B",PSJDRN,ORDOSE,PSGDRG,PSJPR)
- .S Y=Y+1,^TMP("PSJFTR",$J,"B",PSJDRN,ORDOSE,PSGDRG,PSJPR)=Y
- .S X=^TMP("PSJFTR",$J,"B",PSJDRN,ORDOSE,PSGDRG,0)
- .S X=X+1,^TMP("PSJFTR",$J,"B",PSJDRN,ORDOSE,PSGDRG,0)=X
- Q
- ;
- CHKPOS ; Check for possible doses
- S NOTXT=0
- S NXT="" F S NXT=$O(DARRAY(NXT)) Q:'NXT!NOTXT D
- .Q:$P($G(^PSDRUG(PSGDRG,"DOS1",NXT,0)),"^",3)'["I"
- .S POSDOSE=$P(DARRAY(NXT),"^",1)_$P(DARRAY(NXT),"^",2) I POSDOSE=ORDOSE S NOTXT=1
- Q
- ;
- CHKLOC ; Check for local doses
- S NOTXT=0
- S NXT="" F S NXT=$O(DARRAY(NXT)) Q:'NXT!NOTXT D
- .Q:$P($G(^PSDRUG(PSGDRG,"DOS2",NXT,0)),"^",2)'["I"
- .S LOCDOSE=$P(DARRAY(NXT),"^",3) I LOCDOSE=ORDOSE S NOTXT=1
- Q
- ;
- HD ;
- I PSJPG>1,$E(IOST)="C" S DIR(0)="E",DIR("A")=" Press Return to Continue or ^ to Exit" D ^DIR K DIR
- Q:$D(DIRUT)
- N FMTDT
- I PSJPG=1,$E(IOST)="C" W @IOF
- I PSJPG>1 W @IOF W "Run Date: " S FMTDT=$$FMTE^XLFDT(DT) W FMTDT
- W ?72,"Page "_PSJPG S PSJPG=PSJPG+1
- W !,?15,"Inpatient Free Text Dosage Entry Report",!,?17,"Period: "
- S FMTDT=$$FMTE^XLFDT(BEGDT) W FMTDT W " to "
- S FMTDT=$$FMTE^XLFDT(ENDT) W FMTDT
- W !,"Drug",?40,"Free Text Entry",?74,"Count",!," Provider:Count"
- W ! F Y=1:1:79 W "-"
- W ! Q
- DTC ;
- N DD,MM S DD=31,MM=+$E(Y,4,5) I MM'=12 S MM=MM+1,MM=$S(MM<10:"0",1:"")_MM,X2=Y,X1=$E(Y,1,3)_MM_"00" D ^%DTC S DD=X
- S ENDT=Y+DD
- Q
- PSJFTR ;BIR/JCH-INPATIENT MEDS FREE TEXT DOSAGE REPORT ;15 Nov 01 / 9:45 AM
- +1 ;;5.0; INPATIENT MEDICATIONS ;**65,73,76,111**;16 Dec 97
- +2 ;
- +3 ; Reference to ^PSDRUG is supported by DBIA 2192.
- +4 ; Reference to ^PS(55 is supported by DBIA 2191.
- +5 ; Reference to ^PSSORPH is supported by DBIA 3234.
- +6 ;
- +7 ;List IP orders that have free text dosages for a given date range.
- +8 ;Report is sorted by drug and physician.
- +9 ;
- BEG ;Begin
- +1 NEW BEGDT,ENDT
- +2 WRITE !,"This report searches for Free Text Dosages in Inpatient Unit Dose Orders"
- +3 WRITE !,"for a range of dates. Orders with Stop Dates that fall within the range"
- +4 WRITE !,"are included in the report."
- +5 WRITE !
- KILL %DT
- SET %DT("A")="Beginning Date: "
- SET %DT="APE"
- +6 DO ^%DT
- IF Y<0!($DATA(DTOUT))
- GOTO EXIT
- SET (%DT(0),BEGDT)=Y
- +7 WRITE !
- SET %DT("A")="Ending Date: "
- +8 DO ^%DT
- IF Y<0!($DATA(DTOUT))
- GOTO EXIT
- SET ENDT=Y
- IF +$EXTRACT(Y,6,7)=0
- DO DTC
- +9 KILL %DT(0)
- +10 ;
- DEV ;Device
- +1 KILL %ZIS,IOP,POP,ZTSK
- SET PSJION=$IO
- SET %ZIS="QM"
- +2 DO ^%ZIS
- KILL %ZIS
- +3 IF POP
- SET IOP=PSJION
- DO ^%ZIS
- KILL IOP,PSJION
- WRITE !,"Please try later!"
- GOTO EXIT
- +4 KILL PSJION
- IF $DATA(IO("Q"))
- Begin DoDot:1
- +5 SET ZTDESC="Rx free text dosage report"
- SET ZTRTN="START^PSJFTR"
- +6 FOR G="BEGDT","ENDT"
- IF $DATA(@G)
- SET ZTSAVE(G)=""
- +7 KILL IO("Q")
- DO ^%ZTLOAD
- IF $DATA(ZTSK)
- WRITE !,"Report is Queued to print!"
- KILL ZTSK
- End DoDot:1
- GOTO EXIT
- START ;Start processing date range
- +1 NEW PSGND0,PSGDT,PSGORD,PSJDOSE,PSGDRG,PSJDRN,PSJPR,PSJCNT
- +2 NEW PSJL,PSJY,PSJC,STOPDT,DRGNODE,STDT
- +3 KILL ^TMP("PSJFTR",$JOB)
- +4 SET Q=0
- IF $EXTRACT(IOST)="C"
- WRITE !!!,"Working - please wait.."
- UD ;
- ST1 ;
- +1 SET PSGDFN=0
- SET STOPDT=ENDT_".99999"
- +2 FOR
- SET PSGDFN=$ORDER(^PS(55,PSGDFN))
- IF 'PSGDFN!$DATA(DIRUT)
- QUIT
- Begin DoDot:1
- +3 SET STDT=BEGDT-.0001
- +4 FOR
- SET STDT=$ORDER(^PS(55,PSGDFN,5,"AUS",STDT))
- IF 'STDT!(STDT>STOPDT)!$DATA(DIRUT)
- QUIT
- Begin DoDot:2
- +5 SET PSGORD=""
- IF PSGDFN=740
- SET JCH=$GET(JCH)+1
- +6 FOR
- SET PSGORD=$ORDER(^PS(55,PSGDFN,5,"AUS",STDT,PSGORD))
- IF PSGORD=""!$DATA(DIRUT)
- QUIT
- Begin DoDot:3
- +7 IF '$DATA(^PS(55,PSGDFN,5,PSGORD,1,0))
- QUIT
- +8 SET PSGDCNT=0
- FOR
- SET PSGDCNT=$ORDER(^PS(55,PSGDFN,5,PSGORD,1,PSGDCNT))
- IF 'PSGDCNT
- QUIT
- Begin DoDot:4
- +9 NEW PKG,LOCNOD,ORDOSE,FMDOSE,FMUNIT,NOTXT,NXT,DARRAY,POSDOSE,LOCDOSE
- +10 SET NOTXT=0
- +11 SET PSGDRG=+$GET(^PS(55,PSGDFN,5,PSGORD,1,PSGDCNT,0))
- +12 IF '$DATA(^PSDRUG(PSGDRG))!'PSGDRG
- QUIT
- +13 SET DRGNODE=$GET(^PS(55,PSGDFN,5,PSGORD,.2))
- SET PSGND0=^PS(55,PSGDFN,5,PSGORD,0)
- +14 SET FMDOSE=$PIECE(DRGNODE,"^",5)
- SET FMUNIT=$PIECE(DRGNODE,"^",6)
- +15 IF FMDOSE]""
- IF FMUNIT]""
- QUIT
- +16 ; Nothing there?
- SET ORDOSE=$PIECE(DRGNODE,"^",2)
- IF ORDOSE=""
- QUIT
- +17 IF $EXTRACT(IOST)="C"
- SET Q=Q+1
- IF '(Q#50)
- WRITE "."
- +18 KILL DARRAY
- SET DARRAY=""
- DO DOSE^PSSORPH(.DARRAY,PSGDRG,"U")
- +19 ; check local doses
- IF '$GET(DARRAY(1))
- DO CHKLOC
- +20 ; check possible doses
- IF $GET(DARRAY(1))
- DO CHKPOS
- +21 ; Not free text
- IF NOTXT
- QUIT
- +22 DO PRD
- End DoDot:4
- End DoDot:3
- End DoDot:2
- End DoDot:1
- +23 USE IO
- SET PSJPG=1
- SET PSJCNT=0
- DO HD
- +24 IF '$DATA(^TMP("PSJFTR",$JOB,"B"))
- WRITE !!,"***** No Records were found for this period *****",!!
- GOTO EXIT
- DET ;
- +1 SET J=""
- FOR
- SET J=$ORDER(^TMP("PSJFTR",$JOB,"B",J))
- IF J=""
- QUIT
- Begin DoDot:1
- +2 SET L=""
- SET Q=0
- SET Q2=0
- +3 FOR
- SET L=$ORDER(^TMP("PSJFTR",$JOB,"B",J,L))
- IF L=""
- QUIT
- Begin DoDot:2
- +4 SET PSGDRG=$ORDER(^TMP("PSJFTR",$JOB,"B",J,L,0))
- +5 IF 'PSGDRG
- QUIT
- +6 SET Y=^TMP("PSJFTR",$JOB,"B",J,L,PSGDRG,0)
- +7 IF 'Q
- WRITE !,$EXTRACT(J,1,30)_" ("_PSGDRG_")"
- +8 IF Q2'=Q
- WRITE !,$EXTRACT(J,1,30)_" ("_PSGDRG_")"," - (Continued)",!
- +9 IF $LENGTH(L)>35
- WRITE ?40,$EXTRACT(L,1,35),!,?40,$EXTRACT(L,36,99)
- IF $LENGTH(L)'>35
- WRITE ?40,L
- +10 WRITE ?75,+Y,!," "
- +11 SET Q=Q+1
- SET Q2=Q
- +12 SET PR=0
- FOR
- SET PR=$ORDER(^TMP("PSJFTR",$JOB,"B",J,L,PSGDRG,PR))
- IF 'PR
- QUIT
- Begin DoDot:3
- +13 SET Y=^TMP("PSJFTR",$JOB,"B",J,L,PSGDRG,PR)
- SET T=$SELECT(PR=.1:"PROVIDER NOT FOUND",1:$PIECE(^VA(200,+PR,0),"^"))
- +14 SET T=T_":"_Y_" "
- +15 IF ($X+$LENGTH(T))>74
- WRITE !?4
- +16 WRITE T
- End DoDot:3
- +17 WRITE !
- IF ($Y+5)>IOSL
- DO HD
- SET Q2=0
- End DoDot:2
- IF $DATA(DIRUT)
- QUIT
- End DoDot:1
- IF $DATA(DIRUT)
- QUIT
- EXIT WRITE !
- DO ^%ZISC
- KILL DIR,DTOUT,DUOUT,DIROUT,DIRUT,^TMP("PSJFTR",$JOB),I,X,T,J,L,Q,Y
- +1 IF $DATA(ZTQUEUED)
- SET ZTREQ="@"
- +2 QUIT
- PRD ;
- +1 SET PSJDRN=$PIECE(^PSDRUG(PSGDRG,0),"^")
- SET PSJPR=+$PIECE(PSGND0,"^",2)
- +2 IF 'PSJPR
- SET PSJPR=.1
- +3 IF '$DATA(^TMP("PSJFTR",$JOB,"B",PSJDRN,ORDOSE,PSGDRG,PSJPR))
- Begin DoDot:1
- +4 SET ^TMP("PSJFTR",$JOB,"B",PSJDRN,ORDOSE,PSGDRG,PSJPR)=1
- +5 SET ^TMP("PSJFTR",$JOB,"B",PSJDRN,ORDOSE,PSGDRG,0)=$GET(^TMP("PSJFTR",$JOB,"B",PSJDRN,ORDOSE,PSGDRG,0))+1
- End DoDot:1
- QUIT
- +6 IF $DATA(^TMP("PSJFTR",$JOB,"B",PSJDRN,ORDOSE,PSGDRG,PSJPR))
- Begin DoDot:1
- +7 SET Y=^TMP("PSJFTR",$JOB,"B",PSJDRN,ORDOSE,PSGDRG,PSJPR)
- +8 SET Y=Y+1
- SET ^TMP("PSJFTR",$JOB,"B",PSJDRN,ORDOSE,PSGDRG,PSJPR)=Y
- +9 SET X=^TMP("PSJFTR",$JOB,"B",PSJDRN,ORDOSE,PSGDRG,0)
- +10 SET X=X+1
- SET ^TMP("PSJFTR",$JOB,"B",PSJDRN,ORDOSE,PSGDRG,0)=X
- End DoDot:1
- QUIT
- +11 QUIT
- +12 ;
- CHKPOS ; Check for possible doses
- +1 SET NOTXT=0
- +2 SET NXT=""
- FOR
- SET NXT=$ORDER(DARRAY(NXT))
- IF 'NXT!NOTXT
- QUIT
- Begin DoDot:1
- +3 IF $PIECE($GET(^PSDRUG(PSGDRG,"DOS1",NXT,0)),"^",3)'["I"
- QUIT
- +4 SET POSDOSE=$PIECE(DARRAY(NXT),"^",1)_$PIECE(DARRAY(NXT),"^",2)
- IF POSDOSE=ORDOSE
- SET NOTXT=1
- End DoDot:1
- +5 QUIT
- +6 ;
- CHKLOC ; Check for local doses
- +1 SET NOTXT=0
- +2 SET NXT=""
- FOR
- SET NXT=$ORDER(DARRAY(NXT))
- IF 'NXT!NOTXT
- QUIT
- Begin DoDot:1
- +3 IF $PIECE($GET(^PSDRUG(PSGDRG,"DOS2",NXT,0)),"^",2)'["I"
- QUIT
- +4 SET LOCDOSE=$PIECE(DARRAY(NXT),"^",3)
- IF LOCDOSE=ORDOSE
- SET NOTXT=1
- End DoDot:1
- +5 QUIT
- +6 ;
- HD ;
- +1 IF PSJPG>1
- IF $EXTRACT(IOST)="C"
- SET DIR(0)="E"
- SET DIR("A")=" Press Return to Continue or ^ to Exit"
- DO ^DIR
- KILL DIR
- +2 IF $DATA(DIRUT)
- QUIT
- +3 NEW FMTDT
- +4 IF PSJPG=1
- IF $EXTRACT(IOST)="C"
- WRITE @IOF
- +5 IF PSJPG>1
- WRITE @IOF
- WRITE "Run Date: "
- SET FMTDT=$$FMTE^XLFDT(DT)
- WRITE FMTDT
- +6 WRITE ?72,"Page "_PSJPG
- SET PSJPG=PSJPG+1
- +7 WRITE !,?15,"Inpatient Free Text Dosage Entry Report",!,?17,"Period: "
- +8 SET FMTDT=$$FMTE^XLFDT(BEGDT)
- WRITE FMTDT
- WRITE " to "
- +9 SET FMTDT=$$FMTE^XLFDT(ENDT)
- WRITE FMTDT
- +10 WRITE !,"Drug",?40,"Free Text Entry",?74,"Count",!," Provider:Count"
- +11 WRITE !
- FOR Y=1:1:79
- WRITE "-"
- +12 WRITE !
- QUIT
- DTC ;
- +1 NEW DD,MM
- SET DD=31
- SET MM=+$EXTRACT(Y,4,5)
- IF MM'=12
- SET MM=MM+1
- SET MM=$SELECT(MM<10:"0",1:"")_MM
- SET X2=Y
- SET X1=$EXTRACT(Y,1,3)_MM_"00"
- DO ^%DTC
- SET DD=X
- +2 SET ENDT=Y+DD
- +3 QUIT