LEX10DX ;ISL/KER - ICD-9 Diagnosis ;04/21/2014
;;2.0;LEXICON UTILITY;**80**;Sep 23, 1996;Build 10
;
; Global Variables
; ^TMP("LEXDX" SACC 2.3.2.5.1
; ^TMP("LEXFND" SACC 2.3.2.5.1
; ^TMP("LEXHIT" SACC 2.3.2.5.1
; ^TMP("LEXSCH" SACC 2.3.2.5.1
;
; External References
; ^DIM ICR 10016
; $$ICDDATA^ICDXCODE ICR 5699
; $$DT^XLFDT ICR 10103
;
Q
I9T(X,LEXA,LEXD,LEXL,LEXF) ; ICD-9 DX Text Lookup (Pruned)
;
; Input
; X Diagnostic Text Required
; .LEXA Local Array (by Ref) Required
; LEXD Date (FM Format) Optional (Default TODAY)
; LEXL Maximum to Return Optional (Default = 30)
; LEXF Filter Optional (Default ICD)
;
; Output
;
; LEXA(0)=# ^ PI No to exceed 30
; LEXA(#)=<code ien>_"^"_<code>_"^"_<activation date>
; LEXA(#,0)=<expression ien>_"^"_<expression>
;
; Note: Second piece of LEXA(0) is the pruning
; indicator and set to "1" if pruning
; occurred
;
; See DX^LEX10DP for DX Code Lookup (Pruned)
;
K ^TMP("LEXSCH",$J),^TMP("LEXFND",$J),^TMP("LEXHIT",$J)
N DIC,LEXFIL,LEXLEN,LEXLI,LEXCDT,LEXVDT,LEXX,LEXPR,LEX
S LEXX=$G(X) Q:'$L(LEXX) S LEXCDT=$G(LEXD),LEXFIL=$G(LEXF)
S:LEXCDT'?7N LEXCDT=$G(DT) S:LEXCDT'?7N LEXCDT=$$DT^XLFDT
S LEXLEN=$G(LEXL) S:+LEXLEN'>0 LEXLEN=30 S LEXPR=0
S:'$L(LEXFIL) LEXFIL="I $$SO^LEXU(Y,""ICD"",+($G(LEXCDT)))"
S DIC("S")=LEXFIL D CONFIG^LEXSET("ICD","ICD",LEXCDT)
S (DIC("S"),^TMP("LEXSCH",$J,"FIL",0))=LEXFIL
S ^TMP("LEXSCH",$J,"FIL",1)="Diagnosis"
S ^TMP("LEXSCH",$J,"DIS",0)="ICD/10D/DS4/SCC/NAN/SCT"
S ^TMP("LEXSCH",$J,"DIS",1)="Diagnosis"
K LEX D LOOK^LEXA(LEXX,"ICD",+LEXLEN,"ICD",LEXCDT)
S:+($G(LEX("LIST",0)))=LEXLEN&($O(^TMP("LEXFND",$J,0),-1)<0) LEXPR=1
K ^TMP("LEXSCH",$J),^TMP("LEXFND",$J),^TMP("LEXHIT",$J)
S LEXLI=0 F S LEXLI=$O(LEX("LIST",LEXLI)) Q:+LEXLI'>0 D
. N LEXAI,LEXCODE,LEXEFF,LEXEIEN,LEXEXP,LEXND,LEXSI,LEXSIEN,LEXSRC
. S LEXEIEN=+($G(LEX("LIST",LEXLI)))
. Q:LEXEIEN'>0
. S LEXEXP=$G(^LEX(757.01,+LEXEIEN,0))
. S LEXSI=0,(LEXSIEN,LEXCODE,LEXEFF)=""
. F S LEXSI=$O(^LEX(757.02,"B",LEXEIEN,LEXSI)) Q:+LEXSI'>0 D
. . N LEXD,LEXH,LEXND,LEXS Q:+($G(LEXSIEN))>0 S LEXND=$G(^LEX(757.02,LEXSI,0))
. . Q:$P(LEXND,"^",3)'=1 S LEXD=$O(^LEX(757.02,LEXSI,4,"B",(LEXCDT+.001)),-1)
. . Q:LEXD'?7N S LEXH=$O(^LEX(757.02,LEXSI,4,"B",LEXD," "),-1) Q:LEXH'?1N.N
. . S LEXS=$P($G(^LEX(757.02,LEXSI,4,LEXH,0)),"^",2)
. . S:LEXS>0 LEXSIEN=LEXSI,LEXEFF=LEXD,LEXCODE=$P(LEXND,"^",2)
. I +LEXSIEN'>0,LEXEIEN>0 D
. . N LEXMC,LEXSI,LEXSA S LEXMC=$P($G(^LEX(757.01,+LEXEIEN,1)),"^",1) Q:+LEXMC'>0
. . S LEXSI=0 F S LEXSI=$O(^LEX(757.02,"AMC",LEXMC,LEXSI)) Q:+LEXSI'>0 D
. . . N LEXND,LEXH,LEXS,LEXC S LEXND=$G(^LEX(757.02,+LEXSI,0)) Q:$P(LEXND,"^",3)>2
. . . S LEXH=$O(^LEX(757.02,LEXSI,4,"B",(+($G(LEXCDT))+.001)),-1)
. . . S LEXH=$O(^LEX(757.02,LEXSI,4,"B",+LEXH," "),-1)
. . . S LEXH=$G(^LEX(757.02,LEXSI,4,+LEXH,0)) Q:$P(LEXH,"^",2)'>0
. . . Q:$P(LEXND,"^",5)'>0 S LEXC=$O(LEXSA(" "),-1)+1
. . . S LEXSA(LEXC)=(LEXSI_"^"_$P(LEXH,"^",1)),LEXSA(0)=LEXC
. . I LEXSA(0)=1,+($G(LEXSA(1)))>0,$O(LEXSA(1))'>0 D
. . . N LEXSI,LEXEI,LEXEF S LEXSI=+($G(LEXSA(1))),LEXEF=$P($G(LEXSA(1)),"^",2)
. . . S LEXEI=+($G(^LEX(757.02,+LEXSI,0))) Q:+LEXEI'>0 Q:LEXEF'?7N
. . . S LEXSIEN=LEXSI,LEXEIEN=LEXEI,LEXEFF=LEXEF
. Q:+LEXSIEN'>0 Q:LEXEFF'?7N Q:+LEXEIEN'>0
. S LEXND=$G(^LEX(757.02,LEXSIEN,0)) Q:+LEXEIEN'=+LEXND
. S LEXEXP=$G(^LEX(757.01,+LEXEIEN,0)) Q:'$L(LEXEXP)
. Q:$P($G(^LEX(757.01,+LEXEIEN,1)),"^",5)>0
. S LEXSRC=$P(LEXND,"^",3) Q:LEXSRC'=1 S LEXCODE=$P(LEXND,"^",2)
. Q:'$L(LEXCODE) S LEXAI=$O(LEXA(" "),-1)+1
. S LEXA(LEXAI)=LEXSIEN_"^"_LEXCODE_"^"_LEXEFF
. S LEXA(LEXAI,0)=LEXEIEN_"^"_LEXEXP
. S LEXA(0)=$O(LEXA(" "),-1)
S:+($G(LEXA(0)))'>0 LEXA(0)=-1 Q:+($G(LEXA(0)))'>0
K LEX S:LEXPR>0&(+($G(LEXA(0)))>0) $P(LEXA(0),"^",2)=LEXPR
Q
;
NEXT(LEXC,LEXA,LEXD) ; Next Character
;
; Input
;
; LEXC Partial Dx Code Required
; .LEXA Local Array (by Ref) Required
; LEXD Date (FM Format) Optional (Default TODAY)
;
; Output
;
; LEXA(<input>,0)= # of characters
; LEXA(<input>,<character>)=""
;
N LEX1,LEX2,LEXCDT,LEXCHK,LEXCHR,LEXCT,LEXE,LEXLEN,LEXID,LEXNC,LEXNN
N LEXOR,LEXPRE,LEXS,LEXSO S LEXC=$$TM(LEXC)
S:$L(LEXC)=3&(LEXC'[".") LEXC=LEXC_"." S (LEXID,LEXSO)=LEXC
S LEXCDT=$G(LEXD) S:LEXCDT'?7N LEXCDT=$$DT^XLFDT S LEXLEN=$L(LEXC)
Q:LEXLEN>6 "-1^Max length reached, no next character available"
I LEXLEN>1 D
. S LEXOR=$E(LEXSO,1,($L(LEXSO)-1))_$C($A($E(LEXSO,$L(LEXSO)))-1)_"~"
S:LEXLEN=1 LEXOR=$C($A(LEXSO)-1)_"~" S:LEXLEN'>0 LEXOR="/~"
S LEXCHK=0 S:LEXLEN'>0 LEXCHK=1 S:LEXLEN>0&(LEXLEN<3) LEXCHK=LEXLEN+1
S:LEXLEN=3 LEXCHK=LEXLEN+2 S:LEXLEN>3 LEXCHK=LEXLEN+1
Q:+LEXCHK'>0 "-1^Character position not specified"
S:LEXLEN=0 LEXID="<null>" S:'$L(LEXID) LEXID="<unknown>"
S LEXNN="^LEX(757.02,""ADX"","""_LEXOR_" "")"
S LEXNC="^LEX(757.02,""ADX"","""_LEXSO,LEXCT=0
F S LEXNN=$Q(@LEXNN) Q:'$L(LEXNN)!(LEXNN'[LEXNC) D
. N LEXC,LEXD,LEXE,LEXS,LEX1,LEX2
. S LEXC=$P(LEXNN,",",3),LEXC=$TR(LEXC,"""",""),LEXC=$$TM(LEXC)
. S LEXD=+($P(LEXNN,",",4)) Q:LEXD'?7N Q:(LEXCDT+.001)'>LEXD
. I $E(LEXC,1,$L(LEXSO))=LEXSO,$L(LEXC)'<LEXCHK D Q
. . N LEXCHR S LEXCHR=$E(LEXC,LEXCHK) Q:'$L(LEXCHR)
. . I '$D(LEXA(LEXID,LEXCHR)) D
. . . S LEXA(LEXID,LEXCHR)="",LEXCT=LEXCT+1
. . S LEXOR=$E(LEXC,1,LEXCHK)_"~"
. . S LEXNN="^LEX(757.02,""ADX"","""_LEXOR_" "")"
S:+($G(LEXCT))>0 LEXA(LEXID)=+($G(LEXCT))
Q +($G(LEXCT))
;
; Miscellaneous
TM(X,Y) ; Trim Character Y - Default " "
S X=$G(X) Q:X="" X S Y=$G(Y) S:'$L(Y) Y=" "
F Q:$E(X,1)'=Y S X=$E(X,2,$L(X))
F Q:$E(X,$L(X))'=Y S X=$E(X,1,($L(X)-1))
Q X
LEX10DX ;ISL/KER - ICD-9 Diagnosis ;04/21/2014
+1 ;;2.0;LEXICON UTILITY;**80**;Sep 23, 1996;Build 10
+2 ;
+3 ; Global Variables
+4 ; ^TMP("LEXDX" SACC 2.3.2.5.1
+5 ; ^TMP("LEXFND" SACC 2.3.2.5.1
+6 ; ^TMP("LEXHIT" SACC 2.3.2.5.1
+7 ; ^TMP("LEXSCH" SACC 2.3.2.5.1
+8 ;
+9 ; External References
+10 ; ^DIM ICR 10016
+11 ; $$ICDDATA^ICDXCODE ICR 5699
+12 ; $$DT^XLFDT ICR 10103
+13 ;
+14 QUIT
I9T(X,LEXA,LEXD,LEXL,LEXF) ; ICD-9 DX Text Lookup (Pruned)
+1 ;
+2 ; Input
+3 ; X Diagnostic Text Required
+4 ; .LEXA Local Array (by Ref) Required
+5 ; LEXD Date (FM Format) Optional (Default TODAY)
+6 ; LEXL Maximum to Return Optional (Default = 30)
+7 ; LEXF Filter Optional (Default ICD)
+8 ;
+9 ; Output
+10 ;
+11 ; LEXA(0)=# ^ PI No to exceed 30
+12 ; LEXA(#)=<code ien>_"^"_<code>_"^"_<activation date>
+13 ; LEXA(#,0)=<expression ien>_"^"_<expression>
+14 ;
+15 ; Note: Second piece of LEXA(0) is the pruning
+16 ; indicator and set to "1" if pruning
+17 ; occurred
+18 ;
+19 ; See DX^LEX10DP for DX Code Lookup (Pruned)
+20 ;
+21 KILL ^TMP("LEXSCH",$JOB),^TMP("LEXFND",$JOB),^TMP("LEXHIT",$JOB)
+22 NEW DIC,LEXFIL,LEXLEN,LEXLI,LEXCDT,LEXVDT,LEXX,LEXPR,LEX
+23 SET LEXX=$GET(X)
IF '$LENGTH(LEXX)
QUIT
SET LEXCDT=$GET(LEXD)
SET LEXFIL=$GET(LEXF)
+24 IF LEXCDT'?7N
SET LEXCDT=$GET(DT)
IF LEXCDT'?7N
SET LEXCDT=$$DT^XLFDT
+25 SET LEXLEN=$GET(LEXL)
IF +LEXLEN'>0
SET LEXLEN=30
SET LEXPR=0
+26 IF '$LENGTH(LEXFIL)
SET LEXFIL="I $$SO^LEXU(Y,""ICD"",+($G(LEXCDT)))"
+27 SET DIC("S")=LEXFIL
DO CONFIG^LEXSET("ICD","ICD",LEXCDT)
+28 SET (DIC("S"),^TMP("LEXSCH",$JOB,"FIL",0))=LEXFIL
+29 SET ^TMP("LEXSCH",$JOB,"FIL",1)="Diagnosis"
+30 SET ^TMP("LEXSCH",$JOB,"DIS",0)="ICD/10D/DS4/SCC/NAN/SCT"
+31 SET ^TMP("LEXSCH",$JOB,"DIS",1)="Diagnosis"
+32 KILL LEX
DO LOOK^LEXA(LEXX,"ICD",+LEXLEN,"ICD",LEXCDT)
+33 IF +($GET(LEX("LIST",0)))=LEXLEN&($ORDER(^TMP("LEXFND",$JOB,0),-1)<0)
SET LEXPR=1
+34 KILL ^TMP("LEXSCH",$JOB),^TMP("LEXFND",$JOB),^TMP("LEXHIT",$JOB)
+35 SET LEXLI=0
FOR
SET LEXLI=$ORDER(LEX("LIST",LEXLI))
IF +LEXLI'>0
QUIT
Begin DoDot:1
+36 NEW LEXAI,LEXCODE,LEXEFF,LEXEIEN,LEXEXP,LEXND,LEXSI,LEXSIEN,LEXSRC
+37 SET LEXEIEN=+($GET(LEX("LIST",LEXLI)))
+38 IF LEXEIEN'>0
QUIT
+39 SET LEXEXP=$GET(^LEX(757.01,+LEXEIEN,0))
+40 SET LEXSI=0
SET (LEXSIEN,LEXCODE,LEXEFF)=""
+41 FOR
SET LEXSI=$ORDER(^LEX(757.02,"B",LEXEIEN,LEXSI))
IF +LEXSI'>0
QUIT
Begin DoDot:2
+42 NEW LEXD,LEXH,LEXND,LEXS
IF +($GET(LEXSIEN))>0
QUIT
SET LEXND=$GET(^LEX(757.02,LEXSI,0))
+43 IF $PIECE(LEXND,"^",3)'=1
QUIT
SET LEXD=$ORDER(^LEX(757.02,LEXSI,4,"B",(LEXCDT+.001)),-1)
+44 IF LEXD'?7N
QUIT
SET LEXH=$ORDER(^LEX(757.02,LEXSI,4,"B",LEXD," "),-1)
IF LEXH'?1N.N
QUIT
+45 SET LEXS=$PIECE($GET(^LEX(757.02,LEXSI,4,LEXH,0)),"^",2)
+46 IF LEXS>0
SET LEXSIEN=LEXSI
SET LEXEFF=LEXD
SET LEXCODE=$PIECE(LEXND,"^",2)
End DoDot:2
+47 IF +LEXSIEN'>0
IF LEXEIEN>0
Begin DoDot:2
+48 NEW LEXMC,LEXSI,LEXSA
SET LEXMC=$PIECE($GET(^LEX(757.01,+LEXEIEN,1)),"^",1)
IF +LEXMC'>0
QUIT
+49 SET LEXSI=0
FOR
SET LEXSI=$ORDER(^LEX(757.02,"AMC",LEXMC,LEXSI))
IF +LEXSI'>0
QUIT
Begin DoDot:3
+50 NEW LEXND,LEXH,LEXS,LEXC
SET LEXND=$GET(^LEX(757.02,+LEXSI,0))
IF $PIECE(LEXND,"^",3)>2
QUIT
+51 SET LEXH=$ORDER(^LEX(757.02,LEXSI,4,"B",(+($GET(LEXCDT))+.001)),-1)
+52 SET LEXH=$ORDER(^LEX(757.02,LEXSI,4,"B",+LEXH," "),-1)
+53 SET LEXH=$GET(^LEX(757.02,LEXSI,4,+LEXH,0))
IF $PIECE(LEXH,"^",2)'>0
QUIT
+54 IF $PIECE(LEXND,"^",5)'>0
QUIT
SET LEXC=$ORDER(LEXSA(" "),-1)+1
+55 SET LEXSA(LEXC)=(LEXSI_"^"_$PIECE(LEXH,"^",1))
SET LEXSA(0)=LEXC
End DoDot:3
+56 IF LEXSA(0)=1
IF +($GET(LEXSA(1)))>0
IF $ORDER(LEXSA(1))'>0
Begin DoDot:3
+57 NEW LEXSI,LEXEI,LEXEF
SET LEXSI=+($GET(LEXSA(1)))
SET LEXEF=$PIECE($GET(LEXSA(1)),"^",2)
+58 SET LEXEI=+($GET(^LEX(757.02,+LEXSI,0)))
IF +LEXEI'>0
QUIT
IF LEXEF'?7N
QUIT
+59 SET LEXSIEN=LEXSI
SET LEXEIEN=LEXEI
SET LEXEFF=LEXEF
End DoDot:3
End DoDot:2
+60 IF +LEXSIEN'>0
QUIT
IF LEXEFF'?7N
QUIT
IF +LEXEIEN'>0
QUIT
+61 SET LEXND=$GET(^LEX(757.02,LEXSIEN,0))
IF +LEXEIEN'=+LEXND
QUIT
+62 SET LEXEXP=$GET(^LEX(757.01,+LEXEIEN,0))
IF '$LENGTH(LEXEXP)
QUIT
+63 IF $PIECE($GET(^LEX(757.01,+LEXEIEN,1)),"^",5)>0
QUIT
+64 SET LEXSRC=$PIECE(LEXND,"^",3)
IF LEXSRC'=1
QUIT
SET LEXCODE=$PIECE(LEXND,"^",2)
+65 IF '$LENGTH(LEXCODE)
QUIT
SET LEXAI=$ORDER(LEXA(" "),-1)+1
+66 SET LEXA(LEXAI)=LEXSIEN_"^"_LEXCODE_"^"_LEXEFF
+67 SET LEXA(LEXAI,0)=LEXEIEN_"^"_LEXEXP
+68 SET LEXA(0)=$ORDER(LEXA(" "),-1)
End DoDot:1
+69 IF +($GET(LEXA(0)))'>0
SET LEXA(0)=-1
IF +($GET(LEXA(0)))'>0
QUIT
+70 KILL LEX
IF LEXPR>0&(+($GET(LEXA(0)))>0)
SET $PIECE(LEXA(0),"^",2)=LEXPR
+71 QUIT
+72 ;
NEXT(LEXC,LEXA,LEXD) ; Next Character
+1 ;
+2 ; Input
+3 ;
+4 ; LEXC Partial Dx Code Required
+5 ; .LEXA Local Array (by Ref) Required
+6 ; LEXD Date (FM Format) Optional (Default TODAY)
+7 ;
+8 ; Output
+9 ;
+10 ; LEXA(<input>,0)= # of characters
+11 ; LEXA(<input>,<character>)=""
+12 ;
+13 NEW LEX1,LEX2,LEXCDT,LEXCHK,LEXCHR,LEXCT,LEXE,LEXLEN,LEXID,LEXNC,LEXNN
+14 NEW LEXOR,LEXPRE,LEXS,LEXSO
SET LEXC=$$TM(LEXC)
+15 IF $LENGTH(LEXC)=3&(LEXC'[".")
SET LEXC=LEXC_"."
SET (LEXID,LEXSO)=LEXC
+16 SET LEXCDT=$GET(LEXD)
IF LEXCDT'?7N
SET LEXCDT=$$DT^XLFDT
SET LEXLEN=$LENGTH(LEXC)
+17 IF LEXLEN>6
QUIT "-1^Max length reached, no next character available"
+18 IF LEXLEN>1
Begin DoDot:1
+19 SET LEXOR=$EXTRACT(LEXSO,1,($LENGTH(LEXSO)-1))_$CHAR($ASCII($EXTRACT(LEXSO,$LENGTH(LEXSO)))-1)_"~"
End DoDot:1
+20 IF LEXLEN=1
SET LEXOR=$CHAR($ASCII(LEXSO)-1)_"~"
IF LEXLEN'>0
SET LEXOR="/~"
+21 SET LEXCHK=0
IF LEXLEN'>0
SET LEXCHK=1
IF LEXLEN>0&(LEXLEN<3)
SET LEXCHK=LEXLEN+1
+22 IF LEXLEN=3
SET LEXCHK=LEXLEN+2
IF LEXLEN>3
SET LEXCHK=LEXLEN+1
+23 IF +LEXCHK'>0
QUIT "-1^Character position not specified"
+24 IF LEXLEN=0
SET LEXID="<null>"
IF '$LENGTH(LEXID)
SET LEXID="<unknown>"
+25 SET LEXNN="^LEX(757.02,""ADX"","""_LEXOR_" "")"
+26 SET LEXNC="^LEX(757.02,""ADX"","""_LEXSO
SET LEXCT=0
+27 FOR
SET LEXNN=$QUERY(@LEXNN)
IF '$LENGTH(LEXNN)!(LEXNN'[LEXNC)
QUIT
Begin DoDot:1
+28 NEW LEXC,LEXD,LEXE,LEXS,LEX1,LEX2
+29 SET LEXC=$PIECE(LEXNN,",",3)
SET LEXC=$TRANSLATE(LEXC,"""","")
SET LEXC=$$TM(LEXC)
+30 SET LEXD=+($PIECE(LEXNN,",",4))
IF LEXD'?7N
QUIT
IF (LEXCDT+.001)'>LEXD
QUIT
+31 IF $EXTRACT(LEXC,1,$LENGTH(LEXSO))=LEXSO
IF $LENGTH(LEXC)'<LEXCHK
Begin DoDot:2
+32 NEW LEXCHR
SET LEXCHR=$EXTRACT(LEXC,LEXCHK)
IF '$LENGTH(LEXCHR)
QUIT
+33 IF '$DATA(LEXA(LEXID,LEXCHR))
Begin DoDot:3
+34 SET LEXA(LEXID,LEXCHR)=""
SET LEXCT=LEXCT+1
End DoDot:3
+35 SET LEXOR=$EXTRACT(LEXC,1,LEXCHK)_"~"
+36 SET LEXNN="^LEX(757.02,""ADX"","""_LEXOR_" "")"
End DoDot:2
QUIT
End DoDot:1
+37 IF +($GET(LEXCT))>0
SET LEXA(LEXID)=+($GET(LEXCT))
+38 QUIT +($GET(LEXCT))
+39 ;
+40 ; Miscellaneous
TM(X,Y) ; Trim Character Y - Default " "
+1 SET X=$GET(X)
IF X=""
QUIT X
SET Y=$GET(Y)
IF '$LENGTH(Y)
SET Y=" "
+2 FOR
IF $EXTRACT(X,1)'=Y
QUIT
SET X=$EXTRACT(X,2,$LENGTH(X))
+3 FOR
IF $EXTRACT(X,$LENGTH(X))'=Y
QUIT
SET X=$EXTRACT(X,1,($LENGTH(X)-1))
+4 QUIT X