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

ICDEXLK3.m

Go to the documentation of this file.
  1. ICDEXLK3 ;SLC/KER - ICD Extractor - Lookup, Search ;04/21/2014
  1. ;;18.0;DRG Grouper;**57**;Oct 20, 2000;Build 7
  1. ;
  1. ; Global Variables
  1. ; ^ICDS( N/A
  1. ; ^ICDS("F" N/A
  1. ; ^TMP(ID,$J, SACC 2.3.2.5.1
  1. ;
  1. ; External References
  1. ; $$DT^XLFDT ICR 10103
  1. ; $$UP^XLFSTR ICR 10104
  1. ;
  1. ; Local Variables Newed or Killed by calling application
  1. ; DIC(0) Fileman Lookup Parameters
  1. ;
  1. LK(TXT,ROOT,CDT,SYS,VER,OUT) ; Lookup - Versioned
  1. ;
  1. ; Input
  1. ;
  1. ; TXT Text to Search for (Required)
  1. ;
  1. ; Diagnosis or Procedure Code
  1. ; Diagnosis or Procedure Descriptive Text
  1. ;
  1. ; ROOT Global Root/File # to Search (Fileman DIC, Required)
  1. ;
  1. ; ^ICD9(
  1. ; ^ICD0(
  1. ;
  1. ; CDT Date (default = TODAY) (Optional)
  1. ;
  1. ; SYS Coding System (Optional but encouraged)
  1. ;
  1. ; 1 ICD-9-CM
  1. ; 2 ICD-9 Proc
  1. ; 30 ICD-10-CM
  1. ; 31 ICD-10-PCS
  1. ;
  1. ; VER Versioned Lookup
  1. ;
  1. ; 0 No, include all codes, active and inactive
  1. ; 1 Yes, include only Active codes for date CDT
  1. ;
  1. ; OUT Output Format
  1. ;
  1. ; 1 Fileman, Code and Short Text (default)
  1. ;
  1. ; 250.00 DMII CMP NT ST UNCNTR
  1. ;
  1. ; 2 Fileman, Code and Description
  1. ;
  1. ; 250.00 DIABETES MELLITUS NO MENTION OF
  1. ; COMPLICATION, TYPE II OR UNSPECIFIED
  1. ; TYPE, NOT STATED AS UNCONTROLLED
  1. ;
  1. ; 3 Lexicon, Short Text and Code
  1. ;
  1. ; DMII CMP NT ST UNCNTR (250.00)
  1. ;
  1. ; 4 Lexicon, Description and Code
  1. ;
  1. ; DIABETES MELLITUS NO MENTION OF
  1. ; COMPLICATION, TYPE II OR UNSPECIFIED TYPE,
  1. ; NOT STATED AS UNCONTROLLED (250.00)
  1. ;
  1. ; Output (if successful)
  1. ;
  1. ; $$LK Number of entries found
  1. ;
  1. ; Global Array of entries found:
  1. ;
  1. ; ^TMP(ID,$J,"SEL")
  1. ; ^TMP(ID,$J,"SEL",0)=# of entries
  1. ; ^TMP(ID,$J,"SEL",#)=IEN^Display Text
  1. ;
  1. ; where ID is a package namespaced subscript:
  1. ;
  1. ; ICD9 - for the Diagnosis file #80
  1. ; ICD0 - for the Operations/Procedure file #80.1
  1. ;
  1. ; Local Variables used but Newed or Killed Elsewhere
  1. ;
  1. ; DIC(0)
  1. ;
  1. Q $$LK2
  1. Q
  1. CD(TXT,ROOT,CDT,SYS,VER,OUT) ; Lookup Code - Versioned
  1. N ICDBYCD S ICDBYCD="" S TXT=$$TM(TXT)
  1. Q $$LK2
  1. Q
  1. LK2() ; Lookup - Part 2
  1. N FILE,IEN,INP1,INP2,KEY,SUB,NUM,NXT,OK,ORD,SEQ,TDT,VCC,VCD,VDS,VSD,VST,PR,PARS,LOR,VII,VNM,Y
  1. S TXT=$$TM($TR($G(TXT),"#"," ")) Q:'$L(TXT) 0 S ROOT=$$ROOT^ICDEX(ROOT) Q:'$L(ROOT) 0
  1. S FILE=$$FILE^ICDEX(ROOT) Q:"^80^80.1^"'[("^"_FILE_"^") 0
  1. S SUB=$TR(ROOT,"^(","") Q:'$L(SUB) 0 K ^TMP(SUB,$J) S CDT=$$CDT($G(CDT))
  1. S SYS=$S($L($G(SYS)):$$SYS^ICDEX($G(SYS)),1:""),VER=+($G(VER))
  1. S:+($G(SYS))'>0&(CDT?7N)&(+VER>0) SYS=$$SYS(ROOT,CDT)
  1. S:$D(^ICDS(+SYS,0))&(+VER>0) CDT=$$DTBR^ICDEX(CDT,,+($G(SYS)))
  1. S OUT=$G(OUT) S:+OUT'>0 OUT=1 S:+OUT>4 OUT=1
  1. S INP1=$E(TXT,1),INP2=$E($G(TXT),2,245)
  1. Q:$D(^TMP(SUB,$J)) +($G(^TMP(SUB,$J,"SEL",0)))
  1. ; Exact Match
  1. I $L(TXT) D
  1. . N ICDI,LOR K Y,X S LOR=0,X=$$EXM^ICDEXLK5(TXT,ROOT,.Y,CDT,SYS,VER)
  1. . S ICDI=0 F S ICDI=$O(Y(ICDI)) Q:+ICDI'>0 D
  1. . . N IEN S IEN=+($G(Y(ICDI))) Q:+IEN'>0 D FND^ICDEXLK5(ROOT,IEN,CDT,SYS,VER,+($G(LOR)),OUT)
  1. . I $G(DIC(0))'["A",$G(DIC(0))["O" D
  1. . . N ENT,TXT,IEN S ENT=$O(^TMP(SUB,$J,"FND",0)) Q:+ENT'>0
  1. . . S TXT=$G(^TMP(SUB,$J,"FND",+ENT,1)) Q:'$L(TXT) S IEN=+($P(TXT,"^",1)) Q:+IEN'>0
  1. . . K ^TMP(SUB,$J,"FND",ENT,1),^TMP(SUB,$J,"FND","IEN",+IEN)
  1. . . S ^TMP(SUB,$J,"FND",1,1)=TXT,^TMP(SUB,$J,"FND","IEN",+IEN)=""
  1. I $G(DIC(0))["X" D SEL^ICDEXLK5(ROOT,+($G(LOR))) Q:+($G(^TMP(SUB,$J,"SEL",0)))>0 +($G(^TMP(SUB,$J,"SEL",0)))
  1. ; By Code
  1. D:$L(TXT)'>8&($$ISCODE(TXT,ROOT)>0) CODE
  1. Q:+($G(^TMP(SUB,$J,"SEL",0)))>0 +($G(^TMP(SUB,$J,"SEL",0)))
  1. ; By Text
  1. D TXT^ICDEXLK4
  1. Q +($G(^TMP(SUB,$J,"SEL",0)))
  1. ;
  1. CODE ; Lookup by Code (Requires TXT and ROOT)
  1. Q:'$L($G(TXT)) Q:'$L($G(ROOT)) Q:$L(TXT)>8 Q:$G(DIC(0))["B"
  1. Q:$$ISCODE($G(TXT),$G(ROOT))'>0
  1. S CDT=$$CDT($G(CDT)) N KEY,ORD,PRV,EROOT
  1. S KEY=TXT,PRV=+($G(^TMP(SUB,$J,"SEL",0)))
  1. S ORD=$E(KEY,1,($L(KEY)-1))_$C(($A($E(KEY,$L(KEY)))-1))_"~ "
  1. S EROOT=ROOT_"""BA""," S:+($G(SYS))>0&($D(@(ROOT_"""ABA"","_+($G(SYS))_")"))) EROOT=ROOT_"""ABA"","_+($G(SYS))_","
  1. F S ORD=$O(@(EROOT_""""_ORD_""")")) Q:'$$ISORD D
  1. . S IEN=0 I $G(DIC(0))["X",ORD'=KEY Q
  1. . F S IEN=$O(@(EROOT_""""_ORD_""","_+IEN_")")) Q:+IEN'>0 D
  1. . . N STA S STA=1 S:VER>0 STA=$$LS(ROOT,IEN,CDT)
  1. . . Q:+($G(VER))>0&(+STA'>0)
  1. . . I $G(DIC(0))'["A",$G(DIC(0))["O",ORD=KEY S CNT=CNT+1 Q:CNT>1
  1. . . D FND^ICDEXLK5(ROOT,IEN,CDT,$G(SYS),$G(VER),1,OUT)
  1. I '$D(^TMP(SUB,$J,"FND","IEN")) D
  1. . S KEY=$$UP^XLFSTR(TXT),PRV=+($G(^TMP(SUB,$J,"SEL",0)))
  1. . S ORD=$E(KEY,1,($L(KEY)-1))_$C(($A($E(KEY,$L(KEY)))-1))_"~ "
  1. . S EROOT=ROOT_"""BA""," S:+($G(SYS))>0&($D(@(ROOT_"""ABA"","_+($G(SYS))_")"))) EROOT=ROOT_"""ABA"","_+($G(SYS))_","
  1. . F S ORD=$O(@(EROOT_""""_ORD_""")")) Q:'$$ISORD D
  1. . . S IEN=0 I $G(DIC(0))["X",ORD'=KEY Q
  1. . . F S IEN=$O(@(EROOT_""""_ORD_""","_+IEN_")")) Q:+IEN'>0 D
  1. . . . N STA S STA=1 S:VER>0 STA=$$LS(ROOT,IEN,CDT)
  1. . . . Q:+($G(VER))>0&(+STA'>0)
  1. . . . I $G(DIC(0))'["A",$G(DIC(0))["O",ORD=KEY S CNT=CNT+1 Q:CNT>1
  1. . . . D FND^ICDEXLK5(ROOT,IEN,CDT,$G(SYS),$G(VER),1,OUT)
  1. D SEL^ICDEXLK5(ROOT,1)
  1. Q
  1. S STA=1 S:VER>0 STA=$$LS^ICDEXLK3(ROOT,IEN,CDT)
  1. Q:+($G(VER))>0&(+STA'>0)
  1. ;
  1. ; Miscellaneous
  1. TOK(X) ; Parse Text into Tokens
  1. K PARS D PAR^ICDTOKN($G(X),.PARS,1)
  1. Q
  1. TOKEN(X,ROOT,SYS,ARY) ; Parse Text into Tokens
  1. D TOKEN^ICDTOKN($G(X),$G(ROOT),$G(SYS),.ARY)
  1. Q
  1. SS ; Show Select/Find Global Arrays
  1. N NN,NC S NN="^TMP(""ICD9"","_$J_")",NC="^TMP(""ICD9"","_$J_","
  1. F S NN=$Q(@NN) Q:'$L(NN)!(NN'[NC) D
  1. . W !,NN,"=",@NN Q
  1. S NN="^TMP(""ICD0"","_$J_")",NC="^TMP(""ICD0"","_$J_","
  1. F S NN=$Q(@NN) Q:'$L(NN)!(NN'[NC) D
  1. . W !,NN,"=",@NN Q
  1. Q
  1. WORD(X,ROOT,SYS) ; Word is contained in a Set
  1. ;
  1. ; Input
  1. ;
  1. ; X A single word (Required)
  1. ;
  1. ; ROOT Global Root/File # to Search (Optional, if
  1. ; not supplied both files 80 and 80.1 are used)
  1. ;
  1. ; ^ICD9( or 80
  1. ; ^ICD0( or 80.1
  1. ;
  1. ; SYS Coding System (Optional, if not supplied all
  1. ; coding systems for the file are used)
  1. ;
  1. ; 1 or ICD or ICD-9-CM
  1. ; 2 or ICP or ICD-9 Proc
  1. ; 30 or 10D or ICD-10-CM
  1. ; 31 or 10P or ICD-10-PCS
  1. ;
  1. ; Output (if successful)
  1. ;
  1. ; $$WORD Boolean value
  1. ;
  1. ; 1 = Word was found
  1. ;
  1. ; If ROOT is not supplied, the word was found in
  1. ; either file 80 or 80.1
  1. ;
  1. ; If SYS is not supplied, the word was found in
  1. ; the file designated by ROOT in any coding system
  1. ; in the file
  1. ;
  1. ; If both ROOT and SYS are supplied, the word was
  1. ; found in the specified coding system
  1. ;
  1. ; 0 = Word was not found
  1. ;
  1. N TKN S TKN=$G(X),X=0 Q:'$L(TKN) 0 S ROOT=$$ROOT^ICDEX($G(ROOT)),SYS=$$SYS^ICDEX($G(SYS))
  1. I '$L(ROOT)!(ROOT'["^")!(ROOT'["(") D Q X
  1. . N TRT,FI F FI=80,80.1 S TRT=$$ROOT^ICDEX(FI) D
  1. . . I +SYS'>0!('$D(^ICDS(+SYS))) D
  1. . . . N SYS S SYS=0 F S SYS=$O(@(TRT_"""AD"","_SYS_")")) Q:+SYS'>0 D
  1. . . . . S:$D(@(TRT_"""AD"","_SYS_","""_TKN_""")")) X=1
  1. . . I +SYS>0&('$D(^ICDS(+SYS))) D
  1. . . . S:$D(@(TRT_"""AD"","_+SYS_","""_TKN_""")")) X=1
  1. I +SYS'>0!('$D(^ICDS(+SYS))) D Q X
  1. . N SYS S SYS=0 F S SYS=$O(@(ROOT_"""AD"","_SYS_")")) Q:+SYS'>0 D
  1. . . S:$D(@(ROOT_"""AD"","_SYS_","""_TKN_""")")) X=1
  1. Q:'$L(ROOT)!(ROOT'["^")!(ROOT'["(") 0
  1. Q:+SYS'>0!('$D(^ICDS(+SYS))) 0
  1. S:$D(@(ROOT_"""AD"","_+SYS_","""_TKN_""")")) X=1
  1. Q X
  1. LS(ROOT,IEN,VDT) ; Last Status
  1. N EFF,HIS,STA,CDT S IEN=+($G(IEN)),ROOT=$G(ROOT),VDT=$$CDT($G(VDT))
  1. Q:+IEN'>0 "-1" Q:'$L(ROOT) "-1" Q:VDT'?7N "-1" S CDT=VDT+.00001
  1. S EFF=$O(@(ROOT_+IEN_",66,""B"","_CDT_")"),-1) Q:EFF'?7N "-1"
  1. S HIS=$O(@(ROOT_+IEN_",66,""B"","_EFF_","" "")"),-1) Q:+HIS'>0 "-1"
  1. S STA=$G(@(ROOT_+IEN_",66,"_+HIS_",0)")) Q:'$L(STA) "-1"
  1. S EFF=$P(STA,"^",1),STA=$P(STA,"^",2) Q:EFF'?7N "-1" Q:STA'?1N "-1"
  1. S X=STA_"^"_EFF
  1. Q X
  1. LD(ROOT,IEN,VDT,VER) ; Last Description
  1. N EFF,LDI,LDS,CDT S IEN=+($G(IEN)),ROOT=$G(ROOT),VDT=$$CDT($G(VDT))
  1. Q:+IEN'>0 "" Q:'$L(ROOT) "" Q:VDT'?7N "" S CDT=VDT+.00001
  1. S EFF=$O(@(ROOT_+IEN_",68,""B"","_CDT_")"),-1)
  1. Q:+($G(VER))>0&(EFF'?7N) ""
  1. S:+($G(VER))'>0&(EFF'?7N) EFF=$O(@(ROOT_+IEN_",68,""B"",0)"))
  1. S LDI=$O(@(ROOT_+IEN_",68,""B"","_+EFF_","" "")"),-1) Q:+LDI'>0 ""
  1. S LDS=$$UP^XLFSTR($G(@(ROOT_+IEN_",68,"_+LDI_",1)"))) Q:'$L(LDS) ""
  1. S X=LDS
  1. Q X
  1. ISCODE(X,ROOT) ; Check if Text is a Code
  1. N KEY,ORG,LAS,ORD,OUT,SI,SYS
  1. S KEY=$G(X) Q:'$L($TR(KEY,"""","")) 0
  1. S ORG=$E(KEY,1,($L(KEY)-1))_$C(($A($E(KEY,$L(KEY)))-1))_"~ "
  1. S OUT=0,SI=0
  1. F S SI=$O(^ICDS(SI)) Q:+SI'>0 D Q:+OUT>0
  1. . N ORD,RES S ORD=ORG
  1. . S RES=$O(@(ROOT_"""ABA"","_+SI_","""_ORD_""")"))
  1. . Q:'$L(RES) S:$E(RES,$L(RES))=" " RES=$E(RES,1,($L(RES)-1))
  1. . I RES=KEY S OUT="1^"_SI_"^"_KEY Q
  1. . I $L(KEY)<$L(RES),KEY=$E(RES,1,$L(KEY)) S OUT="1^"_SI_"^"_KEY
  1. S KEY=$$UP^XLFSTR($G(X))
  1. S ORG=$E(KEY,1,($L(KEY)-1))_$C(($A($E(KEY,$L(KEY)))-1))_"~ "
  1. S SI=0 F S SI=$O(^ICDS(SI)) Q:+SI'>0 D Q:+OUT>0
  1. . N ORD,RES S ORD=ORG
  1. . S RES=$O(@(ROOT_"""ABA"","_+SI_","""_ORD_""")"))
  1. . Q:'$L(RES) S:$E(RES,$L(RES))=" " RES=$E(RES,1,($L(RES)-1))
  1. . I RES=KEY S OUT="1^"_SI_"^"_KEY Q
  1. . I $L(KEY)<$L(RES),KEY=$E(RES,1,$L(KEY)) S OUT="1^"_SI_"^"_KEY
  1. Q:+OUT>0 OUT
  1. Q 0
  1. UNQ(X,ROOT) ; Check if Text is a Unique Code
  1. ;
  1. ; Input
  1. ;
  1. ; X Input String/Code
  1. ; ROOT Global Root of file
  1. ;
  1. ; Output
  1. ;
  1. ; $$UNQ 3 Piece ^ delimited string
  1. ;
  1. ; Piece Content
  1. ; 1 String is Unique in file
  1. ; 1 if X is unique
  1. ; 0 if X is not unique
  1. ; 2 String is a Code
  1. ; 1 is a code
  1. ; 0 X is not a code
  1. ; 3 String has Multiple Entries
  1. ; 1 Yes, X occurs more than once
  1. ; 0 No, X occurs once (aka unique)
  1. ;
  1. ; or -1 if the code string X is not found
  1. ;
  1. N KEY,ORG,LAS,ORD,OUT,IENS,IEN,NXT,NIEN,SI,SYS Q:'$L($G(X)) -1
  1. S KEY=$TR($G(X),"""","") Q:'$L(KEY) -1
  1. S ORG=$E(KEY,1,($L(KEY)-1))_$C(($A($E(KEY,$L(KEY)))-1))_"~ "
  1. S OUT=-1,(IEN,NXT,SI)=0
  1. F S SI=$O(@(ROOT_"""ABA"","_+SI_")")) Q:+SI'>0 D Q:OUT>0 Q:+IEN>0 Q:+NXT>0
  1. . N ORD S ORD=ORG S IEN=$O(@(ROOT_"""ABA"","_+SI_","""_KEY_" "",0)"))
  1. . S (NXT,NIEN)=0
  1. . F S ORD=$O(@(ROOT_"""ABA"","_+SI_","""_ORD_""")")) Q:'$L(ORD) Q:$E(ORD,1,$L(KEY))'=KEY D
  1. . . S NIEN=0 F S NIEN=$O(@(ROOT_"""ABA"","_+SI_","""_ORD_""","_NIEN_")")) Q:+NIEN'>0 D
  1. . . . S:ORD'=(KEY_" ") IENS(+NIEN)=""
  1. S (NXT,NIEN)=0 F S NIEN=$O(IENS(NIEN)) Q:+NIEN'>0 S NXT=NXT+1
  1. S:+IEN>0 $P(OUT,"^",1)=1,$P(OUT,"^",2)=1
  1. I +IEN>0 S:+NXT>0 $P(OUT,"^",3)=1,$P(OUT,"^",1)=0
  1. I +($G(OUT))'<0 F SI=1:1:3 S $P(OUT,"^",SI)=+($P($G(OUT),"^",SI))
  1. I NXT>0,+IEN'>0 S OUT=$S(NXT>1:0,1:1)_"^0^"_$S(NXT>1:1,1:0)
  1. S X=OUT
  1. Q X
  1. ISORD(X) ; Check if in $ORDER
  1. Q:'$L($G(ORD)) 0 Q:'$L($G(KEY)) 0
  1. Q:$E($G(ORD),1,$L($G(KEY)))=$G(KEY) 1
  1. Q 0
  1. CDT(X,Y) ; ICD-10 Code Set Date
  1. N CDT,SYS S CDT=$G(X),SYS=+($G(Y)) S:CDT'?7N CDT=$$DT^XLFDT
  1. Q X
  1. SYS(ROOT,CDT) ; System from File and Date
  1. N FILE,CTL,FDT,NDT,IEN,SYS S (NDT,SYS)=0
  1. S FILE=$S($G(ROOT)="^ICD9(":80,$G(ROOT)="^ICD0(":80.1,1:"") Q:FILE'>0 0
  1. S CTL=$G(CDT) Q:CTL'?7N 0
  1. S IEN=0 F S IEN=$O(^ICDS("F",FILE,IEN)) Q:+IEN'>0 D
  1. . S FDT=$P($G(^ICDS(+IEN,0)),"^",4) Q:FDT'?7N
  1. . I FDT<(CTL+.001),FDT>NDT S FDT=CTL,SYS=IEN
  1. Q SYS
  1. SH ; Show TMP
  1. N SUB,NN,NC S SUB="ICD9" S:'$D(^TMP(SUB)) SUB="ICD0" Q:'$D(^TMP(SUB))
  1. S NN="^TMP("""_SUB_""","_$J_")",NC="^TMP("""_SUB_""","_$J_","
  1. W:'$D(@NN) ! Q:'$D(@NN) F S NN=$Q(@NN) Q:'$L(NN)!(NN'[NC) W !,NN,"=",@NN
  1. W !
  1. Q
  1. TM(X,Y) ; Trim Y
  1. S Y=$G(Y) S:'$L(Y) Y=" "
  1. F Q:$E(X,1)'=Y S X=$E(X,2,$L(X))
  1. F Q:$E(X,$L(X))'=Y S X=$E(X,1,($L(X)-1))
  1. Q X