GMTSPSHO ; SLC OIFO/GS - Herbal/OTC Medications Health Summary; 01/26/2004
;;2.7;Health Summary;**65**;Oct 20, 1995
;v6;04/07/2004
;
; External References
; DBIA 330 ^PSOHCSUM which includes ^TMP("PSOO",$J)
; DBIA 10003 DD^%DT
; DBIA 10035 ^DPT( file #2
; DBAI 10060 ^VA(200
;
; Format of ^TMP("PS00",$J,"NVA",ILFD,0) as G1 aka GMRC
; (see also ^PSOHCSUM):
;
; Field Descriptions Defined AKA/Notes
; Orderable Item $P(G1,U) Includes dosage form
; (File # 50.7)
; Status $P(G1,U,2)
; Discontinued Date $P(G1,U,7) FM format
; Order # $P(G1,U,4) CPRS Order # ptr to
; File #100
; Documented By $P($P(G1,U,6),";",2) Doc. by Name ptr to
; File #200 is $P(x;1)
; Documented Date $P(G1,U,5) FM format (Entered On)
; Clinic $P($P(G2,U,5),";",2) Clinic Name ptr to
; File #44 is $P(x;1)
; Date Started $P(G1,U,3) FM format (Start Date)
; Drug $P($P(G2,U,4),";",2) Drug name (Dispensed)
; ptr to f#50 is $P(x;1)
; Dosage $P(G2,U)
; Medication Route $P(G2,U,2)
; Schedule $P(G2,U,3)
; Statement/Explanation ^TMP("PSOO",$J,"NVA",ILFD,"DSC",nn,0)
;
; where G1=^TMP("PSOO",$J,"NVA",ILFD,0)
; G2=^TMP("PSOO",$J,"NVA",ILFD,1,0)
; nn & nnn = sequentual integers
;
; Variables Descriptions
; CT Counter of number of Herbal/OTC/Non-VA drugs for patient
; DFN Patient internal number passed in
; DGR Documented by's degree
; ILFD Inverse Last Fill Date (FM format)
; JOB $J
; G1,G2 Abstracted data strings from ^TMP("PSOO", - see MAIN & WRT
; GMT* Variables used by HS pagination routine (GMTSUP), e.g.,
; GMTSLPG=last page, GMTSTITL=title
; LL* Line lengths ('^' delimited) for override reason & S/E
; NEWFORM ;
; NL Sequential line counter for override reasons &
; statement/explanation
; T1,T2,T3 Integer tab stops for data display - see MAIN
; T4 Tab stops (#,#) for override reason display
; T5 Tab stops for Stmt/Expln display
; V Line header verbiage describing data displayed
; VARY Array of verbiage to be displayed (override reason & S/E)
; Y Scratch system variable
;
; Global Variables (variables defined outside this routine)
; DFN, GMTSNPG, GMTSQIT
;
MAIN ; Herbal/Over-the-Counter/Non-VA Medications
N CHAW,CLL,CT,DGR,G1,G2,GMTOP,GMX,I,ILFD,ILN,JOB,LINE,LL
N LL5,LP,MAX,NL,OLN,PLN,T1,T2,T3,T4,T5,V,VARY,VO,X,Y
S ILFD=0,JOB=$J,LL5="40^65"
S T1=16,T2=58,T3=33,T4="25,10",T5="33,10"
; Set variables for use by report pagination routine (GMTSUP)
S CT=0,MAX=999,GMX=0
; Check to see if a patient IEN is defined
I DFN="" D CKFORM W !?8,"No patient selected" Q
; Check page line count and print new page and header if necessary
D CKFORM Q:$D(GMTSQIT)
; Output header for report
D:GMTSNPG!(GMX'>0) HDR Q:$D(GMTSQIT) D CKFORM Q:$D(GMTSQIT)
W:'GMTOP ! S GMTOP=0,GMX=1
; Run Pharmacy extraction
D ^PSOHCSUM ; DBIA 330
; Quit if no herbals/non-VA drugs extracted - ^TMP("PSOO") via DBIA 330
I '$D(^TMP("PSOO",JOB,"NVA")) D CKFORM W !,?8,"No Non-VA Meds Extracted" Q
; Loop through ^TMP global array created by ^PSOHCSUM ; DBIA 330
; Quit if 1 Inverse Last Fill Date =0
; 2 Counter is not less than Max Occurrence
; 3 User has "up-arrowed" out of the display
F S ILFD=$O(^TMP("PSOO",JOB,"NVA",ILFD)) Q:+ILFD=0!(CT'<MAX)!($D(GMTSQIT)) D
. S G1=^TMP("PSOO",JOB,"NVA",ILFD,0)
. S G2=^TMP("PSOO",JOB,"NVA",ILFD,1,0),CT=CT+1
. D WRT
K ^TMP("PSOO",$J) ;delete temporary file created via PSOHCSUM
Q
;
WRT ; Write Data
D CKFORM Q:$D(GMTSQIT) ;line/pagination check - repeated ad nauseum
D:GMTSNPG!(GMX'>0) HDR Q:$D(GMTSQIT)
D CKFORM Q:$D(GMTSQIT)
S V="Non-VA Med: " W !?T1-$L(V),V,$P(G1,U)
D CKFORM Q:$D(GMTSQIT)
S V="Status: " W !?T1-$L(V),V,$P(G1,U,2)
; Display discontinued date if it exists (assume discontinued status)
S Y=$P(G1,U,7) I Y D DD^%DT W " (",$P(Y,"@"),")" ; DBIA 10003
S V="CPRS Order #: " W ?T2-$L(V),V,$P(G1,U,4)
D CKFORM Q:$D(GMTSQIT)
S V="Documented By: " W !?T1-$L(V),V,$P($P(G1,U,6),";",2)
I $P($P(G1,U,6),";") D DEGREE W:DGR'="" ",",DGR
S V="Documented Date: ",Y=$P(G1,U,5) D DD^%DT W ?T2-$L(V),V,Y ; DBIA 10003
D CKFORM Q:$D(GMTSQIT)
S V="Clinic: "
W !?T1-$L(V),V,$P($P(G2,U,5),";"),"-",$P($P(G2,U,5),";",2)
S V="Start Date: ",Y=$P(G1,U,3) D DD^%DT W ?T2-$L(V),V,Y ; DBIA 10003
D CKFORM Q:$D(GMTSQIT)
S V="Dispense Drug: " W !?T1-$L(V),V,$P($P(G2,U,4),";",2)
S V="Dosage: " W ?T2-$L(V),V,$P(G2,U)
D CKFORM Q:$D(GMTSQIT)
S V="Med Route: " W !?T1-$L(V),V,$P(G2,U,2)
S V="Schedule: " W ?T2-$L(V),V,$P(G2,U,3)
S V="Statement/Explanation/Comment: ",NL=""
D CKFORM Q:$D(GMTSQIT)
W !
D CKFORM Q:$D(GMTSQIT)
W !?T3-$L(V),V
K V M V=^TMP("PSOO",JOB,"NVA",ILFD,"DSC")
; Statement/Explanation verbiage
D LINES(LL5,.V) K V D LINESOUT(T5)
D CKFORM W !
K VO,X,Y
Q
;
LINESOUT(TN) ;WRITE LINES
F S NL=$O(VO(NL)) Q:NL=""!$D(GMTSQIT) D
. I NL=1 W ?$P(TN,","),VO(NL)
. E D CKFORM Q:$D(GMTSQIT) W !?$P(T4,",",2),VO(NL)
Q
;
LINES(LL,V) ;BREAK LINES OF AN ARRAY INTO APPROPRIATE MAX LENGTHS
;
; Input:
; LL = line lengths, e.g., 20^30^40 where last remains default
; V = input array w/ no null lines, use " " for blank line
;
;Output:
; OV = output array of lines broken into specified maximum lengths
;
; This subroutine takes an array of text (V) and breaks the text into
; line lengths as dictated via LL. Where the first line length (max)
; of the resulting array (VO) will be (approximately, based on line
; contents) $P(LL,"^",1), the second line length (max) will be
; $P(LL,"^",2), etc. The last line length in LL becomes the default
; maximum line length for all the remaining lines.
;
; This subroutine is useful if you want lines output in different
; lengths.
;
; Variables used:
; CHAW = the next piece of a line of a maximum byte length
; CLL = current line length (max)
; I = scratch variable
; ILN = input array line number
; LP = pointer indicating where in a line the last chaw taken
; OLN = output (resulting) line number
; PLN = previous line length (max)
; X = line being parsed for a breaking point
;
N CHAW,CLL,ILN,LP,OLN,PLN
K VO
S (I,ILN,X)="",OLN=1,CLL=$P(LL,U,OLN),PLN=CLL
F S ILN=$O(V(ILN)) Q:ILN="" S LP=1 D
. S I=$E($RE(V(ILN,0)))
. S V(ILN,0)=V(ILN,0)_$S("!?."[I:" ",",;:"[I!(I?1A):" ",1:"")
. I V(ILN,0)=" " S:X'="" VO(OLN)=X,X="",OLN=OLN+1 S VO(OLN)=" ",OLN=OLN+1 Q
. F S CHAW=$E(V(ILN,0),LP,LP+CLL-$L(X)),LP=LP+$L(CHAW),X=X_CHAW Q:CHAW=""!($L(X)<CLL) D
.. I $L(X)<CLL S VO(OLN)=X,X="" D LINESET Q
.. I X'[" "&($L(X)=CLL) S VO(OLN)=X_"-",X="" D LINESET Q
.. F I=$L(X):-1:1 Q:$E(X,I)=" "!($E(X,I)="-")
.. S VO(OLN)=$E(X,1,I),X=$E(X,I+1,999) D LINESET
S:X'="" VO(OLN)=X
Q
;
LINESET ; Used by LINES for setting variables
S OLN=OLN+1,PLN=CLL,CLL=$P(LL,U,OLN) S:+CLL=0 CLL=PLN
Q
;
CKFORM ; Checks to determine whether to do a form feed or not
D CKP^GMTSUP Q:$D(GMTSQIT)
Q
;
HDR ; Prints Header
S GMTOP=1
I GMX'>0 D CKP^GMTSUP Q:$D(GMTSQIT)
I 'GMTSNPG D CKP^GMTSUP Q:$D(GMTSQIT)
Q
;
DEGREE ; Gets degree of 'Documented by' individual & converts to upper case
S DGR=$$GET1^DIQ(200,$P($P(G1,U,6),";"),10.6) ; DBIA 10060
S DGR=$TR(DGR,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
Q
GMTSPSHO ; SLC OIFO/GS - Herbal/OTC Medications Health Summary; 01/26/2004
+1 ;;2.7;Health Summary;**65**;Oct 20, 1995
+2 ;v6;04/07/2004
+3 ;
+4 ; External References
+5 ; DBIA 330 ^PSOHCSUM which includes ^TMP("PSOO",$J)
+6 ; DBIA 10003 DD^%DT
+7 ; DBIA 10035 ^DPT( file #2
+8 ; DBAI 10060 ^VA(200
+9 ;
+10 ; Format of ^TMP("PS00",$J,"NVA",ILFD,0) as G1 aka GMRC
+11 ; (see also ^PSOHCSUM):
+12 ;
+13 ; Field Descriptions Defined AKA/Notes
+14 ; Orderable Item $P(G1,U) Includes dosage form
+15 ; (File # 50.7)
+16 ; Status $P(G1,U,2)
+17 ; Discontinued Date $P(G1,U,7) FM format
+18 ; Order # $P(G1,U,4) CPRS Order # ptr to
+19 ; File #100
+20 ; Documented By $P($P(G1,U,6),";",2) Doc. by Name ptr to
+21 ; File #200 is $P(x;1)
+22 ; Documented Date $P(G1,U,5) FM format (Entered On)
+23 ; Clinic $P($P(G2,U,5),";",2) Clinic Name ptr to
+24 ; File #44 is $P(x;1)
+25 ; Date Started $P(G1,U,3) FM format (Start Date)
+26 ; Drug $P($P(G2,U,4),";",2) Drug name (Dispensed)
+27 ; ptr to f#50 is $P(x;1)
+28 ; Dosage $P(G2,U)
+29 ; Medication Route $P(G2,U,2)
+30 ; Schedule $P(G2,U,3)
+31 ; Statement/Explanation ^TMP("PSOO",$J,"NVA",ILFD,"DSC",nn,0)
+32 ;
+33 ; where G1=^TMP("PSOO",$J,"NVA",ILFD,0)
+34 ; G2=^TMP("PSOO",$J,"NVA",ILFD,1,0)
+35 ; nn & nnn = sequentual integers
+36 ;
+37 ; Variables Descriptions
+38 ; CT Counter of number of Herbal/OTC/Non-VA drugs for patient
+39 ; DFN Patient internal number passed in
+40 ; DGR Documented by's degree
+41 ; ILFD Inverse Last Fill Date (FM format)
+42 ; JOB $J
+43 ; G1,G2 Abstracted data strings from ^TMP("PSOO", - see MAIN & WRT
+44 ; GMT* Variables used by HS pagination routine (GMTSUP), e.g.,
+45 ; GMTSLPG=last page, GMTSTITL=title
+46 ; LL* Line lengths ('^' delimited) for override reason & S/E
+47 ; NEWFORM ;
+48 ; NL Sequential line counter for override reasons &
+49 ; statement/explanation
+50 ; T1,T2,T3 Integer tab stops for data display - see MAIN
+51 ; T4 Tab stops (#,#) for override reason display
+52 ; T5 Tab stops for Stmt/Expln display
+53 ; V Line header verbiage describing data displayed
+54 ; VARY Array of verbiage to be displayed (override reason & S/E)
+55 ; Y Scratch system variable
+56 ;
+57 ; Global Variables (variables defined outside this routine)
+58 ; DFN, GMTSNPG, GMTSQIT
+59 ;
MAIN ; Herbal/Over-the-Counter/Non-VA Medications
+1 NEW CHAW,CLL,CT,DGR,G1,G2,GMTOP,GMX,I,ILFD,ILN,JOB,LINE,LL
+2 NEW LL5,LP,MAX,NL,OLN,PLN,T1,T2,T3,T4,T5,V,VARY,VO,X,Y
+3 SET ILFD=0
SET JOB=$JOB
SET LL5="40^65"
+4 SET T1=16
SET T2=58
SET T3=33
SET T4="25,10"
SET T5="33,10"
+5 ; Set variables for use by report pagination routine (GMTSUP)
+6 SET CT=0
SET MAX=999
SET GMX=0
+7 ; Check to see if a patient IEN is defined
+8 IF DFN=""
DO CKFORM
WRITE !?8,"No patient selected"
QUIT
+9 ; Check page line count and print new page and header if necessary
+10 DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+11 ; Output header for report
+12 IF GMTSNPG!(GMX'>0)
DO HDR
IF $DATA(GMTSQIT)
QUIT
DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+13 IF 'GMTOP
WRITE !
SET GMTOP=0
SET GMX=1
+14 ; Run Pharmacy extraction
+15 ; DBIA 330
DO ^PSOHCSUM
+16 ; Quit if no herbals/non-VA drugs extracted - ^TMP("PSOO") via DBIA 330
+17 IF '$DATA(^TMP("PSOO",JOB,"NVA"))
DO CKFORM
WRITE !,?8,"No Non-VA Meds Extracted"
QUIT
+18 ; Loop through ^TMP global array created by ^PSOHCSUM ; DBIA 330
+19 ; Quit if 1 Inverse Last Fill Date =0
+20 ; 2 Counter is not less than Max Occurrence
+21 ; 3 User has "up-arrowed" out of the display
+22 FOR
SET ILFD=$ORDER(^TMP("PSOO",JOB,"NVA",ILFD))
IF +ILFD=0!(CT'<MAX)!($DATA(GMTSQIT))
QUIT
Begin DoDot:1
+23 SET G1=^TMP("PSOO",JOB,"NVA",ILFD,0)
+24 SET G2=^TMP("PSOO",JOB,"NVA",ILFD,1,0)
SET CT=CT+1
+25 DO WRT
End DoDot:1
+26 ;delete temporary file created via PSOHCSUM
KILL ^TMP("PSOO",$JOB)
+27 QUIT
+28 ;
WRT ; Write Data
+1 ;line/pagination check - repeated ad nauseum
DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+2 IF GMTSNPG!(GMX'>0)
DO HDR
IF $DATA(GMTSQIT)
QUIT
+3 DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+4 SET V="Non-VA Med: "
WRITE !?T1-$LENGTH(V),V,$PIECE(G1,U)
+5 DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+6 SET V="Status: "
WRITE !?T1-$LENGTH(V),V,$PIECE(G1,U,2)
+7 ; Display discontinued date if it exists (assume discontinued status)
+8 ; DBIA 10003
SET Y=$PIECE(G1,U,7)
IF Y
DO DD^%DT
WRITE " (",$PIECE(Y,"@"),")"
+9 SET V="CPRS Order #: "
WRITE ?T2-$LENGTH(V),V,$PIECE(G1,U,4)
+10 DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+11 SET V="Documented By: "
WRITE !?T1-$LENGTH(V),V,$PIECE($PIECE(G1,U,6),";",2)
+12 IF $PIECE($PIECE(G1,U,6),";")
DO DEGREE
IF DGR'=""
WRITE ",",DGR
+13 ; DBIA 10003
SET V="Documented Date: "
SET Y=$PIECE(G1,U,5)
DO DD^%DT
WRITE ?T2-$LENGTH(V),V,Y
+14 DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+15 SET V="Clinic: "
+16 WRITE !?T1-$LENGTH(V),V,$PIECE($PIECE(G2,U,5),";"),"-",$PIECE($PIECE(G2,U,5),";",2)
+17 ; DBIA 10003
SET V="Start Date: "
SET Y=$PIECE(G1,U,3)
DO DD^%DT
WRITE ?T2-$LENGTH(V),V,Y
+18 DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+19 SET V="Dispense Drug: "
WRITE !?T1-$LENGTH(V),V,$PIECE($PIECE(G2,U,4),";",2)
+20 SET V="Dosage: "
WRITE ?T2-$LENGTH(V),V,$PIECE(G2,U)
+21 DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+22 SET V="Med Route: "
WRITE !?T1-$LENGTH(V),V,$PIECE(G2,U,2)
+23 SET V="Schedule: "
WRITE ?T2-$LENGTH(V),V,$PIECE(G2,U,3)
+24 SET V="Statement/Explanation/Comment: "
SET NL=""
+25 DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+26 WRITE !
+27 DO CKFORM
IF $DATA(GMTSQIT)
QUIT
+28 WRITE !?T3-$LENGTH(V),V
+29 KILL V
MERGE V=^TMP("PSOO",JOB,"NVA",ILFD,"DSC")
+30 ; Statement/Explanation verbiage
+31 DO LINES(LL5,.V)
KILL V
DO LINESOUT(T5)
+32 DO CKFORM
WRITE !
+33 KILL VO,X,Y
+34 QUIT
+35 ;
LINESOUT(TN) ;WRITE LINES
+1 FOR
SET NL=$ORDER(VO(NL))
IF NL=""!$DATA(GMTSQIT)
QUIT
Begin DoDot:1
+2 IF NL=1
WRITE ?$PIECE(TN,","),VO(NL)
+3 IF '$TEST
DO CKFORM
IF $DATA(GMTSQIT)
QUIT
WRITE !?$PIECE(T4,",",2),VO(NL)
End DoDot:1
+4 QUIT
+5 ;
LINES(LL,V) ;BREAK LINES OF AN ARRAY INTO APPROPRIATE MAX LENGTHS
+1 ;
+2 ; Input:
+3 ; LL = line lengths, e.g., 20^30^40 where last remains default
+4 ; V = input array w/ no null lines, use " " for blank line
+5 ;
+6 ;Output:
+7 ; OV = output array of lines broken into specified maximum lengths
+8 ;
+9 ; This subroutine takes an array of text (V) and breaks the text into
+10 ; line lengths as dictated via LL. Where the first line length (max)
+11 ; of the resulting array (VO) will be (approximately, based on line
+12 ; contents) $P(LL,"^",1), the second line length (max) will be
+13 ; $P(LL,"^",2), etc. The last line length in LL becomes the default
+14 ; maximum line length for all the remaining lines.
+15 ;
+16 ; This subroutine is useful if you want lines output in different
+17 ; lengths.
+18 ;
+19 ; Variables used:
+20 ; CHAW = the next piece of a line of a maximum byte length
+21 ; CLL = current line length (max)
+22 ; I = scratch variable
+23 ; ILN = input array line number
+24 ; LP = pointer indicating where in a line the last chaw taken
+25 ; OLN = output (resulting) line number
+26 ; PLN = previous line length (max)
+27 ; X = line being parsed for a breaking point
+28 ;
+29 NEW CHAW,CLL,ILN,LP,OLN,PLN
+30 KILL VO
+31 SET (I,ILN,X)=""
SET OLN=1
SET CLL=$PIECE(LL,U,OLN)
SET PLN=CLL
+32 FOR
SET ILN=$ORDER(V(ILN))
IF ILN=""
QUIT
SET LP=1
Begin DoDot:1
+33 SET I=$EXTRACT($REVERSE(V(ILN,0)))
+34 SET V(ILN,0)=V(ILN,0)_$SELECT("!?."[I:" ",",;:"[I!(I?1A):" ",1:"")
+35 IF V(ILN,0)=" "
IF X'=""
SET VO(OLN)=X
SET X=""
SET OLN=OLN+1
SET VO(OLN)=" "
SET OLN=OLN+1
QUIT
+36 FOR
SET CHAW=$EXTRACT(V(ILN,0),LP,LP+CLL-$LENGTH(X))
SET LP=LP+$LENGTH(CHAW)
SET X=X_CHAW
IF CHAW=""!($LENGTH(X)<CLL)
QUIT
Begin DoDot:2
+37 IF $LENGTH(X)<CLL
SET VO(OLN)=X
SET X=""
DO LINESET
QUIT
+38 IF X'[" "&($LENGTH(X)=CLL)
SET VO(OLN)=X_"-"
SET X=""
DO LINESET
QUIT
+39 FOR I=$LENGTH(X):-1:1
IF $EXTRACT(X,I)=" "!($EXTRACT(X,I)="-")
QUIT
+40 SET VO(OLN)=$EXTRACT(X,1,I)
SET X=$EXTRACT(X,I+1,999)
DO LINESET
End DoDot:2
End DoDot:1
+41 IF X'=""
SET VO(OLN)=X
+42 QUIT
+43 ;
LINESET ; Used by LINES for setting variables
+1 SET OLN=OLN+1
SET PLN=CLL
SET CLL=$PIECE(LL,U,OLN)
IF +CLL=0
SET CLL=PLN
+2 QUIT
+3 ;
CKFORM ; Checks to determine whether to do a form feed or not
+1 DO CKP^GMTSUP
IF $DATA(GMTSQIT)
QUIT
+2 QUIT
+3 ;
HDR ; Prints Header
+1 SET GMTOP=1
+2 IF GMX'>0
DO CKP^GMTSUP
IF $DATA(GMTSQIT)
QUIT
+3 IF 'GMTSNPG
DO CKP^GMTSUP
IF $DATA(GMTSQIT)
QUIT
+4 QUIT
+5 ;
DEGREE ; Gets degree of 'Documented by' individual & converts to upper case
+1 ; DBIA 10060
SET DGR=$$GET1^DIQ(200,$PIECE($PIECE(G1,U,6),";"),10.6)
+2 SET DGR=$TRANSLATE(DGR,"abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+3 QUIT