- YTSRAID ;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,SKIP
- 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)
- ..I RAW="X" S SKIP(SCALE)=$G(SKIP(SCALE))+1 ;Some reports need to keep count of skipped questions
- ..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#...
- ;1319|LEGACY|3^4^5^6^7^8^9^10^11^12^13^14^15^16^17^18^19^20
- ;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 SCORE,I
- ;
- I YSDATA(4)="8381^2^1156" S YSDATA(4)="8381^2;1^" ;check if other field has "not asked" mh choice entry and replace with blank text
- S YSDATA($O(YSDATA(""),-1)+1)=999999999999_U_U_$P(TSARR("RAID Total Score"),U,2)
- ;logic to add special answers to YSDATA
- ;
- Q
- ;
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HYTSRAID 3101 printed Feb 18, 2025@23:47:05 Page 2
- YTSRAID ;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,SKIP
- +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 ;Some reports need to keep count of skipped questions
- IF RAW="X"
- SET SKIP(SCALE)=$GET(SKIP(SCALE))+1
- +16 SET SCORE(SCALE)=$GET(SCORE(SCALE))+RAW
- End DoDot:2
- End DoDot:1
- +17 ;
- +18 ;add logic to handle skipped questions.
- +19 ;
- +20 ;add logic to handle transformed scores
- +21 ;
- +22 QUIT
- +23 ;
- +24 ;SCOREDAT maps questions to their scale and to the method we use to retrieve the raw value.
- +25 ;A scale can have multiple lines and does not need to match the scalegroup order
- +26 ;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 ;1319|LEGACY|3^4^5^6^7^8^9^10^11^12^13^14^15^16^17^18^19^20
- +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 SCORE,I
- +2 ;
- +3 ;check if other field has "not asked" mh choice entry and replace with blank text
- IF YSDATA(4)="8381^2^1156"
- SET YSDATA(4)="8381^2;1^"
- +4 SET YSDATA($ORDER(YSDATA(""),-1)+1)=999999999999_U_U_$PIECE(TSARR("RAID Total Score"),U,2)
- +5 ;logic to add special answers to YSDATA
- +6 ;
- +7 QUIT
- +8 ;