YTSCOPD ;SLC/DJE- ANSWERS SPECIAL HANDLING - WHOQOL-BREF ; 10/16/18 9:35am
;;5.01;MENTAL HEALTH;**139**;;Build 134
;
;Public, Supported ICRs
; #2056 - Fileman API - $$GET1^DIQ
;
DATA1(SCORE) ;expects YSDATA, returns SCORE, multiple scales so we use nodes i.e. SCORE(SCALEIEN)=###
;specialized DATA1 uses SCOREDAT table to map question to score relationships
N LINE,TEXT
F LINE=1:1 S TEXT=$P($T(SCOREDAT+LINE),";",2) Q:TEXT="QUIT" D
.N SCALE,RAWTYPE,QUESTIONS,I
.S SCALE=$P(TEXT,"|",1) S RAWTYPE=$P(TEXT,"|",2) S QUESTIONS=$P(TEXT,"|",3)
.F I=1:1:$L(QUESTIONS,U) D
..N NODE,DATA,RAW
..S NODE=$P(QUESTIONS,U,I)+2 ;YSDATA question nodes start at 3
..S DATA=YSDATA(NODE)
..;retrieval method section. For each RAWTYPE assign a value to RAW
..;typical case, YSDATA piece 3 has the MH CHOICE IEN and raw value is in LEGACY field
..I RAWTYPE="LEGACY" S RAW=$$GET1^DIQ(601.75,$P($G(DATA),U,3)_",",4,"I")
..;raw score is stored directly in YSDATA piece 3 - trackbars do this.
..I RAWTYPE="DIRECT" S RAW=$P($G(DATA),U,3)
..S SCORE(SCALE)=$G(SCORE(SCALE))+RAW
;
;add logic to handle skipped questions.
;
;add logic to handle transformed scores
;
Q
;
;SCOREDAT maps questions to their scale and to the method we use to retrieve the raw value.
;A scale can have multiple lines and does not need to match the scalegroup order
;You can create your own RAW RETRIEVAL METHOD, just make sure we handle the case in DATA1
SCOREDAT ; SCALE IEN|RAW RETRIEVAL METHOD|QUES#^QUES#...
;1317|LEGACY|1^2^3^4^5^6^7^8
;QUIT
Q
;
SCORESV(SCORE) ;Expects SCORE to be in format SCORE(SCALE_IEN)=###. Also expects ^TMP($J,"YSG")
N YSCORNODE,YSGNODE
I $D(^TMP($J,"YSG",1)),^TMP($J,"YSG",1)="[ERROR]" D Q ;-->out
.K ^TMP($J,"YSCOR")
.S ^TMP($J,"YSCOR",1)="[ERROR]"
.S ^TMP($J,"YSCOR",2)="No Scale found for ADMIN"
;
K ^TMP($J,"YSCOR")
S ^TMP($J,"YSCOR",1)="[DATA]"
S YSCORNODE=2
S YSGNODE=2 F S YSGNODE=$O(^TMP($J,"YSG",YSGNODE)) Q:YSGNODE="" D
.N SCALEIEN
.I $E(^TMP($J,"YSG",YSGNODE),1,5)'="Scale" Q ;only read the lines for scales
.S SCALEIEN=+$P(^TMP($J,"YSG",YSGNODE),"=",2) ;grab the first number after "=" sign
.S ^TMP($J,"YSCOR",YSCORNODE)=$$GET1^DIQ(601.87,SCALEIEN_",",3,"I")_"="_SCORE(SCALEIEN)
.S YSCORNODE=YSCORNODE+1
;
Q
;
DLLSTR(YSDATA,YS,YSTRNG) ;
; YSTRNG = 1 Score Instrument
; YSTRNG = 2 get Report Answers and Text
N SCORE,TSARR
;
I YSTRNG=1 D DATA1(.SCORE),SCORESV(.SCORE)
;LDSCORES is not retrieving t-scores for TMP($J,"YSCOR") so we need to run LDTSCOR.
I YSTRNG=2 D LDTSCOR^YTSCORE(.TSARR,YS("AD")),BUILDANS(.TSARR,.YSDATA)
Q
;
BUILDANS(TSARR,YSDATA) ;
N STRING1,SCALE,I
; display the legacy values instead of option text
F I=1:1:8 D
.N DATA S DATA=YSDATA(I+2)
.S N=N+1,YSDATA(N)="777"_I_"^9999;1^"_$$GET1^DIQ(601.75,$P($G(DATA),U,3)_",",4,"I")
S SCALE=$O(TSARR(""))
S STRING1=$P(TSARR(SCALE),U,2)
S N=N+1 S YSDATA(N)="7779^9999;1^"_STRING1
Q
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HYTSCOPD 2990 printed Nov 22, 2024@17:29:38 Page 2
YTSCOPD ;SLC/DJE- ANSWERS SPECIAL HANDLING - WHOQOL-BREF ; 10/16/18 9:35am
+1 ;;5.01;MENTAL HEALTH;**139**;;Build 134
+2 ;
+3 ;Public, Supported ICRs
+4 ; #2056 - Fileman API - $$GET1^DIQ
+5 ;
DATA1(SCORE) ;expects YSDATA, returns SCORE, multiple scales so we use nodes i.e. SCORE(SCALEIEN)=###
+1 ;specialized DATA1 uses SCOREDAT table to map question to score relationships
+2 NEW LINE,TEXT
+3 FOR LINE=1:1
SET TEXT=$PIECE($TEXT(SCOREDAT+LINE),";",2)
if TEXT="QUIT"
QUIT
Begin DoDot:1
+4 NEW SCALE,RAWTYPE,QUESTIONS,I
+5 SET SCALE=$PIECE(TEXT,"|",1)
SET RAWTYPE=$PIECE(TEXT,"|",2)
SET QUESTIONS=$PIECE(TEXT,"|",3)
+6 FOR I=1:1:$LENGTH(QUESTIONS,U)
Begin DoDot:2
+7 NEW NODE,DATA,RAW
+8 ;YSDATA question nodes start at 3
SET NODE=$PIECE(QUESTIONS,U,I)+2
+9 SET DATA=YSDATA(NODE)
+10 ;retrieval method section. For each RAWTYPE assign a value to RAW
+11 ;typical case, YSDATA piece 3 has the MH CHOICE IEN and raw value is in LEGACY field
+12 IF RAWTYPE="LEGACY"
SET RAW=$$GET1^DIQ(601.75,$PIECE($GET(DATA),U,3)_",",4,"I")
+13 ;raw score is stored directly in YSDATA piece 3 - trackbars do this.
+14 IF RAWTYPE="DIRECT"
SET RAW=$PIECE($GET(DATA),U,3)
+15 SET SCORE(SCALE)=$GET(SCORE(SCALE))+RAW
End DoDot:2
End DoDot:1
+16 ;
+17 ;add logic to handle skipped questions.
+18 ;
+19 ;add logic to handle transformed scores
+20 ;
+21 QUIT
+22 ;
+23 ;SCOREDAT maps questions to their scale and to the method we use to retrieve the raw value.
+24 ;A scale can have multiple lines and does not need to match the scalegroup order
+25 ;You can create your own RAW RETRIEVAL METHOD, just make sure we handle the case in DATA1
SCOREDAT ; SCALE IEN|RAW RETRIEVAL METHOD|QUES#^QUES#...
+1 ;1317|LEGACY|1^2^3^4^5^6^7^8
+2 ;QUIT
+3 QUIT
+4 ;
SCORESV(SCORE) ;Expects SCORE to be in format SCORE(SCALE_IEN)=###. Also expects ^TMP($J,"YSG")
+1 NEW YSCORNODE,YSGNODE
+2 ;-->out
IF $DATA(^TMP($JOB,"YSG",1))
IF ^TMP($JOB,"YSG",1)="[ERROR]"
Begin DoDot:1
+3 KILL ^TMP($JOB,"YSCOR")
+4 SET ^TMP($JOB,"YSCOR",1)="[ERROR]"
+5 SET ^TMP($JOB,"YSCOR",2)="No Scale found for ADMIN"
End DoDot:1
QUIT
+6 ;
+7 KILL ^TMP($JOB,"YSCOR")
+8 SET ^TMP($JOB,"YSCOR",1)="[DATA]"
+9 SET YSCORNODE=2
+10 SET YSGNODE=2
FOR
SET YSGNODE=$ORDER(^TMP($JOB,"YSG",YSGNODE))
if YSGNODE=""
QUIT
Begin DoDot:1
+11 NEW SCALEIEN
+12 ;only read the lines for scales
IF $EXTRACT(^TMP($JOB,"YSG",YSGNODE),1,5)'="Scale"
QUIT
+13 ;grab the first number after "=" sign
SET SCALEIEN=+$PIECE(^TMP($JOB,"YSG",YSGNODE),"=",2)
+14 SET ^TMP($JOB,"YSCOR",YSCORNODE)=$$GET1^DIQ(601.87,SCALEIEN_",",3,"I")_"="_SCORE(SCALEIEN)
+15 SET YSCORNODE=YSCORNODE+1
End DoDot:1
+16 ;
+17 QUIT
+18 ;
DLLSTR(YSDATA,YS,YSTRNG) ;
+1 ; YSTRNG = 1 Score Instrument
+2 ; YSTRNG = 2 get Report Answers and Text
+3 NEW SCORE,TSARR
+4 ;
+5 IF YSTRNG=1
DO DATA1(.SCORE)
DO SCORESV(.SCORE)
+6 ;LDSCORES is not retrieving t-scores for TMP($J,"YSCOR") so we need to run LDTSCOR.
+7 IF YSTRNG=2
DO LDTSCOR^YTSCORE(.TSARR,YS("AD"))
DO BUILDANS(.TSARR,.YSDATA)
+8 QUIT
+9 ;
BUILDANS(TSARR,YSDATA) ;
+1 NEW STRING1,SCALE,I
+2 ; display the legacy values instead of option text
+3 FOR I=1:1:8
Begin DoDot:1
+4 NEW DATA
SET DATA=YSDATA(I+2)
+5 SET N=N+1
SET YSDATA(N)="777"_I_"^9999;1^"_$$GET1^DIQ(601.75,$PIECE($GET(DATA),U,3)_",",4,"I")
End DoDot:1
+6 SET SCALE=$ORDER(TSARR(""))
+7 SET STRING1=$PIECE(TSARR(SCALE),U,2)
+8 SET N=N+1
SET YSDATA(N)="7779^9999;1^"_STRING1
+9 QUIT
+10 ;