ORQQPL4 ; ISL/JER/TC - Lexicon Look-up w/Synonyms ;07/30/15 08:25
;;3.0;ORDER ENTRY/RESULTS REPORTING;**306,361,350,401**;Dec 17, 1997;Build 11
;
; DBIA 2950 LOOK^LEXA ^TMP("LEXFND",$J)
; DBIA 1609 CONFIG^LEXSET ^TMP("LEXSCH",$J)
; ICR 5699 $$ICDDATA^ICDXCODE
;
Q
LEX(LST,X,VIEW,ORDATE,ORINCSYN) ; return list after lexicon lookup
; Call with: X (Required) The search text entered by the user
; [VIEW] (Optional) The Lexicon VIEW parameter (Defaults to
; Problem List Subset (i.e., "PLS")
; [ORDATE] (Optional) the date of interest (Defaults to TODAY)
; [ORINCSYN] (Optional) Boolean flag specifying whether or not to
; include synonyms for SNOMED CT Concepts
; (Defaults to 0 (FALSE))
;
; Returns: LST=gvn of ^TMP("ORLEX",$J), which contains search result set as:
; ^TMP("ORLEX",$J,1..n)=LEXIEN^PREFTEXT^ICDCODE(S)^ICDIEN^CODESYS^CONCEPTID^DESIGID^ICDVER^PARENTSUBSCRIPT
; ^TMP("ORLEX",$J,n+1)="<n> matches found"
;
N LEX,ILST,I,IEN,APP
N DIC ; p401 if an erroneous DIC("S") is left in memory it causes issues in LOOK^LEXA
S APP="GMPX",LST=$NA(^TMP("ORLEX",$J)) K @LST
S:'+$G(ORDATE) ORDATE=DT
S:'$L($G(VIEW)) VIEW="PLS"
S ORINCSYN=+$G(ORINCSYN)
I $S(X?.1A2.3N.1".".2N:1,X?.1A2.3N1"+":1,1:0) D Q
. S @LST@(1)="icd^Searching by code on the Problems Tab supports SNOMED CT, but not ICD."
. S @LST@(2)="Please try a different search"
D CONFIG^LEXSET(APP,VIEW,ORDATE)
; call LOOK^LEXA to execute the search as defined by the call to CONFIG^LEXSET
D LOOK^LEXA(X,,1,,ORDATE)
I '$D(LEX("LIST",1)) D G LEXX
. S:X?.N @LST@(1)="Code search failed"
S ILST=0
S @LST@(1)=$$LEXXFRM(LEX("LIST",1),ORDATE,APP),ILST=1
D:ORINCSYN SYNONYMS(.LST,.ILST,"SCT",$P(@LST@(1),U,6),ORDATE)
S (I,IEN)=""
F S I=$O(^TMP("LEXFND",$J,I)) Q:I="" D ;DBIA 2950
.F S IEN=$O(^TMP("LEXFND",$J,I,IEN)) Q:IEN="" D
..N TXT,ELEMENT S TXT=^TMP("LEXFND",$J,I,IEN)
..S ELEMENT=IEN_U_TXT
..S ELEMENT=$$LEXXFRM(ELEMENT,ORDATE,APP)
..S ILST=ILST+1,@LST@(ILST)=ELEMENT
..D:ORINCSYN SYNONYMS(.LST,.ILST,"SCT",$P(ELEMENT,U,6),ORDATE)
I '$D(@LST@(1)) S @LST@(1)="No matches found"
E S @LST@(ILST+1)=ILST_$S(ILST=1:" match",1:" matches")_" found"
LEXX K ^TMP("LEXFND",$J),^TMP("LEXHIT",$J),^TMP("LEXSCH",$J),^TMP("LEXLE",$J)
Q
LEXXFRM(ORX,ORDATE,ORAPP) ; Transform text for SCT look-up
N ORLEX,ORY,ORICD,ORSCT,ORTXT,ORCODSYS,ORCCODE,ORDCODE
S ORLEX=$P(ORX,U),ORTXT=$P(ORX,U,2),(ORCCODE,ORCODSYS)=""
I ORTXT["*" S ORTXT=$$STRIP^XLFSTR(ORTXT,"*")
I (ORTXT["("),(ORTXT[")") D
. S ORCODSYS=$RE($P($P($RE(ORTXT),"("),")",2))
. S ORCCODE=$$ONE^LEXU(+ORLEX,ORDATE,"SCT"),ORCODSYS=$RE($P($RE(ORCODSYS)," ",2,99))
. S ORTXT=$$TRIM^XLFSTR($RE($P($RE(ORTXT),"(",2,99)))
S ORY=$$SETELEM(ORLEX,ORTXT,ORCODSYS,ORCCODE,ORDATE)
Q ORY
SYNONYMS(LST,ILST,ORCSYS,ORCCODE,ORDT) ; Get synonyms for expression
N ORSYN,ORI,ORDAD S ORDT=$G(ORDT,DT),ORDAD=ILST
D GETSYN^LEXTRAN1(ORCSYS,ORCCODE,ORDT,"ORSYN",1,1)
S ORI=0 F S ORI=$O(ORSYN("S",ORI)) Q:+ORI'>0 D
. N ELEMENT,TXT,IEN,ORDCODE
. S IEN=$P(ORSYN("S",ORI),U,2),TXT=$P(ORSYN("S",ORI),U),ORDCODE=$P(ORSYN("S",ORI),U,3)
. S ELEMENT=$$SETELEM(IEN,TXT,"SNOMED CT",ORCCODE,ORDT,ORDCODE)_U_ORDAD
. S ILST=ILST+1,@LST@(ILST)=ELEMENT
Q
SETELEM(ORLEX,ORTXT,ORCODSYS,ORCCODE,ORDATE,ORDCODE) ; Set List Element
N ORY,ORIMPDT,ORICD,ORICDID,ORSYN,ORTYP,ORQT,ORNUM
S ORIMPDT=$$IMPDATE^LEXU("10D"),(ORTYP,ORQT,ORNUM)=""
I '$D(ORDCODE) D
. S ORDCODE=$$GETSYN^LEXTRAN1("SCT",ORCCODE,ORDATE,"ORSYN",1,1)
. I $P(ORDCODE,U)'=1 S ORDCODE="" Q
. F S ORTYP=$O(ORSYN(ORTYP)) Q:ORTYP="S"!(ORQT) D
. . I $P(ORSYN(ORTYP),U)=ORTXT S ORDCODE=$P(ORSYN(ORTYP),U,3),ORQT=1 Q
. I ORTYP="S" F S ORNUM=$O(ORSYN(ORTYP,ORNUM)) Q:ORNUM=""!(ORQT) D
. . I $P(ORSYN(ORTYP,ORNUM),U)=ORTXT S ORDCODE=$P(ORSYN(ORTYP,ORNUM),U,3),ORQT=1 Q
I ORDCODE["^" S ORDCODE=""
S ORICD=$$GETDX^ORQQPL1(ORCCODE,ORCODSYS,ORDATE)
S ORICDID=+$$ICDDATA^ICDXCODE("DIAG",$P(ORICD,"/"),ORDATE,"E")
S ORY=ORLEX_U_ORTXT_U_ORICD_U_ORICDID_U_ORCODSYS_U_ORCCODE_U_ORDCODE
I (ORCODSYS["SNOMED")!(ORCODSYS["VHAT") D
.S ORY=ORY_U_$S(ORDATE<ORIMPDT:"ICD-9-CM",1:"ICD-10-CM")
Q ORY
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HORQQPL4 4365 printed Oct 16, 2024@18:34:17 Page 2
ORQQPL4 ; ISL/JER/TC - Lexicon Look-up w/Synonyms ;07/30/15 08:25
+1 ;;3.0;ORDER ENTRY/RESULTS REPORTING;**306,361,350,401**;Dec 17, 1997;Build 11
+2 ;
+3 ; DBIA 2950 LOOK^LEXA ^TMP("LEXFND",$J)
+4 ; DBIA 1609 CONFIG^LEXSET ^TMP("LEXSCH",$J)
+5 ; ICR 5699 $$ICDDATA^ICDXCODE
+6 ;
+7 QUIT
LEX(LST,X,VIEW,ORDATE,ORINCSYN) ; return list after lexicon lookup
+1 ; Call with: X (Required) The search text entered by the user
+2 ; [VIEW] (Optional) The Lexicon VIEW parameter (Defaults to
+3 ; Problem List Subset (i.e., "PLS")
+4 ; [ORDATE] (Optional) the date of interest (Defaults to TODAY)
+5 ; [ORINCSYN] (Optional) Boolean flag specifying whether or not to
+6 ; include synonyms for SNOMED CT Concepts
+7 ; (Defaults to 0 (FALSE))
+8 ;
+9 ; Returns: LST=gvn of ^TMP("ORLEX",$J), which contains search result set as:
+10 ; ^TMP("ORLEX",$J,1..n)=LEXIEN^PREFTEXT^ICDCODE(S)^ICDIEN^CODESYS^CONCEPTID^DESIGID^ICDVER^PARENTSUBSCRIPT
+11 ; ^TMP("ORLEX",$J,n+1)="<n> matches found"
+12 ;
+13 NEW LEX,ILST,I,IEN,APP
+14 ; p401 if an erroneous DIC("S") is left in memory it causes issues in LOOK^LEXA
NEW DIC
+15 SET APP="GMPX"
SET LST=$NAME(^TMP("ORLEX",$JOB))
KILL @LST
+16 if '+$GET(ORDATE)
SET ORDATE=DT
+17 if '$LENGTH($GET(VIEW))
SET VIEW="PLS"
+18 SET ORINCSYN=+$GET(ORINCSYN)
+19 IF $SELECT(X?.1A2.3N.1".".2N:1,X?.1A2.3N1"+":1,1:0)
Begin DoDot:1
+20 SET @LST@(1)="icd^Searching by code on the Problems Tab supports SNOMED CT, but not ICD."
+21 SET @LST@(2)="Please try a different search"
End DoDot:1
QUIT
+22 DO CONFIG^LEXSET(APP,VIEW,ORDATE)
+23 ; call LOOK^LEXA to execute the search as defined by the call to CONFIG^LEXSET
+24 DO LOOK^LEXA(X,,1,,ORDATE)
+25 IF '$DATA(LEX("LIST",1))
Begin DoDot:1
+26 if X?.N
SET @LST@(1)="Code search failed"
End DoDot:1
GOTO LEXX
+27 SET ILST=0
+28 SET @LST@(1)=$$LEXXFRM(LEX("LIST",1),ORDATE,APP)
SET ILST=1
+29 if ORINCSYN
DO SYNONYMS(.LST,.ILST,"SCT",$PIECE(@LST@(1),U,6),ORDATE)
+30 SET (I,IEN)=""
+31 ;DBIA 2950
FOR
SET I=$ORDER(^TMP("LEXFND",$JOB,I))
if I=""
QUIT
Begin DoDot:1
+32 FOR
SET IEN=$ORDER(^TMP("LEXFND",$JOB,I,IEN))
if IEN=""
QUIT
Begin DoDot:2
+33 NEW TXT,ELEMENT
SET TXT=^TMP("LEXFND",$JOB,I,IEN)
+34 SET ELEMENT=IEN_U_TXT
+35 SET ELEMENT=$$LEXXFRM(ELEMENT,ORDATE,APP)
+36 SET ILST=ILST+1
SET @LST@(ILST)=ELEMENT
+37 if ORINCSYN
DO SYNONYMS(.LST,.ILST,"SCT",$PIECE(ELEMENT,U,6),ORDATE)
End DoDot:2
End DoDot:1
+38 IF '$DATA(@LST@(1))
SET @LST@(1)="No matches found"
+39 IF '$TEST
SET @LST@(ILST+1)=ILST_$SELECT(ILST=1:" match",1:" matches")_" found"
LEXX KILL ^TMP("LEXFND",$JOB),^TMP("LEXHIT",$JOB),^TMP("LEXSCH",$JOB),^TMP("LEXLE",$JOB)
+1 QUIT
LEXXFRM(ORX,ORDATE,ORAPP) ; Transform text for SCT look-up
+1 NEW ORLEX,ORY,ORICD,ORSCT,ORTXT,ORCODSYS,ORCCODE,ORDCODE
+2 SET ORLEX=$PIECE(ORX,U)
SET ORTXT=$PIECE(ORX,U,2)
SET (ORCCODE,ORCODSYS)=""
+3 IF ORTXT["*"
SET ORTXT=$$STRIP^XLFSTR(ORTXT,"*")
+4 IF (ORTXT["(")
IF (ORTXT[")")
Begin DoDot:1
+5 SET ORCODSYS=$REVERSE($PIECE($PIECE($REVERSE(ORTXT),"("),")",2))
+6 SET ORCCODE=$$ONE^LEXU(+ORLEX,ORDATE,"SCT")
SET ORCODSYS=$REVERSE($PIECE($REVERSE(ORCODSYS)," ",2,99))
+7 SET ORTXT=$$TRIM^XLFSTR($REVERSE($PIECE($REVERSE(ORTXT),"(",2,99)))
End DoDot:1
+8 SET ORY=$$SETELEM(ORLEX,ORTXT,ORCODSYS,ORCCODE,ORDATE)
+9 QUIT ORY
SYNONYMS(LST,ILST,ORCSYS,ORCCODE,ORDT) ; Get synonyms for expression
+1 NEW ORSYN,ORI,ORDAD
SET ORDT=$GET(ORDT,DT)
SET ORDAD=ILST
+2 DO GETSYN^LEXTRAN1(ORCSYS,ORCCODE,ORDT,"ORSYN",1,1)
+3 SET ORI=0
FOR
SET ORI=$ORDER(ORSYN("S",ORI))
if +ORI'>0
QUIT
Begin DoDot:1
+4 NEW ELEMENT,TXT,IEN,ORDCODE
+5 SET IEN=$PIECE(ORSYN("S",ORI),U,2)
SET TXT=$PIECE(ORSYN("S",ORI),U)
SET ORDCODE=$PIECE(ORSYN("S",ORI),U,3)
+6 SET ELEMENT=$$SETELEM(IEN,TXT,"SNOMED CT",ORCCODE,ORDT,ORDCODE)_U_ORDAD
+7 SET ILST=ILST+1
SET @LST@(ILST)=ELEMENT
End DoDot:1
+8 QUIT
SETELEM(ORLEX,ORTXT,ORCODSYS,ORCCODE,ORDATE,ORDCODE) ; Set List Element
+1 NEW ORY,ORIMPDT,ORICD,ORICDID,ORSYN,ORTYP,ORQT,ORNUM
+2 SET ORIMPDT=$$IMPDATE^LEXU("10D")
SET (ORTYP,ORQT,ORNUM)=""
+3 IF '$DATA(ORDCODE)
Begin DoDot:1
+4 SET ORDCODE=$$GETSYN^LEXTRAN1("SCT",ORCCODE,ORDATE,"ORSYN",1,1)
+5 IF $PIECE(ORDCODE,U)'=1
SET ORDCODE=""
QUIT
+6 FOR
SET ORTYP=$ORDER(ORSYN(ORTYP))
if ORTYP="S"!(ORQT)
QUIT
Begin DoDot:2
+7 IF $PIECE(ORSYN(ORTYP),U)=ORTXT
SET ORDCODE=$PIECE(ORSYN(ORTYP),U,3)
SET ORQT=1
QUIT
End DoDot:2
+8 IF ORTYP="S"
FOR
SET ORNUM=$ORDER(ORSYN(ORTYP,ORNUM))
if ORNUM=""!(ORQT)
QUIT
Begin DoDot:2
+9 IF $PIECE(ORSYN(ORTYP,ORNUM),U)=ORTXT
SET ORDCODE=$PIECE(ORSYN(ORTYP,ORNUM),U,3)
SET ORQT=1
QUIT
End DoDot:2
End DoDot:1
+10 IF ORDCODE["^"
SET ORDCODE=""
+11 SET ORICD=$$GETDX^ORQQPL1(ORCCODE,ORCODSYS,ORDATE)
+12 SET ORICDID=+$$ICDDATA^ICDXCODE("DIAG",$PIECE(ORICD,"/"),ORDATE,"E")
+13 SET ORY=ORLEX_U_ORTXT_U_ORICD_U_ORICDID_U_ORCODSYS_U_ORCCODE_U_ORDCODE
+14 IF (ORCODSYS["SNOMED")!(ORCODSYS["VHAT")
Begin DoDot:1
+15 SET ORY=ORY_U_$SELECT(ORDATE<ORIMPDT:"ICD-9-CM",1:"ICD-10-CM")
End DoDot:1
+16 QUIT ORY