Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: LEX10CX

LEX10CX.m

Go to the documentation of this file.
  1. LEX10CX ;ISL/KER - ICD-10 Cross-Over - Main ;05/23/2017
  1. ;;2.0;LEXICON UTILITY;**80,103**;Sep 23, 1996;Build 2
  1. ;
  1. ; Global Variables
  1. ; None
  1. ;
  1. ; External References
  1. ; $$FMADD^XLFDT ICR 10103
  1. ; $$UP^XLFSTR ICR 10104
  1. ;
  1. ; Local Variables NEWed or KILLed Elsewhere
  1. ; None
  1. ;
  1. EN ; Suggested Code (Code and Source are unknown, interactive)
  1. ;
  1. ; Input
  1. ;
  1. ; None. Interactive API. The variable LEXSAB can
  1. ; be preset to a coding system (.01 field in file
  1. ; 757.03), else wise the user will be prompted for
  1. ; a coding system.
  1. ;
  1. ; Output
  1. ;
  1. ; X Source - 4 piece "^" delimited string
  1. ;
  1. ; 1 Lexicon IEN for file 757.02
  1. ; 2 Expression
  1. ; 3 Code in selected Coding System
  1. ; 4 Coding System nomenclature
  1. ;
  1. ; or null if search fails
  1. ;
  1. ; Y Target - 4 piece "^" delimited string
  1. ;
  1. ; 1 Lexicon IEN for file 757.02
  1. ; 2 Expression
  1. ; 3 ICD-10 Diagnostic Code
  1. ; 4 ICD-10-CM
  1. ;
  1. ; or -1 if search fails
  1. ;
  1. ; Example Output:
  1. ;
  1. ; ICD-9 to ICD-10
  1. ;
  1. ; X="119899^Tobacco Use Disorder^305.1^ICD-9-CM"
  1. ; Y="5003360^Nicotine Dependence, unspecified,
  1. ; Uncomplicated^F17.200^ICD-10-CM"
  1. ;
  1. ; SNOMED CT to ICD-10
  1. ;
  1. ; X="7078519^Diabetes mellitus type 2^44054006^SNOMED CT"
  1. ; Y="5002666^Type 2 Diabetes Mellitus without
  1. ; Complications^E11.9^ICD-10-CM"
  1. ;
  1. N LEX0FND,LEX0SEL,LEX0REV,LEXEFF,LEXIT,LEXERR,LEXEXP,LEXIEN,LEXLAD
  1. N LEXNOM,LEXSRC,LEXSRI,LEXTCOD,LEXTGT,LEXTMP,LEXTTXT,DIROUT,DIRUT
  1. N DTOUT,DUOUT K X,Y S (LEXIT,LEX0FND,LEX0SEL,LEX0REV)=0
  1. S LEXERR="Coding system not selected or specified"
  1. S LEXSAB=$$SAB($G(LEXSAB)) S:$L(LEXSAB)'=3 LEXSAB=$$SAB^LEX10CX4
  1. I $L(LEXSAB)'=3 D ERR(LEXERR) Q
  1. S LEXTMP=LEXSAB K LEXSAB N LEXSAB S LEXSAB=LEXTMP
  1. S LEXSRI=$$SRC(LEXSAB) I +LEXSRI'>0 D ERR(LEXERR) Q
  1. S LEXNOM=$P($G(^LEX(757.03,+LEXSRI,0)),"^",2)
  1. I '$L(LEXNOM) D ERR(LEXERR) Q
  1. S X=$$SRL^LEX10CX2(LEXSAB,.LEXSRC)
  1. D CX(.LEXSRC)
  1. Q
  1. EN2(CODE,SYS) ; Suggested Code (Source is known, interactive)
  1. ;
  1. ; Input
  1. ;
  1. ; CODE Code
  1. ; SYS Coding System Abbreviation
  1. ;
  1. ; Output
  1. ;
  1. ; X Source - 4 piece "^" delimited string
  1. ;
  1. ; 1 Lexicon IEN for file 757.02
  1. ; 2 Expression
  1. ; 3 Code in selected Coding System
  1. ; 4 Coding System nomenclature
  1. ;
  1. ; or null if search fails
  1. ;
  1. ; Y Target - 4 piece "^" delimited string
  1. ;
  1. ; 1 Lexicon IEN for file 757.02
  1. ; 2 Expression
  1. ; 3 ICD-10 Diagnostic Code
  1. ; 4 ICD-10-CM
  1. ;
  1. ; or -1 if search fails
  1. ;
  1. ; Example Output:
  1. ;
  1. ; ICD-9 to ICD-10
  1. ;
  1. ; X="119899^Tobacco Use Disorder^305.1^ICD-9-CM"
  1. ; Y="5003360^Nicotine Dependence, unspecified,
  1. ; Uncomplicated^F17.200^ICD-10-CM"
  1. ;
  1. ; SNOMED CT to ICD-10
  1. ;
  1. ; X="7078519^Diabetes mellitus type 2^44054006^SNOMED CT"
  1. ; Y="5002666^Type 2 Diabetes Mellitus without
  1. ; Complications^E11.9^ICD-10-CM"
  1. ;
  1. N LEX0FND,LEX0SEL,LEX0REV,LEXEFF,LEXIT,LEXERR,LEXEXP,LEXIEN,LEXLAD
  1. N LEXNOM,LEXSRC,LEXSRI,LEXTCOD,LEXTGT,LEXTMP,LEXTTXT,DIROUT,DIRUT
  1. N DTOUT,DUOUT S (LEXIT,LEX0FND,LEX0SEL,LEX0REV)=0
  1. S LEXERR="Coding system not selected or specified" S LEXSAB=$$SAB($G(SYS))
  1. I $L(LEXSAB)'=3 D ERR(LEXERR) Q
  1. S LEXTMP=LEXSAB K LEXSAB N LEXSAB S LEXSAB=LEXTMP,LEXSRI=$$SRC(LEXSAB)
  1. I +LEXSRI'>0 D ERR(LEXERR) Q
  1. S LEXNOM=$P($G(^LEX(757.03,+LEXSRI,0)),"^",2)
  1. I '$L(LEXNOM) D ERR(LEXERR) Q
  1. S LEXERR=LEXNOM_" code not selected"
  1. S LEXTCOD=$G(CODE) I '$L(LEXTCOD) D ERR(LEXERR) Q
  1. K X,Y D SRA^LEX10CX2(LEXTCOD,LEXSAB,.LEXSRC)
  1. D CX(.LEXSRC)
  1. Q
  1. EN3(CODE,SYS,ARY,MAX) ; Suggested Code (Code and Source are known, silent/GUI)
  1. ;
  1. ; Input
  1. ;
  1. ; CODE Code (required)
  1. ; SYS Coding System Abbreviation (required)
  1. ; ARY Local Array passed by reference (required)
  1. ; MAX Maximum # of suggestions (optional, default 100)
  1. ;
  1. ; Output
  1. ;
  1. ; ARY Array, passed by reference
  1. ;
  1. ; ARY("X") Input
  1. ; ARY("Y",0) Output Number of Suggested Entries
  1. ; ARY("Y",1) Output First Suggestion
  1. ; ARY("Y",n) Output nth Suggestion
  1. ;
  1. ; ARY("E") Error message
  1. ;
  1. ; Both ARY("X") and ARY("Y",#) are 4 piece "^"
  1. ; delimited strings:
  1. ;
  1. ; 1 Internal Entry Number (IEN) file 757.01
  1. ; 2 Expression (file 757.01, field .01)
  1. ; 3 Code (file 757.02, field 1)
  1. ; 4 Nomenclature (file 757.03, field 1)
  1. ; i.e., SNOMED CT, ICD-9-CM or ICD-10-CM
  1. ;
  1. N LEXC,LEX0FND,LEX0SEL,LEX0REV,LEXEFF,LEXI,LEXIT,LEXERR,LEXERRT,LEXEXP,LEXIEN,LEXLAD
  1. N LEXNASK,LEXNASKM,LEXNOM,LEXQT,LEXSRC,LEXSRI,LEXTCOD,LEXTGT,LEXTMP,LEXTTXT,DIROUT
  1. N DIRUT,DTOUT,DUOUT S:+($G(MAX))'>0 MAX=100 S LEXNASK=1,LEXNASKM=+($G(MAX))
  1. K:+LEXNASKM'>0 LEXNASKM S LEXQT=1,LEXERRT=""
  1. D EN2($G(CODE),$G(SYS)) S LEXNOM=$$SRN("10D") K ARY
  1. S:$L(LEXERRT) ARY("E")=LEXERRT S (LEXC,LEXI)=0
  1. F S LEXI=$O(LEXNASK(LEXI)) Q:+LEXI'>0 D
  1. . N LEXT S LEXT=$G(LEXNASK(LEXI)) Q:'$L(LEXT)
  1. . S:$L(LEXNOM) $P(LEXT,"^",4)=LEXNOM
  1. . S LEXC=LEXC+1 Q:+($G(LEXNASKM))>0&(LEXC>+($G(LEXNASKM)))
  1. . S ARY("Y",LEXC)=LEXT,ARY("Y",0)=LEXC
  1. I +($G(ARY("Y",0)))'>0 D
  1. . S LEXSRC=$G(ARY("X"))
  1. . K ARY S ARY("Y",0)=0
  1. . S:$L(LEXSRC) ARY("X")=LEXSRC
  1. S:$L(LEXERRT) ARY("E")=LEXERRT
  1. S:$L($G(LEXNASK("X"))) ARY("X")=$G(LEXNASK("X"))
  1. Q
  1. ;
  1. CX(LEXSRC) ; Convert to ICD-10
  1. S LEXNOM=$G(LEXSRC("SOURCE","SRC"))
  1. I '$D(LEXSRC("SOURCE")) D Q
  1. . D ERR("Invalid code for coding system")
  1. I '$L(LEXNOM) D Q
  1. . D ERR(("Invalid coding system passed "_$S($L($G(LEXNOM)):" - ",1:"")_LEXNOM))
  1. S LEXERR=LEXNOM_" code not selected"
  1. S LEXIEN=+($G(LEXSRC("SOURCE","Y")))
  1. I +LEXIEN'>0 D ERR((LEXERR_" (IEN) "_LEXIEN)) Q
  1. S LEXEXP=$P($G(LEXSRC("SOURCE","Y")),"^",2)
  1. I '$L(LEXEXP) D ERR((LEXERR_" (Expression) ")) Q
  1. S LEXERR="Invalid "_LEXNOM_" code selected"
  1. S LEXTCOD=$G(LEXSRC("SOURCE","SOE"))
  1. I '$L(LEXTCOD) D ERR((LEXERR_" (Code) "_LEXTCOD)) Q
  1. I '$D(^LEX(757.01,+LEXIEN,0)) D ERR((LEXERR_" (Expression) ")) Q
  1. S LEXERR="Invalid coding system"
  1. S LEXSAB=$G(LEXSRC("SOURCE","SAB"))
  1. I '$L(LEXSAB) D ERR((LEXERR_" (SAB) "_LEXSAB)) Q
  1. S LEXERR="Invalid "_LEXNOM_" code selected"
  1. S LEXLAD=$P($$LA^LEX10CX5(LEXTCOD,LEXSAB),".",1)
  1. I LEXLAD'?7N D ERR((LEXERR_" (Last Activation Date) "_LEXLAD)) Q
  1. S LEXEFF=$$FMADD^XLFDT(LEXLAD,3)
  1. S LEXERR="Invalid text for code"
  1. S LEXTTXT=$$UP^XLFSTR($G(LEXSRC("SOURCE","EXP")))
  1. I '$L(LEXTTXT) D ERR((LEXERR_" (Text) ")) Q
  1. D SEG^LEX10CX5(,.LEXSRC)
  1. I $O(LEXSRC("SEG",0))'>0 D ERR((LEXERR_" (Segments) ")) Q
  1. S X=$$FIND1^LEX10CX3(LEXTCOD,.LEXSRC,.LEXTGT) S:+X'>0 X=""
  1. I +X'>0 S X=$$FIND2^LEX10CX3(LEXTTXT,.LEXSRC,.LEXTGT) S:+X'>0 X=""
  1. I $G(LEXNASK)>0 D Q
  1. . N LEXI,LEXC S LEXC=0 F LEXI=1:1:100 Q:'$L($G(LEXTGT(LEXI))) D
  1. . . N LEXT S LEXT=$G(LEXTGT(LEXI)),LEXC=LEXC+1
  1. . . I +($G(LEXNASKM))>0,+LEXC>+($G(LEXNASKM)) Q
  1. . . S LEXNASK(LEXC)=LEXT
  1. . I $L($G(LEXSRC("SOURCE","Y")),"^")=3 D
  1. . . N LEXT,LEX4 S LEXT=$G(LEXSRC("SOURCE","Y"))
  1. . . S LEX4=$G(LEXSRC("SOURCE","SRC"))
  1. . . S:$L(LEX4) $P(LEXT,"^",4)=LEX4
  1. . . S LEXNASK("X")=LEXT
  1. . I $L($G(LEXSRC("SOURCE","Y")),"^")'=3 D
  1. . . N LEX1,LEX2,LEX3,LEX4,LEXT
  1. . . S LEX1=+($G(LEXSRC("SOURCE","EXI"))) Q:LEX1'>0
  1. . . S LEX2=$G(LEXSRC("SOURCE","EXP")) Q:'$L(LEX2)
  1. . . S LEX3=$G(LEXSRC("SOURCE","SOE")) Q:'$L(LEX3)
  1. . . S LEX4=$G(LEXSRC("SOURCE","SRC"))
  1. . . S LEXT=LEX1_"^"_LEX2_"^"_LEX3
  1. . . S:$L(LEX4) $P(LEXT,"^",4)=LEX4
  1. . . S LEXNASK("X")=LEXT
  1. S LEXIT=0 I +($G(X))>0 D Q:LEXIT>0
  1. . N DIR K DIROUT,DIRUT,DUOUT,DTOUT D ASK^LEX10CX4(.LEXSRC,.LEXTGT)
  1. . I $D(DIROUT) S (LEX0FND,LEX0REV,LEX0SEL)=0,LEXIT=1
  1. . K:$G(LEX0FND)>0&($G(LEX0REV)>0)&('$L($G(X))) DIROUT,DIRUT,DUOUT,DTOUT
  1. . I $D(DIROUT)!($D(DIRUT))!($D(DUOUT))!($D(DTOUT)) D Q
  1. . . S X="^",Y=-1 S:$D(DIROUT) LEXIT=1
  1. . D:+($G(X))>0&(+($G(Y))>0) OUT($G(X),$G(Y))
  1. . S:+($G(X))>0&(+($G(Y))>0) LEXIT=1
  1. . S:$G(LEX0FND)>0&($G(LEX0SEL)'>0) LEXIT=0
  1. . I +($G(X))'>0!($G(Y)=-1) S X="",Y=-1
  1. I $D(LEXTEST) D
  1. . W:'$D(LEXQT) !! D SA^LEX10CX5("LEXSRC")
  1. . W:'$D(LEXQT) !! D SA^LEX10CX5("LEXTGT") N LEXTEST
  1. I +X'>0 D
  1. . S X=$$FIND3^LEX10CX3(.LEXSRC,.LEXTGT) S:+X'>0 X=""
  1. . I $G(LEXTGT(0))=1,$L($G(LEXTGT(1))) D
  1. . . D X^LEX10CX4(.LEXSRC),Y^LEX10CX4(1,.LEXTGT)
  1. . . D:+($G(X))>0&(+($G(Y))>0) OUT($G(X),$G(Y))
  1. S:+($G(X))'>0 X="" S:+($G(Y))'>0 Y=-1
  1. Q
  1. OUT(X,Y) ; Display Output - Interactive, Positive Results only
  1. N LEXSI,LEXST,LEXSC,LEXSN,LEXSD,LEXTI,LEXTT,LEXTC,LEXTN
  1. N LEXTD,LEXL,LEXI S X=$G(X) Q:+X'>0 S Y=$G(Y) Q:+Y'>0
  1. S LEXSI=$P(X,"^",1) Q:LEXSI'>0 S LEXST(1)=$P(X,"^",2) Q:'$L(LEXST(1))
  1. S LEXSC=$P(X,"^",3) Q:'$L(LEXSC) S LEXSN=$P(X,"^",4) Q:'$L(LEXSN)
  1. S LEXTI=$P(Y,"^",1) Q:LEXTI'>0 S LEXTT(1)=$P(Y,"^",2) Q:'$L(LEXTT(1))
  1. S LEXTC=$P(Y,"^",3) Q:'$L(LEXTC) S LEXTN=$P(Y,"^",4) Q:'$L(LEXTN)
  1. S LEXSD=LEXSN_" "_LEXSC S LEXTD=LEXTN_" "_LEXTC
  1. S LEXL=$L(LEXSD)+5 S:($L(LEXTD)+5)>LEXL LEXL=$L(LEXTD)+5
  1. D PR^LEXU(.LEXST,(78-LEXL)),PR^LEXU(.LEXTT,(78-LEXL))
  1. W:'$D(LEXQT) !!," ",LEXSD,?LEXL,$G(LEXST(1))
  1. S LEXI=1 F S LEXI=$O(LEXST(LEXI)) Q:+LEXI'>0 D
  1. . W:$L($G(LEXST(LEXI))) !,?LEXL,$G(LEXST(LEXI))
  1. W:'$D(LEXQT) !," ",LEXTD,?LEXL,$G(LEXTT(1))
  1. S LEXI=1 F S LEXI=$O(LEXTT(LEXI)) Q:+LEXI'>0 D
  1. . W:$L($G(LEXTT(LEXI))) !,?LEXL,$G(LEXTT(LEXI))
  1. W:'$D(LEXQT) !
  1. Q
  1. ERR(X) ; Error
  1. Q:'$L($G(X)) W:'$D(LEXQT) !,?2,$G(X),! S:$D(LEXQT) LEXERRT=$G(X)
  1. Q
  1. SAB(X) ; Resolve SAB to 3 character Abbreviation
  1. N LEXSAB,LEXCI,LEXCS S LEXCS=$G(X) Q:'$L(LEXCS) ""
  1. I LEXCS?1N.N Q:$D(^LEX(757.03,+LEXCS,0)) $E($G(^LEX(757.03,+LEXCS,0)),1,3)
  1. S LEXCI=$O(^LEX(757.03,"B",$$UP^XLFSTR(LEXCS),0)) Q:$D(^LEX(757.03,+LEXCI,0)) $E($G(^LEX(757.03,+LEXCI,0)),1,3)
  1. S LEXCI=$O(^LEX(757.03,"ASAB",$$UP^XLFSTR(LEXCS),0)) Q:$D(^LEX(757.03,+LEXCI,0)) $E($G(^LEX(757.03,+LEXCI,0)),1,3)
  1. S LEXCI=$O(^LEX(757.03,"C",LEXCS,0)) Q:$D(^LEX(757.03,+LEXCI,0)) $E($G(^LEX(757.03,+LEXCI,0)),1,3)
  1. Q ""
  1. SRC(X) ; Resolve Source (pointer for SAB in 757.03)
  1. N LEXSAB,LEXCI,LEXCS S LEXCS=$G(X) Q:'$L(LEXCS) "" S LEXSAB=$$SAB(LEXCS) Q:$L(LEXSAB)'=3 ""
  1. S X=$O(^LEX(757.03,"ASAB",LEXSAB,0)) S:'$D(^LEX(757.03,+X,0)) X=""
  1. Q X
  1. SRN(X) ; Resolve Source (pointer for SAB in 757.03)
  1. N LEXNOM,LEXCI,LEXCS S LEXCS=$G(X) Q:'$L(LEXCS) "" S LEXCI=$$SRC(LEXCS)
  1. Q:'$D(^LEX(757.03,+LEXCI,0)) "" S X=$P($G(^LEX(757.03,+LEXCI,0)),"^",2)
  1. Q X