- LEX10DU ;ISL/KER - ICD-10 Diagnosis Utilities ;04/21/2014
- ;;2.0;LEXICON UTILITY;**80**;Sep 23, 1996;Build 1
- ;
- ; Global Variables
- ; ^LEX(757.033 N/A
- ; ^TMP("DIAGSRCH" SACC 2.3.2.5.1
- ; ^TMP("LEXDX") SACC 2.3.2.5.1
- ; ^TMP("LEXTKN" SACC 2.3.2.5.1
- ;
- ; External References
- ; ^DIM ICR 10016
- ; $$ICDDX^ICDEX ICR 5747
- ; $$LD^ICDEX ICR 5747
- ; $$SD^ICDEX ICR 5747
- ; $$DT^XLFDT ICR 10103
- ;
- ; Local Variables NEWed or KILLed by calling
- ; routine LEX10DBT, LEX10DBC or LEX10CS
- ; LEXA
- ; LEXCS
- ; LEXDATA
- ; LEXFI
- ; LEXINC
- ; LEXVDT
- ;
- Q
- REDUCE(X) ; Reduce List
- N LEXC,LEXIT,LEXLEN,LEXMAX,LEXPRE,LEXUSE
- S LEXUSE=0,LEXLEN=8,LEXPRE=7,LEXMAX=+($G(X))
- S:LEXMAX'>0 LEXMAX=30 S LEXCT=+($G(LEXCT)) Q:+LEXCT'>0
- S LEXIT=0 F Q:LEXCT'>LEXMAX!(LEXIT) D Q:LEXIT
- . S:LEXPRE=LEXLEN LEXIT=1 Q:LEXIT
- . N LEXC S LEXC="",LEXCT=0
- . F S LEXC=$O(^TMP("LEXDX",$J,LEXC)) Q:'$L(LEXC) D
- . . I $L(LEXC)=(LEXLEN+1) D Q
- . . . N LEXCAT,LEXIS,LEXNCT,LEXNCD,LEXNPR,LEXCE,LEXTX
- . . . S LEXCAT=$$CAT(LEXC),LEXCE=$P(LEXCAT,"^",2)
- . . . S LEXTX=$P(LEXCAT,"^",3),LEXCAT=$P(LEXCAT,"^",1)
- . . . K ^TMP("LEXDX",$J,LEXC) S LEXUSE=1
- . . . Q:$D(^TMP("LEXDX",$J,(LEXCAT_" ")))
- . . . S LEXIS=$$ISCAT(LEXCAT)
- . . . S LEXNCT=$P(LEXIS,"^",2)
- . . . S LEXNCD=$P(LEXIS,"^",3)
- . . . S LEXNPR=$P(LEXIS,"^",4)
- . . . I $L(LEXCAT),LEXCE?7N,$L(LEXTX) D
- . . . . N LEX S LEX=LEXCE_"^"_LEXTX
- . . . . S:+($G(LEXNCD))>0 $P(LEX,"^",3)=+($G(LEXNCD))
- . . . . S ^TMP("LEXDX",$J,(LEXCAT_" "))="^"_LEX S LEXCT=LEXCT+1
- . . S LEXCT=LEXCT+1
- . I LEXPRE>3 S LEXLEN=LEXPRE,LEXPRE=LEXPRE-1 Q
- . S:LEXPRE=3 LEXIT=1
- S LEXC="" F S LEXC=$O(^TMP("LEXDX",$J,LEXC)) Q:'$L(LEXC) D
- . S LEXCT=$P($G(^TMP("LEXDX",$J,LEXC)),"^",4) Q:LEXCT'>0
- . N LEXCTL,LEXNXT,LEXCT S LEXCTL=$TR(LEXC," ") Q:'$L(LEXCTL)
- . S LEXNXT=$O(^TMP("LEXDX",$J,(LEXCTL_" "))) Q:'$L(LEXNXT)
- . K:$E(LEXNXT,1,$L(LEXCTL))=LEXCTL ^TMP("LEXDX",$J,(LEXCTL_" "))
- Q
- ARY ; Build Local Array
- N LEXC,LEXACT S LEXC="",LEXACT=0
- F S LEXC=$O(^TMP("LEXDX",$J,LEXC)) Q:'$L(LEXC) D
- . N LEXSIEN,LEXEIEN,LEXEXP,LEXCAT,LEXND,LEXD,LEXSO,LEXNC
- . S LEXND=$G(^TMP("LEXDX",$J,LEXC))
- . S LEXSIEN=+LEXND,LEXD=$P($P(LEXND,"^",2),".",1)
- . S LEXCAT=$P(LEXND,"^",3),LEXNC=$P(LEXND,"^",4)
- . S LEXEIEN=+($G(^LEX(757.02,+LEXSIEN,0)))
- . S LEXEXP=$G(^LEX(757.01,+LEXEIEN,0)),LEXSO=$$TM(LEXC)
- . I '$L(LEXCAT) Q:LEXSIEN'>0 Q:LEXEIEN'>0 Q:'$L(LEXEXP)
- . Q:($G(LEXCDT)?7N)&(LEXD'?7N) Q:'$D(LEXCDT)&(LEXD'?7N) Q:'$L(LEXSO)
- . I +LEXSIEN>0 D
- . . S LEXACT=LEXACT+1 S LEXA(LEXACT)=LEXSIEN_"^"_LEXSO_"^"_LEXD
- . . S LEXA(LEXACT,0)=+LEXEIEN_"^"_LEXEXP
- . I +LEXSIEN'>0,$L(LEXCAT) D
- . . N LEX S LEX="^"_LEXSO_"^"_LEXD
- . . S:+($G(LEXNC))>0 $P(LEX,"^",4)=+($G(LEXNC))
- . . S LEXACT=LEXACT+1 S LEXA(LEXACT)=LEX
- . . S LEXA(LEXACT,0)="^"_LEXCAT
- . S LEXA(0)=LEXACT
- S:+($G(LEXA(0)))'>0 LEXA(0)=-1 Q:+($G(LEXA(0)))'>0
- S:+($G(LEXUSE))>0&($G(LEXA(0))>0) $P(LEXA(0),"^",2)=1
- Q
- DXARY ; Build Output Array from Search Results
- N LEXOI,LEXC,LEXCO,LEXCT S LEXFI=+($G(LEXFI)) Q:"^80^"'[("^"_LEXFI_"^")
- S LEXCS=+($G(LEXCS)) Q:+LEXCS'>0 Q:"^1^30^"'[("^"_LEXCS_"^")
- K ^TMP("DIAGSRCH",$J) S (LEXCT,LEXOI)=0
- F S LEXOI=$O(LEXOUT(LEXOI)) Q:+LEXOI'>0 D
- . N LEXC,LEXI S LEXC=$P($G(LEXOUT(LEXOI)),"^",2) Q:'$L(LEXC)
- . S ^TMP("DIAGSRCH",$J,(LEXC_" "))=$G(LEXOUT(LEXOI))
- . S ^TMP("DIAGSRCH",$J,(LEXC_" "),0)=$G(LEXOUT(LEXOI,0))
- . Q:+($G(LEXCS))'=30 F LEXI=1:1:$L(LEXC) D
- . . Q
- . . N LEXS,LEXSD,LEXSI,LEXSN,LEXF,LEXFA S LEXS=$E(LEXC,1,($L(LEXC)-LEXI))
- . . Q:'$D(^LEX(757.033,"AFRAG",30,(LEXS_" ")))
- . . S LEXSD=$O(^LEX(757.033,"AFRAG",30,(LEXS_" "),0))
- . . Q:LEXSD'?7N Q:+($G(LEXVDT))<LEXSD
- . . S LEXSI=$O(^LEX(757.033,"AFRAG",30,(LEXS_" "),LEXSD,0))
- . . Q:+LEXSI'>0 S LEXSN=$$LN(+LEXSI)
- . . S:'$L(LEXSN) LEXSN=$$SN(+LEXSI) Q:'$L(LEXSN)
- . . S ^TMP("DIAGSRCH",$J,(LEXS_" "))="-^"_LEXS_"^"_LEXSD
- . . S ^TMP("DIAGSRCH",$J,(LEXS_" "),0)="-^"_LEXSN
- K LEXOUT S LEXCO="" F S LEXCO=$O(^TMP("DIAGSRCH",$J,LEXCO)) Q:'$L(LEXCO) D
- . N LEXC,LEXEFF,LEXEIEN,LEXEXP,LEXI,LEXICD,LEXICDT,LEXLD,LEXLDE
- . N LEXN1,LEXN2,LEXND,LEXO,LEXP1,LEXP2,LEXP3,LEXPF,LEXPR,LEXS
- . N LEXSD,LEXSDE,LEXSIEN,LEXSY,LEXMSG
- . S LEXN1=$G(^TMP("DIAGSRCH",$J,LEXCO))
- . S LEXN2=$G(^TMP("DIAGSRCH",$J,LEXCO,0))
- . S LEXSIEN=+LEXN1,LEXEIEN=+LEXN2
- . S LEXC=$P(LEXN1,"^",2),LEXEFF=$P(LEXN1,"^",3)
- . S LEXMSG=$$MSG(LEXC)
- . S LEXEXP=$P(LEXN2,"^",2)
- . I LEXSIEN'>0,LEXEIEN'>0 D Q
- . . N LEXO,LEXC,LEXE,LEXT,LEXN,LEXNC,LEXMSG
- . . S LEXC=$P(LEXN1,"^",2) Q:'$L(LEXC)
- . . S LEXE=$P(LEXN1,"^",3) Q:LEXE'?7N
- . . S LEXNC=$P(LEXN1,"^",4)
- . . S LEXNC=$S(+LEXNC>0:+LEXNC,1:"")
- . . S LEXN=$P(LEXN2,"^",2) Q:'$L(LEXN)
- . . S LEXT="CAT"
- . . S LEXO=$O(LEXDATA(" "),-1)+1
- . . S LEXDATA(LEXO,0)=LEXC_$S($G(LEXEFF)?7N:("^"_LEXEFF),1:"")
- . . S:+LEXNC>0 $P(LEXDATA(LEXO,0),"^",3)=+LEXNC
- . . S LEXDATA(LEXO,LEXT)=LEXN
- . . S LEXDATA(LEXO,"MENU")=LEXN
- . . S:$L($G(LEXMSG)) LEXDATA(LEXO,"MSG")=$G(LEXMSG)
- . I LEXCS=1!(LEXCS=30) D
- . . S LEXICD=$$ICDDX^ICDEX(LEXC,LEXVDT,LEXCS,"E") S (LEXSD,LEXLD)=""
- . . S:+LEXICD>0 LEXSD=$$SD^ICDEX(80,+LEXICD,LEXVDT,.LEXSD)
- . . I LEXVDT'?7N,$P(LEXSD,"^",1)="-1" D
- . . . N LEXSH,LEXT,LEXE S LEXT=$$SDH^ICDEX(80,+LEXICD,.LEXSH)
- . . . S LEXE=$O(LEXSH(9999999),-1),LEXS=$G(LEXSH(+LEXE)) S:$L(LEXS) LEXSD=LEXS
- . . . S:+($G(LEXSH(0)))>0 LEXSD(0)=$P($G(LEXSH(0)),"^",1,2)
- . . S LEXSDE=$P($G(LEXSD(0)),"^",2) S:LEXSDE'?7N LEXSDE="" S LEXLD=""
- . . S:+LEXICD>0 LEXLD=$$LD^ICDEX(80,+LEXICD,LEXVDT,.LEXLD)
- . . I LEXVDT'?7N,$P(LEXLD,"^",1)="-1" D
- . . . N LEXLH,LEXT,LEXE S LEXT=$$LDH^ICDEX(80,+LEXICD,.LEXLH)
- . . . S LEXE=$O(LEXLH(9999999),-1),LEXS=$G(LEXLH(+LEXE)) S:$L(LEXS) LEXLD=LEXS
- . . . S:+($G(LEXLH(0)))>0 LEXLD(0)=$P($G(LEXLH(0)),"^",1,2)
- . . S LEXLDE=$P($G(LEXLD(0)),"^",2) S:LEXLDE'?7N LEXLDE=""
- . . S:$E(LEXLD,1,2)="-1" LEXLD=""
- . S:LEXSIEN>0&(+LEXEIEN>0) LEXCT=+($G(LEXCT))+1
- . S LEXO=$O(LEXDATA(" "),-1)+1,LEXDATA(LEXO,0)=LEXC
- . I $D(LEXINC) D
- . . S:+LEXSIEN>0 $P(LEXDATA(LEXO,0),"^",2)=+LEXSIEN
- . . S:+LEXSIEN>0&(LEXEFF?7N) $P(LEXDATA(LEXO,0),"^",3)=LEXEFF
- . I '$D(LEXINC) D
- . . S:+LEXSIEN>0&(LEXEFF?7N) $P(LEXDATA(LEXO,0),"^",2)=LEXEFF
- . S (LEXDATA(LEXO,"LEX"),LEXDATA(LEXO,"MENU"))=LEXEXP
- . S:$L($G(LEXMSG)) LEXDATA(LEXO,"MSG")=$G(LEXMSG)
- . S:+LEXEIEN>0 LEXDATA(LEXO,"LEX",1)=+LEXEIEN
- . S:+LEXEIEN>0&(LEXEFF?7N) $P(LEXDATA(LEXO,"LEX",1),"^",2)=LEXEFF
- . S LEXICDT="" S:$L($G(LEXSD)) LEXDATA(LEXO,"IDS")=LEXSD
- . S:$L($G(LEXSD))&(+LEXICD>0) $P(LEXICDT,"^",1)=+LEXICD
- . S:$L($G(LEXSD))&(+LEXICD>0)&(LEXSDE?7N) $P(LEXICDT,"^",2)=+LEXSDE
- . S:$L(LEXICDT) LEXDATA(LEXO,"IDS",1)=LEXICDT
- . S LEXICDT="" S:$L($G(LEXLD)) LEXDATA(LEXO,"IDL")=LEXLD
- . S:$L($G(LEXLD))&(+LEXICD>0) $P(LEXICDT,"^",1)=+LEXICD
- . S:$L($G(LEXLD))&(+LEXICD>0)&(LEXLDE?7N) $P(LEXICDT,"^",2)=+LEXLDE
- . S:$L(LEXICDT) LEXDATA(LEXO,"IDL",1)=LEXICDT
- . S LEXDATA(0)=+($G(LEXCT))
- . S:+($G(LEXPR))>0 $P(LEXDATA(0),"^",2)=+($G(LEXPR))
- . S LEXSY="" D GETSYN^LEXTRAN1("10D",LEXC,LEXVDT,"LEXSY",1)
- . S LEXPF=$G(LEXSY("P")),LEXP1=$P(LEXPF,"^",1),LEXP2=$P(LEXPF,"^",2)
- . S LEXP3=$P(LEXPF,"^",3) I $L(LEXP1),+LEXP2>0 D
- . . S LEXDATA(LEXO,"LEX")=$P(LEXPF,"^",1)
- . . S:LEXP2>0 $P(LEXDATA(LEXO,"LEX",1),"^",1)=LEXP2
- . . S:LEXP3>0 $P(LEXDATA(LEXO,"LEX",1),"^",2)=LEXP3
- . S LEXI=0 F S LEXI=$O(LEXSY("S",LEXI)) Q:+LEXI'>0 D
- . . N LEXS,LEXND,LEXP1,LEXP2 S LEXND=$G(LEXSY("S",LEXI))
- . . S LEXP1=$P(LEXND,"^",1),LEXP2=+($P(LEXND,"^",2)) Q:LEXP2'>0
- . . Q:'$L(LEXP1) S LEXS=$O(LEXDATA(LEXO,"SYN"," "),-1)+1
- . . S LEXDATA(LEXO,"SYN",LEXS)=LEXND
- . . S LEXDATA(LEXO,"SYN",0)=+LEXS
- S:$O(LEXDATA(" "),-1)>0 LEXDATA(0)=$O(LEXDATA(" "),-1)
- K ^TMP("DIAGSRCH",$J)
- Q
- ;
- ; Miscellaneous
- ISCAT(CODE) ; Is Code a Category
- ;
- ; Input
- ;
- ; CODE Code or Category
- ;
- ; Output
- ;
- ; $$ISCAT 4 Piece "^" Delimited String
- ;
- ; 1 Category flag
- ; 1 CODE is a Category
- ; 0 CODE is not a Category
- ;
- ; 2 Number of Sub-Categories belonging
- ; to the Category
- ;
- ; 3 Number of Codes belonging to the
- ; Category
- ;
- ; 4 Parent Category
- ; Parent Category
- ; Null if no Parent Category
- ;
- N CATS,PAR S CODE=$P($G(CODE),"^",1) Q:'$L(CODE) 0
- S:$L(CODE)=3&(CODE'[".") CODE=CODE_"."
- Q:$L(CODE)>3&(CODE'[".") 0
- S CATS=$$INC(CODE),PAR=$$PAR(CODE)
- Q:$D(^LEX(757.033,"AFRAG",30,(CODE_" "))) ("1^"_CATS_"^"_PAR)
- Q 0
- INC(X) ; Category includes Cat/Codes
- ;
- ; Input
- ;
- ; CODE Code or Category
- ;
- ; Output
- ;
- ; $$INC 2 Piece "^" Delimited String
- ;
- ; 1 Number of Sub-Categories belonging
- ; to the Category
- ;
- ; 2 Number of Codes belonging to the
- ; Category
- ;
- Q ($$CATS($G(X))_"^"_$$CODES($G(X)))
- CATS(X) ; Number of Categories in a Category
- ;
- ; Input
- ;
- ; X Category
- ;
- ; Output
- ;
- ; $$CATS Number of Sub-Categories belonging to a Category
- ;
- N CODE,ORG,ORD,CTL S (CTL,CODE)=$G(X),(ORG,ORD)=$E(CODE,1,($L(CODE)-1))_$C($A($E(CODE,$L(CODE)))-1)_"~"
- S X=0 F S ORD=$O(^LEX(757.033,"AFRAG",30,ORD)) Q:'$L(ORD)!(ORD'[CTL) S:ORD'=(CODE_" ") X=X+1
- Q X
- PAR(X) ; Parent Category
- N INP,PSN,EXIT,PAR S INP=$G(X),EXIT=0,PAR=""
- F PSN=$L(INP):-1:4 D Q:EXIT Q:$L($G(PAR))
- . N STR S STR=$E(INP,1,PSN) Q:$L(STR)'<$L(INP) Q:$L(STR)'>3
- . Q:'$D(^LEX(757.033,"AFRAG",30,(STR_" ")))
- . S PAR=STR,EXIT=1
- S X=$S($L(PAR):PAR,1:"")
- Q X
- CODES(X) ; Number of Codes in a Category
- ;
- ; Input
- ;
- ; X Category
- ;
- ; Output
- ;
- ; $$CODES Number of codes belonging to a Category
- ;
- N CODE,ORG,ORD,CTL S (CTL,CODE)=$G(X),(ORG,ORD)=$E(CODE,1,($L(CODE)-1))_$C($A($E(CODE,$L(CODE)))-1)_"~"
- S X=0 F S ORD=$O(^LEX(757.02,"ADX",ORD)) Q:'$L(ORD)!(ORD'[CTL) S:ORD'=(CODE_" ") X=X+1
- Q X
- CAT(CODE) ; Get Category for Code
- ;
- ; Input
- ;
- ; CODE Code or Category
- ;
- ; Output
- ;
- ; $$CAT 3 Piece "^" Delimited String
- ;
- ; 1 Category
- ; 2 Effective Date
- ; 3 Category Name
- ;
- ; Null on error
- ;
- S CODE=$G(CODE) Q:'$L(CODE) "" N FRAG,MAX,OUT,TDT,LEN S FRAG=$TR(CODE," ","")
- S OUT="",TDT=$P($G(LEXVDT),".",1),MAX=$L(FRAG) F LEN=MAX:-1:3 D Q:$L(OUT)
- . N EFF,NAM,IEN S FRAG=$E(FRAG,1,(LEN-1))
- . S:$L(FRAG)=3&(FRAG'[".") FRAG=FRAG_"." Q:$L(FRAG)'>3
- . S EFF=$O(^LEX(757.033,"AFRAG",30,(FRAG_" ")," "),-1)
- . S:TDT?7N EFF=$O(^LEX(757.033,"AFRAG",30,(FRAG_" "),(TDT+.0001)),-1)
- . S EFF=$P(EFF,".",1) Q:EFF'?7N I TDT?7N Q:EFF>TDT
- . S IEN=$O(^LEX(757.033,"AFRAG",30,(FRAG_" "),+EFF," "),-1)
- . S NAM=$$LN(IEN,+EFF) S:'$L(NAM) NAM=$$SN(IEN,+EFF) Q:'$L(NAM)
- . S:$L(FRAG)&(EFF?7N)&($L(NAM)) OUT=(FRAG_"^"_EFF_"^"_NAM)
- Q OUT
- MSG(X) ; Message for Unversioned Search
- N LEXCODE,LEXIA,LEXAC,LEXPD,LEXTD S LEXTD=$$DT^XLFDT,LEXCODE=$TR(X," ","")
- S:$G(LEXCDT)?7N&($G(LEXCDT)'=LEXTD) LEXTD=$G(LEXCDT)
- I $G(LEXCDT)="" S:$G(LEXVDT)?7N&($G(LEXVDT)'=LEXTD) LEXTD=$G(LEXVDT)
- Q:'$L(LEXCODE) "" Q:'$D(^LEX(757.02,"ACT",(LEXCODE_" "))) ""
- S LEXIA=$O(^LEX(757.02,"ACT",(LEXCODE_" "),2,(LEXTD+.0001)),-1)
- S LEXAC=$O(^LEX(757.02,"ACT",(LEXCODE_" "),3,(LEXTD-.0001)),-1)
- S LEXPD=$O(^LEX(757.02,"ACT",(LEXCODE_" "),3,(LEXTD)))
- I LEXIA?7N,LEXAC?7N,LEXIA>LEXAC D Q X
- . S X="Inactive "_$$FMTE^XLFDT(LEXIA,"5Z")
- I LEXAC'=LEXTD,LEXPD?7N,LEXPD>LEXTD D Q X
- . S X="Pending "_$$FMTE^XLFDT(LEXPD,"5Z")
- Q ""
- SN(X,EFF) ; Short Name
- N IEN,CDT,IMP,EFF,HIS S IEN=+($G(X)),CDT=$G(LEXVDT) S:$G(EFF)?7N CDT=$G(EFF)
- S IMP=$$IMPDATE^LEXU(30) S:CDT'?7N CDT=$$DT^XLFDT
- S:CDT'>IMP&(IMP?7N) CDT=IMP
- S EFF=$O(^LEX(757.033,+IEN,2,"B",(CDT+.001)),-1)
- S HIS=$O(^LEX(757.033,+IEN,2,"B",+EFF," "),-1)
- S X=$G(^LEX(757.033,+IEN,2,+HIS,1))
- Q X
- LN(X,EFF) ; Long Name
- N IEN,CDT,IMP,EFF,HIS S IEN=+($G(X)),CDT=$G(LEXVDT) S:$G(EFF)?7N CDT=$G(EFF)
- S IMP=$$IMPDATE^LEXU(30) S:CDT'?7N CDT=$$DT^XLFDT
- S:CDT'>IMP&(IMP?7N) CDT=IMP
- S EFF=$O(^LEX(757.033,+IEN,3,"B",(CDT+.001)),-1)
- S HIS=$O(^LEX(757.033,+IEN,3,"B",+EFF," "),-1)
- S X=$G(^LEX(757.033,+IEN,3,+HIS,1))
- Q X
- SCR(X,Y) ; Screen
- S Y=+($G(Y)) Q:+Y'>0 0 Q:'$D(^LEX(757.01,+Y,0)) 0
- N LEXFIL S LEXFIL=$G(X) Q:'$L(LEXFIL) 1 D ^DIM Q:'$D(X) 1
- X LEXFIL S X=$T
- Q X
- SH ; Show TMP
- N LEXNN,LEXNC S LEXNN="^TMP(""LEXDX"","_$J_")",LEXNC="^TMP(""LEXDX"","_$J_","
- W !!,"3",! F S LEXNN=$q(@LEXNN) Q:'$L(LEXNN)!(LEXNN'[LEXNC) W !,LEXNN,"=",@LEXNN
- Q
- PT ; Entry point where DA is defined and X is unknown
- Q:'$D(DA) S X=^LEX(757.01,DA,0)
- PTX ; Entry point to parse string (X must exist)
- N LEXOK,LEXTOKS,LEXTOKS2,LEXTOKI,LEXTOKW,LEXTOLKN,LEXOKC,LEXOKN,LEXOKP,LEXTOKAA,LEXTOKAB,LEXTOKAC K ^TMP("LEXTKN",$J) N DA
- Q
- 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
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HLEX10DU 13470 printed Feb 18, 2025@23:29:35 Page 2
- LEX10DU ;ISL/KER - ICD-10 Diagnosis Utilities ;04/21/2014
- +1 ;;2.0;LEXICON UTILITY;**80**;Sep 23, 1996;Build 1
- +2 ;
- +3 ; Global Variables
- +4 ; ^LEX(757.033 N/A
- +5 ; ^TMP("DIAGSRCH" SACC 2.3.2.5.1
- +6 ; ^TMP("LEXDX") SACC 2.3.2.5.1
- +7 ; ^TMP("LEXTKN" SACC 2.3.2.5.1
- +8 ;
- +9 ; External References
- +10 ; ^DIM ICR 10016
- +11 ; $$ICDDX^ICDEX ICR 5747
- +12 ; $$LD^ICDEX ICR 5747
- +13 ; $$SD^ICDEX ICR 5747
- +14 ; $$DT^XLFDT ICR 10103
- +15 ;
- +16 ; Local Variables NEWed or KILLed by calling
- +17 ; routine LEX10DBT, LEX10DBC or LEX10CS
- +18 ; LEXA
- +19 ; LEXCS
- +20 ; LEXDATA
- +21 ; LEXFI
- +22 ; LEXINC
- +23 ; LEXVDT
- +24 ;
- +25 QUIT
- REDUCE(X) ; Reduce List
- +1 NEW LEXC,LEXIT,LEXLEN,LEXMAX,LEXPRE,LEXUSE
- +2 SET LEXUSE=0
- SET LEXLEN=8
- SET LEXPRE=7
- SET LEXMAX=+($GET(X))
- +3 if LEXMAX'>0
- SET LEXMAX=30
- SET LEXCT=+($GET(LEXCT))
- if +LEXCT'>0
- QUIT
- +4 SET LEXIT=0
- FOR
- if LEXCT'>LEXMAX!(LEXIT)
- QUIT
- Begin DoDot:1
- +5 if LEXPRE=LEXLEN
- SET LEXIT=1
- if LEXIT
- QUIT
- +6 NEW LEXC
- SET LEXC=""
- SET LEXCT=0
- +7 FOR
- SET LEXC=$ORDER(^TMP("LEXDX",$JOB,LEXC))
- if '$LENGTH(LEXC)
- QUIT
- Begin DoDot:2
- +8 IF $LENGTH(LEXC)=(LEXLEN+1)
- Begin DoDot:3
- +9 NEW LEXCAT,LEXIS,LEXNCT,LEXNCD,LEXNPR,LEXCE,LEXTX
- +10 SET LEXCAT=$$CAT(LEXC)
- SET LEXCE=$PIECE(LEXCAT,"^",2)
- +11 SET LEXTX=$PIECE(LEXCAT,"^",3)
- SET LEXCAT=$PIECE(LEXCAT,"^",1)
- +12 KILL ^TMP("LEXDX",$JOB,LEXC)
- SET LEXUSE=1
- +13 if $DATA(^TMP("LEXDX",$JOB,(LEXCAT_" ")))
- QUIT
- +14 SET LEXIS=$$ISCAT(LEXCAT)
- +15 SET LEXNCT=$PIECE(LEXIS,"^",2)
- +16 SET LEXNCD=$PIECE(LEXIS,"^",3)
- +17 SET LEXNPR=$PIECE(LEXIS,"^",4)
- +18 IF $LENGTH(LEXCAT)
- IF LEXCE?7N
- IF $LENGTH(LEXTX)
- Begin DoDot:4
- +19 NEW LEX
- SET LEX=LEXCE_"^"_LEXTX
- +20 if +($GET(LEXNCD))>0
- SET $PIECE(LEX,"^",3)=+($GET(LEXNCD))
- +21 SET ^TMP("LEXDX",$JOB,(LEXCAT_" "))="^"_LEX
- SET LEXCT=LEXCT+1
- End DoDot:4
- End DoDot:3
- QUIT
- +22 SET LEXCT=LEXCT+1
- End DoDot:2
- +23 IF LEXPRE>3
- SET LEXLEN=LEXPRE
- SET LEXPRE=LEXPRE-1
- QUIT
- +24 if LEXPRE=3
- SET LEXIT=1
- End DoDot:1
- if LEXIT
- QUIT
- +25 SET LEXC=""
- FOR
- SET LEXC=$ORDER(^TMP("LEXDX",$JOB,LEXC))
- if '$LENGTH(LEXC)
- QUIT
- Begin DoDot:1
- +26 SET LEXCT=$PIECE($GET(^TMP("LEXDX",$JOB,LEXC)),"^",4)
- if LEXCT'>0
- QUIT
- +27 NEW LEXCTL,LEXNXT,LEXCT
- SET LEXCTL=$TRANSLATE(LEXC," ")
- if '$LENGTH(LEXCTL)
- QUIT
- +28 SET LEXNXT=$ORDER(^TMP("LEXDX",$JOB,(LEXCTL_" ")))
- if '$LENGTH(LEXNXT)
- QUIT
- +29 if $EXTRACT(LEXNXT,1,$LENGTH(LEXCTL))=LEXCTL
- KILL ^TMP("LEXDX",$JOB,(LEXCTL_" "))
- End DoDot:1
- +30 QUIT
- ARY ; Build Local Array
- +1 NEW LEXC,LEXACT
- SET LEXC=""
- SET LEXACT=0
- +2 FOR
- SET LEXC=$ORDER(^TMP("LEXDX",$JOB,LEXC))
- if '$LENGTH(LEXC)
- QUIT
- Begin DoDot:1
- +3 NEW LEXSIEN,LEXEIEN,LEXEXP,LEXCAT,LEXND,LEXD,LEXSO,LEXNC
- +4 SET LEXND=$GET(^TMP("LEXDX",$JOB,LEXC))
- +5 SET LEXSIEN=+LEXND
- SET LEXD=$PIECE($PIECE(LEXND,"^",2),".",1)
- +6 SET LEXCAT=$PIECE(LEXND,"^",3)
- SET LEXNC=$PIECE(LEXND,"^",4)
- +7 SET LEXEIEN=+($GET(^LEX(757.02,+LEXSIEN,0)))
- +8 SET LEXEXP=$GET(^LEX(757.01,+LEXEIEN,0))
- SET LEXSO=$$TM(LEXC)
- +9 IF '$LENGTH(LEXCAT)
- if LEXSIEN'>0
- QUIT
- if LEXEIEN'>0
- QUIT
- if '$LENGTH(LEXEXP)
- QUIT
- +10 if ($GET(LEXCDT)?7N)&(LEXD'?7N)
- QUIT
- if '$DATA(LEXCDT)&(LEXD'?7N)
- QUIT
- if '$LENGTH(LEXSO)
- QUIT
- +11 IF +LEXSIEN>0
- Begin DoDot:2
- +12 SET LEXACT=LEXACT+1
- SET LEXA(LEXACT)=LEXSIEN_"^"_LEXSO_"^"_LEXD
- +13 SET LEXA(LEXACT,0)=+LEXEIEN_"^"_LEXEXP
- End DoDot:2
- +14 IF +LEXSIEN'>0
- IF $LENGTH(LEXCAT)
- Begin DoDot:2
- +15 NEW LEX
- SET LEX="^"_LEXSO_"^"_LEXD
- +16 if +($GET(LEXNC))>0
- SET $PIECE(LEX,"^",4)=+($GET(LEXNC))
- +17 SET LEXACT=LEXACT+1
- SET LEXA(LEXACT)=LEX
- +18 SET LEXA(LEXACT,0)="^"_LEXCAT
- End DoDot:2
- +19 SET LEXA(0)=LEXACT
- End DoDot:1
- +20 if +($GET(LEXA(0)))'>0
- SET LEXA(0)=-1
- if +($GET(LEXA(0)))'>0
- QUIT
- +21 if +($GET(LEXUSE))>0&($GET(LEXA(0))>0)
- SET $PIECE(LEXA(0),"^",2)=1
- +22 QUIT
- DXARY ; Build Output Array from Search Results
- +1 NEW LEXOI,LEXC,LEXCO,LEXCT
- SET LEXFI=+($GET(LEXFI))
- if "^80^"'[("^"_LEXFI_"^")
- QUIT
- +2 SET LEXCS=+($GET(LEXCS))
- if +LEXCS'>0
- QUIT
- if "^1^30^"'[("^"_LEXCS_"^")
- QUIT
- +3 KILL ^TMP("DIAGSRCH",$JOB)
- SET (LEXCT,LEXOI)=0
- +4 FOR
- SET LEXOI=$ORDER(LEXOUT(LEXOI))
- if +LEXOI'>0
- QUIT
- Begin DoDot:1
- +5 NEW LEXC,LEXI
- SET LEXC=$PIECE($GET(LEXOUT(LEXOI)),"^",2)
- if '$LENGTH(LEXC)
- QUIT
- +6 SET ^TMP("DIAGSRCH",$JOB,(LEXC_" "))=$GET(LEXOUT(LEXOI))
- +7 SET ^TMP("DIAGSRCH",$JOB,(LEXC_" "),0)=$GET(LEXOUT(LEXOI,0))
- +8 if +($GET(LEXCS))'=30
- QUIT
- FOR LEXI=1:1:$LENGTH(LEXC)
- Begin DoDot:2
- +9 QUIT
- +10 NEW LEXS,LEXSD,LEXSI,LEXSN,LEXF,LEXFA
- SET LEXS=$EXTRACT(LEXC,1,($LENGTH(LEXC)-LEXI))
- +11 if '$DATA(^LEX(757.033,"AFRAG",30,(LEXS_" ")))
- QUIT
- +12 SET LEXSD=$ORDER(^LEX(757.033,"AFRAG",30,(LEXS_" "),0))
- +13 if LEXSD'?7N
- QUIT
- if +($GET(LEXVDT))<LEXSD
- QUIT
- +14 SET LEXSI=$ORDER(^LEX(757.033,"AFRAG",30,(LEXS_" "),LEXSD,0))
- +15 if +LEXSI'>0
- QUIT
- SET LEXSN=$$LN(+LEXSI)
- +16 if '$LENGTH(LEXSN)
- SET LEXSN=$$SN(+LEXSI)
- if '$LENGTH(LEXSN)
- QUIT
- +17 SET ^TMP("DIAGSRCH",$JOB,(LEXS_" "))="-^"_LEXS_"^"_LEXSD
- +18 SET ^TMP("DIAGSRCH",$JOB,(LEXS_" "),0)="-^"_LEXSN
- End DoDot:2
- End DoDot:1
- +19 KILL LEXOUT
- SET LEXCO=""
- FOR
- SET LEXCO=$ORDER(^TMP("DIAGSRCH",$JOB,LEXCO))
- if '$LENGTH(LEXCO)
- QUIT
- Begin DoDot:1
- +20 NEW LEXC,LEXEFF,LEXEIEN,LEXEXP,LEXI,LEXICD,LEXICDT,LEXLD,LEXLDE
- +21 NEW LEXN1,LEXN2,LEXND,LEXO,LEXP1,LEXP2,LEXP3,LEXPF,LEXPR,LEXS
- +22 NEW LEXSD,LEXSDE,LEXSIEN,LEXSY,LEXMSG
- +23 SET LEXN1=$GET(^TMP("DIAGSRCH",$JOB,LEXCO))
- +24 SET LEXN2=$GET(^TMP("DIAGSRCH",$JOB,LEXCO,0))
- +25 SET LEXSIEN=+LEXN1
- SET LEXEIEN=+LEXN2
- +26 SET LEXC=$PIECE(LEXN1,"^",2)
- SET LEXEFF=$PIECE(LEXN1,"^",3)
- +27 SET LEXMSG=$$MSG(LEXC)
- +28 SET LEXEXP=$PIECE(LEXN2,"^",2)
- +29 IF LEXSIEN'>0
- IF LEXEIEN'>0
- Begin DoDot:2
- +30 NEW LEXO,LEXC,LEXE,LEXT,LEXN,LEXNC,LEXMSG
- +31 SET LEXC=$PIECE(LEXN1,"^",2)
- if '$LENGTH(LEXC)
- QUIT
- +32 SET LEXE=$PIECE(LEXN1,"^",3)
- if LEXE'?7N
- QUIT
- +33 SET LEXNC=$PIECE(LEXN1,"^",4)
- +34 SET LEXNC=$SELECT(+LEXNC>0:+LEXNC,1:"")
- +35 SET LEXN=$PIECE(LEXN2,"^",2)
- if '$LENGTH(LEXN)
- QUIT
- +36 SET LEXT="CAT"
- +37 SET LEXO=$ORDER(LEXDATA(" "),-1)+1
- +38 SET LEXDATA(LEXO,0)=LEXC_$SELECT($GET(LEXEFF)?7N:("^"_LEXEFF),1:"")
- +39 if +LEXNC>0
- SET $PIECE(LEXDATA(LEXO,0),"^",3)=+LEXNC
- +40 SET LEXDATA(LEXO,LEXT)=LEXN
- +41 SET LEXDATA(LEXO,"MENU")=LEXN
- +42 if $LENGTH($GET(LEXMSG))
- SET LEXDATA(LEXO,"MSG")=$GET(LEXMSG)
- End DoDot:2
- QUIT
- +43 IF LEXCS=1!(LEXCS=30)
- Begin DoDot:2
- +44 SET LEXICD=$$ICDDX^ICDEX(LEXC,LEXVDT,LEXCS,"E")
- SET (LEXSD,LEXLD)=""
- +45 if +LEXICD>0
- SET LEXSD=$$SD^ICDEX(80,+LEXICD,LEXVDT,.LEXSD)
- +46 IF LEXVDT'?7N
- IF $PIECE(LEXSD,"^",1)="-1"
- Begin DoDot:3
- +47 NEW LEXSH,LEXT,LEXE
- SET LEXT=$$SDH^ICDEX(80,+LEXICD,.LEXSH)
- +48 SET LEXE=$ORDER(LEXSH(9999999),-1)
- SET LEXS=$GET(LEXSH(+LEXE))
- if $LENGTH(LEXS)
- SET LEXSD=LEXS
- +49 if +($GET(LEXSH(0)))>0
- SET LEXSD(0)=$PIECE($GET(LEXSH(0)),"^",1,2)
- End DoDot:3
- +50 SET LEXSDE=$PIECE($GET(LEXSD(0)),"^",2)
- if LEXSDE'?7N
- SET LEXSDE=""
- SET LEXLD=""
- +51 if +LEXICD>0
- SET LEXLD=$$LD^ICDEX(80,+LEXICD,LEXVDT,.LEXLD)
- +52 IF LEXVDT'?7N
- IF $PIECE(LEXLD,"^",1)="-1"
- Begin DoDot:3
- +53 NEW LEXLH,LEXT,LEXE
- SET LEXT=$$LDH^ICDEX(80,+LEXICD,.LEXLH)
- +54 SET LEXE=$ORDER(LEXLH(9999999),-1)
- SET LEXS=$GET(LEXLH(+LEXE))
- if $LENGTH(LEXS)
- SET LEXLD=LEXS
- +55 if +($GET(LEXLH(0)))>0
- SET LEXLD(0)=$PIECE($GET(LEXLH(0)),"^",1,2)
- End DoDot:3
- +56 SET LEXLDE=$PIECE($GET(LEXLD(0)),"^",2)
- if LEXLDE'?7N
- SET LEXLDE=""
- +57 if $EXTRACT(LEXLD,1,2)="-1"
- SET LEXLD=""
- End DoDot:2
- +58 if LEXSIEN>0&(+LEXEIEN>0)
- SET LEXCT=+($GET(LEXCT))+1
- +59 SET LEXO=$ORDER(LEXDATA(" "),-1)+1
- SET LEXDATA(LEXO,0)=LEXC
- +60 IF $DATA(LEXINC)
- Begin DoDot:2
- +61 if +LEXSIEN>0
- SET $PIECE(LEXDATA(LEXO,0),"^",2)=+LEXSIEN
- +62 if +LEXSIEN>0&(LEXEFF?7N)
- SET $PIECE(LEXDATA(LEXO,0),"^",3)=LEXEFF
- End DoDot:2
- +63 IF '$DATA(LEXINC)
- Begin DoDot:2
- +64 if +LEXSIEN>0&(LEXEFF?7N)
- SET $PIECE(LEXDATA(LEXO,0),"^",2)=LEXEFF
- End DoDot:2
- +65 SET (LEXDATA(LEXO,"LEX"),LEXDATA(LEXO,"MENU"))=LEXEXP
- +66 if $LENGTH($GET(LEXMSG))
- SET LEXDATA(LEXO,"MSG")=$GET(LEXMSG)
- +67 if +LEXEIEN>0
- SET LEXDATA(LEXO,"LEX",1)=+LEXEIEN
- +68 if +LEXEIEN>0&(LEXEFF?7N)
- SET $PIECE(LEXDATA(LEXO,"LEX",1),"^",2)=LEXEFF
- +69 SET LEXICDT=""
- if $LENGTH($GET(LEXSD))
- SET LEXDATA(LEXO,"IDS")=LEXSD
- +70 if $LENGTH($GET(LEXSD))&(+LEXICD>0)
- SET $PIECE(LEXICDT,"^",1)=+LEXICD
- +71 if $LENGTH($GET(LEXSD))&(+LEXICD>0)&(LEXSDE?7N)
- SET $PIECE(LEXICDT,"^",2)=+LEXSDE
- +72 if $LENGTH(LEXICDT)
- SET LEXDATA(LEXO,"IDS",1)=LEXICDT
- +73 SET LEXICDT=""
- if $LENGTH($GET(LEXLD))
- SET LEXDATA(LEXO,"IDL")=LEXLD
- +74 if $LENGTH($GET(LEXLD))&(+LEXICD>0)
- SET $PIECE(LEXICDT,"^",1)=+LEXICD
- +75 if $LENGTH($GET(LEXLD))&(+LEXICD>0)&(LEXLDE?7N)
- SET $PIECE(LEXICDT,"^",2)=+LEXLDE
- +76 if $LENGTH(LEXICDT)
- SET LEXDATA(LEXO,"IDL",1)=LEXICDT
- +77 SET LEXDATA(0)=+($GET(LEXCT))
- +78 if +($GET(LEXPR))>0
- SET $PIECE(LEXDATA(0),"^",2)=+($GET(LEXPR))
- +79 SET LEXSY=""
- DO GETSYN^LEXTRAN1("10D",LEXC,LEXVDT,"LEXSY",1)
- +80 SET LEXPF=$GET(LEXSY("P"))
- SET LEXP1=$PIECE(LEXPF,"^",1)
- SET LEXP2=$PIECE(LEXPF,"^",2)
- +81 SET LEXP3=$PIECE(LEXPF,"^",3)
- IF $LENGTH(LEXP1)
- IF +LEXP2>0
- Begin DoDot:2
- +82 SET LEXDATA(LEXO,"LEX")=$PIECE(LEXPF,"^",1)
- +83 if LEXP2>0
- SET $PIECE(LEXDATA(LEXO,"LEX",1),"^",1)=LEXP2
- +84 if LEXP3>0
- SET $PIECE(LEXDATA(LEXO,"LEX",1),"^",2)=LEXP3
- End DoDot:2
- +85 SET LEXI=0
- FOR
- SET LEXI=$ORDER(LEXSY("S",LEXI))
- if +LEXI'>0
- QUIT
- Begin DoDot:2
- +86 NEW LEXS,LEXND,LEXP1,LEXP2
- SET LEXND=$GET(LEXSY("S",LEXI))
- +87 SET LEXP1=$PIECE(LEXND,"^",1)
- SET LEXP2=+($PIECE(LEXND,"^",2))
- if LEXP2'>0
- QUIT
- +88 if '$LENGTH(LEXP1)
- QUIT
- SET LEXS=$ORDER(LEXDATA(LEXO,"SYN"," "),-1)+1
- +89 SET LEXDATA(LEXO,"SYN",LEXS)=LEXND
- +90 SET LEXDATA(LEXO,"SYN",0)=+LEXS
- End DoDot:2
- End DoDot:1
- +91 if $ORDER(LEXDATA(" "),-1)>0
- SET LEXDATA(0)=$ORDER(LEXDATA(" "),-1)
- +92 KILL ^TMP("DIAGSRCH",$JOB)
- +93 QUIT
- +94 ;
- +95 ; Miscellaneous
- ISCAT(CODE) ; Is Code a Category
- +1 ;
- +2 ; Input
- +3 ;
- +4 ; CODE Code or Category
- +5 ;
- +6 ; Output
- +7 ;
- +8 ; $$ISCAT 4 Piece "^" Delimited String
- +9 ;
- +10 ; 1 Category flag
- +11 ; 1 CODE is a Category
- +12 ; 0 CODE is not a Category
- +13 ;
- +14 ; 2 Number of Sub-Categories belonging
- +15 ; to the Category
- +16 ;
- +17 ; 3 Number of Codes belonging to the
- +18 ; Category
- +19 ;
- +20 ; 4 Parent Category
- +21 ; Parent Category
- +22 ; Null if no Parent Category
- +23 ;
- +24 NEW CATS,PAR
- SET CODE=$PIECE($GET(CODE),"^",1)
- if '$LENGTH(CODE)
- QUIT 0
- +25 if $LENGTH(CODE)=3&(CODE'[".")
- SET CODE=CODE_"."
- +26 if $LENGTH(CODE)>3&(CODE'[".")
- QUIT 0
- +27 SET CATS=$$INC(CODE)
- SET PAR=$$PAR(CODE)
- +28 if $DATA(^LEX(757.033,"AFRAG",30,(CODE_" ")))
- QUIT ("1^"_CATS_"^"_PAR)
- +29 QUIT 0
- INC(X) ; Category includes Cat/Codes
- +1 ;
- +2 ; Input
- +3 ;
- +4 ; CODE Code or Category
- +5 ;
- +6 ; Output
- +7 ;
- +8 ; $$INC 2 Piece "^" Delimited String
- +9 ;
- +10 ; 1 Number of Sub-Categories belonging
- +11 ; to the Category
- +12 ;
- +13 ; 2 Number of Codes belonging to the
- +14 ; Category
- +15 ;
- +16 QUIT ($$CATS($GET(X))_"^"_$$CODES($GET(X)))
- CATS(X) ; Number of Categories in a Category
- +1 ;
- +2 ; Input
- +3 ;
- +4 ; X Category
- +5 ;
- +6 ; Output
- +7 ;
- +8 ; $$CATS Number of Sub-Categories belonging to a Category
- +9 ;
- +10 NEW CODE,ORG,ORD,CTL
- SET (CTL,CODE)=$GET(X)
- SET (ORG,ORD)=$EXTRACT(CODE,1,($LENGTH(CODE)-1))_$CHAR($ASCII($EXTRACT(CODE,$LENGTH(CODE)))-1)_"~"
- +11 SET X=0
- FOR
- SET ORD=$ORDER(^LEX(757.033,"AFRAG",30,ORD))
- if '$LENGTH(ORD)!(ORD'[CTL)
- QUIT
- if ORD'=(CODE_" ")
- SET X=X+1
- +12 QUIT X
- PAR(X) ; Parent Category
- +1 NEW INP,PSN,EXIT,PAR
- SET INP=$GET(X)
- SET EXIT=0
- SET PAR=""
- +2 FOR PSN=$LENGTH(INP):-1:4
- Begin DoDot:1
- +3 NEW STR
- SET STR=$EXTRACT(INP,1,PSN)
- if $LENGTH(STR)'<$LENGTH(INP)
- QUIT
- if $LENGTH(STR)'>3
- QUIT
- +4 if '$DATA(^LEX(757.033,"AFRAG",30,(STR_" ")))
- QUIT
- +5 SET PAR=STR
- SET EXIT=1
- End DoDot:1
- if EXIT
- QUIT
- if $LENGTH($GET(PAR))
- QUIT
- +6 SET X=$SELECT($LENGTH(PAR):PAR,1:"")
- +7 QUIT X
- CODES(X) ; Number of Codes in a Category
- +1 ;
- +2 ; Input
- +3 ;
- +4 ; X Category
- +5 ;
- +6 ; Output
- +7 ;
- +8 ; $$CODES Number of codes belonging to a Category
- +9 ;
- +10 NEW CODE,ORG,ORD,CTL
- SET (CTL,CODE)=$GET(X)
- SET (ORG,ORD)=$EXTRACT(CODE,1,($LENGTH(CODE)-1))_$CHAR($ASCII($EXTRACT(CODE,$LENGTH(CODE)))-1)_"~"
- +11 SET X=0
- FOR
- SET ORD=$ORDER(^LEX(757.02,"ADX",ORD))
- if '$LENGTH(ORD)!(ORD'[CTL)
- QUIT
- if ORD'=(CODE_" ")
- SET X=X+1
- +12 QUIT X
- CAT(CODE) ; Get Category for Code
- +1 ;
- +2 ; Input
- +3 ;
- +4 ; CODE Code or Category
- +5 ;
- +6 ; Output
- +7 ;
- +8 ; $$CAT 3 Piece "^" Delimited String
- +9 ;
- +10 ; 1 Category
- +11 ; 2 Effective Date
- +12 ; 3 Category Name
- +13 ;
- +14 ; Null on error
- +15 ;
- +16 SET CODE=$GET(CODE)
- if '$LENGTH(CODE)
- QUIT ""
- NEW FRAG,MAX,OUT,TDT,LEN
- SET FRAG=$TRANSLATE(CODE," ","")
- +17 SET OUT=""
- SET TDT=$PIECE($GET(LEXVDT),".",1)
- SET MAX=$LENGTH(FRAG)
- FOR LEN=MAX:-1:3
- Begin DoDot:1
- +18 NEW EFF,NAM,IEN
- SET FRAG=$EXTRACT(FRAG,1,(LEN-1))
- +19 if $LENGTH(FRAG)=3&(FRAG'[".")
- SET FRAG=FRAG_"."
- if $LENGTH(FRAG)'>3
- QUIT
- +20 SET EFF=$ORDER(^LEX(757.033,"AFRAG",30,(FRAG_" ")," "),-1)
- +21 if TDT?7N
- SET EFF=$ORDER(^LEX(757.033,"AFRAG",30,(FRAG_" "),(TDT+.0001)),-1)
- +22 SET EFF=$PIECE(EFF,".",1)
- if EFF'?7N
- QUIT
- IF TDT?7N
- if EFF>TDT
- QUIT
- +23 SET IEN=$ORDER(^LEX(757.033,"AFRAG",30,(FRAG_" "),+EFF," "),-1)
- +24 SET NAM=$$LN(IEN,+EFF)
- if '$LENGTH(NAM)
- SET NAM=$$SN(IEN,+EFF)
- if '$LENGTH(NAM)
- QUIT
- +25 if $LENGTH(FRAG)&(EFF?7N)&($LENGTH(NAM))
- SET OUT=(FRAG_"^"_EFF_"^"_NAM)
- End DoDot:1
- if $LENGTH(OUT)
- QUIT
- +26 QUIT OUT
- MSG(X) ; Message for Unversioned Search
- +1 NEW LEXCODE,LEXIA,LEXAC,LEXPD,LEXTD
- SET LEXTD=$$DT^XLFDT
- SET LEXCODE=$TRANSLATE(X," ","")
- +2 if $GET(LEXCDT)?7N&($GET(LEXCDT)'=LEXTD)
- SET LEXTD=$GET(LEXCDT)
- +3 IF $GET(LEXCDT)=""
- if $GET(LEXVDT)?7N&($GET(LEXVDT)'=LEXTD)
- SET LEXTD=$GET(LEXVDT)
- +4 if '$LENGTH(LEXCODE)
- QUIT ""
- if '$DATA(^LEX(757.02,"ACT",(LEXCODE_" ")))
- QUIT ""
- +5 SET LEXIA=$ORDER(^LEX(757.02,"ACT",(LEXCODE_" "),2,(LEXTD+.0001)),-1)
- +6 SET LEXAC=$ORDER(^LEX(757.02,"ACT",(LEXCODE_" "),3,(LEXTD-.0001)),-1)
- +7 SET LEXPD=$ORDER(^LEX(757.02,"ACT",(LEXCODE_" "),3,(LEXTD)))
- +8 IF LEXIA?7N
- IF LEXAC?7N
- IF LEXIA>LEXAC
- Begin DoDot:1
- +9 SET X="Inactive "_$$FMTE^XLFDT(LEXIA,"5Z")
- End DoDot:1
- QUIT X
- +10 IF LEXAC'=LEXTD
- IF LEXPD?7N
- IF LEXPD>LEXTD
- Begin DoDot:1
- +11 SET X="Pending "_$$FMTE^XLFDT(LEXPD,"5Z")
- End DoDot:1
- QUIT X
- +12 QUIT ""
- SN(X,EFF) ; Short Name
- +1 NEW IEN,CDT,IMP,EFF,HIS
- SET IEN=+($GET(X))
- SET CDT=$GET(LEXVDT)
- if $GET(EFF)?7N
- SET CDT=$GET(EFF)
- +2 SET IMP=$$IMPDATE^LEXU(30)
- if CDT'?7N
- SET CDT=$$DT^XLFDT
- +3 if CDT'>IMP&(IMP?7N)
- SET CDT=IMP
- +4 SET EFF=$ORDER(^LEX(757.033,+IEN,2,"B",(CDT+.001)),-1)
- +5 SET HIS=$ORDER(^LEX(757.033,+IEN,2,"B",+EFF," "),-1)
- +6 SET X=$GET(^LEX(757.033,+IEN,2,+HIS,1))
- +7 QUIT X
- LN(X,EFF) ; Long Name
- +1 NEW IEN,CDT,IMP,EFF,HIS
- SET IEN=+($GET(X))
- SET CDT=$GET(LEXVDT)
- if $GET(EFF)?7N
- SET CDT=$GET(EFF)
- +2 SET IMP=$$IMPDATE^LEXU(30)
- if CDT'?7N
- SET CDT=$$DT^XLFDT
- +3 if CDT'>IMP&(IMP?7N)
- SET CDT=IMP
- +4 SET EFF=$ORDER(^LEX(757.033,+IEN,3,"B",(CDT+.001)),-1)
- +5 SET HIS=$ORDER(^LEX(757.033,+IEN,3,"B",+EFF," "),-1)
- +6 SET X=$GET(^LEX(757.033,+IEN,3,+HIS,1))
- +7 QUIT X
- SCR(X,Y) ; Screen
- +1 SET Y=+($GET(Y))
- if +Y'>0
- QUIT 0
- if '$DATA(^LEX(757.01,+Y,0))
- QUIT 0
- +2 NEW LEXFIL
- SET LEXFIL=$GET(X)
- if '$LENGTH(LEXFIL)
- QUIT 1
- DO ^DIM
- if '$DATA(X)
- QUIT 1
- +3 XECUTE LEXFIL
- SET X=$TEST
- +4 QUIT X
- SH ; Show TMP
- +1 NEW LEXNN,LEXNC
- SET LEXNN="^TMP(""LEXDX"","_$JOB_")"
- SET LEXNC="^TMP(""LEXDX"","_$JOB_","
- +2 WRITE !!,"3",!
- FOR