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