- ICDEXS ;SLC/KER - ICD Extractor - Support ;12/19/2014
- ;;18.0;DRG Grouper;**57,67**;Oct 20, 2000;Build 1
- ;
- ; Global Variables
- ; ^ICD0( N/A
- ; ^ICD9( N/A
- ; ^ICDS( N/A
- ;
- ; External References
- ; $$GET1^DIQ ICR 2056
- ; $$DT^XLFDT ICR 10103
- ; $$FMTE^XLFDT ICR 10103
- ; $$UP^XLFSTR ICR 10104
- ;
- EFF(FILE,IEN,EDT) ; returns effective date and status for code/modifier
- ;
- ; Input:
- ;
- ; FILE File number 80/80.1 (required)
- ; IEN ICD IEN (required)
- ; EDT Date to check (FileMan format) (required)
- ;
- ; Output:
- ;
- ; A 3 piece "^" delimited string
- ;
- ; 1 Status
- ; 1 - Active
- ; 0 - Inactive
- ; 2 Inactivation Date
- ; 3 Activation Date
- ; -or-
- ; -1^error message
- ;
- N EFF,EFFB,EFFDOS,EFFDT,EFFN,EFFST,EFILE,ICDY,ROOT,STR
- I $G(IEN)=""!(IEN'?1N.N) Q "-1^No Code Selected"
- S FILE=$$FILE($G(FILE)) Q:+FILE'>0 "-1^Invalid File"
- S ROOT=$$ROOT(FILE)
- Q:"^ICD9(^ICD0(^"'[("^"_$E(ROOT,2,$L(ROOT))_"^") "-1^Invalid Global"
- Q:'$G(EDT) "-1^No Date Selected" S EDT=$P(EDT,".",1)
- Q:EDT'?7N "-1^Invalid Date Selected"
- S IEN=+($G(IEN)) Q:+IEN'>0 "-1^IEN Invalid" S EFILE=ROOT_IEN_",66,"
- S ICDY=$P($G(@(ROOT_+IEN_",1)")),"^",1) Q:+ICDY'>0 "-1^Invalid Coding System"
- S EDT=$S($G(EDT)="":$$DT^XLFDT,1:$$DTBR^ICDEX(EDT,,ICDY))+.001
- S EFF=$O(@(EFILE_"""B"","_EDT_")"),-1) Q:'EFF "0^^"
- S EFFN=$O(@(EFILE_"""B"","_EFF_",0)")),STR=$G(@(EFILE_EFFN_",0)")) Q:STR="" "0^^"
- S EFFDT=$P(STR,"^"),EFFST=$P(STR,"^",2),EFFB=0,EFF=+EFF
- F S EFF=$O(@(EFILE_"""B"","_EFF_")"),-1) Q:'EFF!EFFB D
- . S EFFN=$O(@(EFILE_"""B"","_EFF_",0)")) I 'EFFN S EFFB=1 Q
- . S EFFDOS=$G(@(EFILE_EFFN_",0)")) I 'EFFDOS S EFFB=1 Q
- . S EFFB=(EFFST'=$P(EFFDOS,"^",2))
- S EFFDOS=$P($G(EFFDOS),"^")
- I EFFST S $P(STR,"^",3,4)=(EFFDOS)_"^"_EFFDT
- E S $P(STR,"^",3,4)=EFFDT_"^"_(EFFDOS)
- Q $P(STR,"^",2,4)
- IA(FILE,IEN) ; Initial Activation Date
- ;
- ; Input:
- ;
- ; FILE Global Root/File Number (Required)
- ; IEN Internal Entry Number (Required)
- ;
- ; Output:
- ;
- ; $$IA Initial Activation Date OR -1 ^ Error Message
- ;
- N ROOT,EFF,HIS,NOD,ACT,INA
- S FILE=$$FILE($G(FILE)) Q:+FILE'>0 "-1^Invalid File" S ROOT=$$ROOT(FILE)
- Q:"^ICD9(^ICD0(^"'[("^"_$E(ROOT,2,$L(ROOT))_"^") "-1^Invalid Global"
- S IEN=$G(IEN) Q:+IEN'>0!('$D(@(ROOT_+IEN_")"))) "-1^Invalid Code"
- S ACT="",EFF=""
- F S EFF=$O(@(ROOT_+IEN_",66,""B"","""_EFF_""")")) Q:(EFF'?7N)!($L(ACT)) D Q:$L(ACT)
- . S HIS=" " F S HIS=$O(@(ROOT_+IEN_",66,""B"","_EFF_","""_HIS_""")"),-1) Q:+HIS'>0 D Q:$L(ACT)
- . . N NOD,STA S NOD=$G(@(ROOT_+IEN_",66,"_+HIS_",0)"))
- . . S STA=$P(NOD,"^",2) S:STA?1N&(+STA>0)&('$L(ACT)) ACT=EFF
- S:'$L(ACT) ACT="-1^Initial activation date not found"
- Q ACT
- LA(FILE,IEN,CDT) ; Last Current Activation Date
- ;
- ; Input:
- ;
- ; FILE Global Root/File Number (Required)
- ; IEN Internal Entry Number (Required)
- ; CDT Date (default = TODAY) (Optional)
- ;
- ; Output:
- ;
- ; $$LA Last Activation Date OR -1 ^ Error Message
- ;
- N ROOT,EFF,HIS,NOD,ACT,INA,ICDF
- S FILE=$$FILE($G(FILE)) Q:+FILE'>0 "-1^Invalid File" S ROOT=$$ROOT(FILE)
- Q:"^ICD9(^ICD0(^"'[("^"_$E(ROOT,2,$L(ROOT))_"^") "-1^Invalid Global"
- S CDT=$G(CDT) S:CDT'?7N CDT=$$DT^XLFDT S IEN=$G(IEN)
- Q:+IEN'>0!('$D(@(ROOT_+IEN_")"))) "-1^Invalid Code"
- S ACT="",EFF=CDT+.000001
- F S EFF=$O(@(ROOT_+IEN_",66,""B"","""_EFF_""")"),-1) Q:(EFF'?7N)!($L(ACT)) D Q:$L(ACT)
- . S HIS=" " F S HIS=$O(@(ROOT_+IEN_",66,""B"","_EFF_","""_HIS_""")"),-1) Q:+HIS'>0 D Q:$L(ACT)
- . . N NOD,STA S NOD=$G(@(ROOT_+IEN_",66,"_+HIS_",0)"))
- . . S STA=$P(NOD,"^",2) S:STA?1N&(+STA>0)&('$L(ACT)) ACT=EFF
- S:'$L(ACT) ACT="-1^Not activated on or before "_$$FMTE^XLFDT($G(CDT),"5DZ")
- Q ACT
- LI(FILE,IEN,CDT) ; Last Current Inactivation Date
- ;
- ; Input:
- ;
- ; IEN Internal Entry Number (Required)
- ; FILE Global Root/File Number (Required)
- ; CDT Date (default = TODAY) (Optional)
- ;
- ; Output:
- ;
- ; $$LI Last Inactivation Date OR -1 ^ Error Message
- ;
- N ROOT,EFF,HIS,NOD,ACT,INA
- S FILE=$$FILE($G(FILE)) Q:+FILE'>0 "-12^Invalid File" S ROOT=$$ROOT(FILE)
- Q:"^ICD9(^ICD0(^"'[("^"_$E(ROOT,2,$L(ROOT))_"^") "-1^Invalid Global"
- S CDT=$G(CDT) S:CDT'?7N CDT=$$DT^XLFDT S IEN=$G(IEN)
- Q:+IEN'>0!('$D(@(ROOT_+IEN_")"))) "-1^Invalid Code"
- S INA="",EFF=CDT+.000001
- F S EFF=$O(@(ROOT_+IEN_",66,""B"","""_EFF_""")"),-1) Q:'$L(EFF)!(EFF'?7N)!($L(INA)) D Q:$L(INA)
- . S HIS=" " F S HIS=$O(@(ROOT_+IEN_",66,""B"","_EFF_","""_HIS_""")"),-1) Q:+HIS'>0 D Q:$L(INA)
- . . N NOD,STA S NOD=$G(@(ROOT_+IEN_",66,"_+HIS_",0)"))
- . . S STA=$P(NOD,"^",2) S:STA?1N&(+STA'>0)&('$L(INA)) INA=EFF
- S:'$L(INA) INA="-1^Not inactivated on or before "_$$FMTE^XLFDT($G(CDT),"5DZ")
- Q INA
- LS(FILE,IEN,CDT,FMT) ; Last Status
- ;
- ; Input:
- ;
- ; FILE Global Root/File Number (Required)
- ; IEN Internal Entry Number (Required)
- ; CDT Date (default = TODAY) (Optional)
- ; FMT Format
- ; 0 Last Status only (default)
- ; 1 Last Status ^ Effective Date
- ;
- ; Output:
- ;
- ; $$LS Last Status (1/0) OR -1 ^ Error Message
- ;
- N ROOT,EFF,HIS,NOD,ACT,INA,LEF,STA
- S FILE=$$FILE($G(FILE)) Q:+FILE'>0 "-12^Invalid File" S ROOT=$$ROOT(FILE)
- Q:"^ICD9(^ICD0(^"'[("^"_$E(ROOT,2,$L(ROOT))_"^") "-1^Invalid Global"
- S CDT=$G(CDT) S:CDT'?7N CDT=$$DT^XLFDT S IEN=$G(IEN)
- Q:+IEN'>0!('$D(@(ROOT_+IEN_")"))) "-1^Invalid Code"
- S INA="",EFF=CDT+.000001 S EFF=$O(@(ROOT_+IEN_",66,""B"","""_EFF_""")"),-1)
- Q:'$L(EFF)!(EFF'?7N) "-1^No status on or before "_$$FMTE^XLFDT($G(CDT),"5DZ")
- S HIS="~",HIS=$O(@(ROOT_+IEN_",66,""B"","_EFF_","""_HIS_""")"),-1)
- Q:+HIS'>0 "-1^No status on or before "_$$FMTE^XLFDT($G(CDT),"5DZ")
- S NOD=$G(@(ROOT_+IEN_",66,"_+HIS_",0)")),STA=$P(NOD,"^",2),LEF=$P(NOD,"^",1)
- Q:"^0^1^"'[("^"_STA_"^") "-1^No status on or before "_$$FMTE^XLFDT($G(CDT),"5DZ")
- S:+($G(FMT))>0&($G(LEF)?7N) STA=STA_"^"_LEF
- Q STA
- ;
- NUM(CODE) ; Convert Code to a Numeric Value (opposite of $$COD)
- ;
- ; Input:
- ;
- ; CODE ICD CODE (required)
- ;
- ; Output:
- ;
- ; NUM Numerical representation of CODE
- ;
- ; or
- ;
- ; -1 on error
- ;
- S CODE=$G(CODE) Q:'$L($G(CODE)) 0
- N PSN,OUT,CHR,ERR S ERR=0,OUT="" F PSN=1:1:9 D
- . S CHR=$E(CODE,PSN) S CHR=$S($L(CHR):$A(CHR),1:32),CHR=CHR-30
- . S:CHR'>0 ERR=1 F Q:$L(CHR)>1 S CHR="0"_CHR
- . S:$L(CHR)'=2 ERR=1 S OUT=OUT_CHR
- Q:ERR -1 S:+OUT>0 OUT="1"_OUT
- Q OUT
- COD(NUM) ; Convert Numeric Value to a Code (opposite of $$NUM)
- ;
- ; Input:
- ;
- ; NUM Numerical representation of an ICD Code (required)
- ;
- ; Output:
- ;
- ; CODE ICD Code
- ;
- ; or
- ;
- ; null on error
- ;
- Q:'$L(NUM) "" Q:$E(NUM,1)'=1 "" S NUM=$E(NUM,2,$L(NUM))
- N PSN,OUT,CHR,ADD S OUT=""
- F PSN=1:2 S CHR=$E(NUM,PSN,(PSN+1)) Q:'$L(CHR) D
- . S CHR=+CHR+30 S ADD="" S:CHR'=32 ADD=$C(CHR) S:$L(ADD) OUT=OUT_ADD
- Q OUT
- IE(X) ; Internal or External
- ;
- ; Input:
- ;
- ; X ICD code or IEN
- ;
- ; Output:
- ;
- ; $$IE Set of Codes
- ;
- ; I Internal format (IEN)
- ; E External format (Code)
- ;
- ; Null on error
- ;
- N IN,OUT
- S IN=$G(X) Q:'$L(X) ""
- Q:IN?1N.N&('$D(^ICD9("BA",(IN_" "))))&('$D(^ICD0("BA",(IN_" ")))) "I"
- Q:$D(^ICD9("BA",(IN_" ")))!($D(^ICD0("BA",(IN_" ")))) "E"
- Q ""
- FILE(X) ; File Number
- ;
- ; Input:
- ;
- ; X File/Identifier/Coding System/Code (required)
- ;
- ; Output:
- ;
- ; FILE File Number or -1 on error
- ;
- N ICDX,ICDF S (ICDX,X)=$G(X) Q:'$L(X) -1 N ICDR
- I X?1N.N Q:X?1N&(+X=0) 80.1 Q:X?1N&(+X=9) 80
- S ICDR=$$ROOT(X) Q:$D(^ICD9("BA",(X_" "))) 80 Q:$D(^ICD0("BA",(X_" "))) 80.1
- Q:X=80 80 Q:X=80.1 80.1 Q:X["ICD9" 80 Q:X["ICD0" 80.1 Q:X["DX"!(X["DIAG") 80 Q:X["PR"!(X["PROC")!(X["OP")!(X["PCS") 80.1
- I ICDX?1N.N I ICDX'["." Q:$D(^ICD9("ABA",+ICDX)) 80 Q:$D(^ICD0("ABA",+ICDX)) 80.1
- Q:$D(^ICD9("BA",(X_" "))) 80 Q:$D(^ICD0("BA",(X_" "))) 80.1
- Q:$D(^ICD9("AVA",(X_" "))) 80 Q:$D(^ICD0("AVA",(X_" "))) 80.1
- Q:$D(^ICD9("AEXC",(X_" "))) 80 Q:$D(^ICD0("AEXC",(X_" "))) 80.1
- Q:ICDR["ICD9" 80 Q:ICDR["ICD0" 80.1
- Q -1
- ROOT(X) ; Global Root
- ;
- ; Input:
- ;
- ; X File Number, File Name, Root, Identifier
- ; or Coding System (required)
- ;
- ; Output:
- ;
- ; ROOT Global Root for File or null
- ;
- N ICDR,ICDF S ICDR=$$RY($G(X)) Q:$L(ICDR) ICDR
- S ICDR=$$RC($G(X)) Q:$L(ICDR) ICDR S X=$$UP^XLFSTR($G(X))
- S ICDR=$$RF($G(X)) Q:$L(ICDR) ICDR
- S ICDR=$$RR($G(X)) Q:$L(ICDR) ICDR
- S:X?1N.N ICDR=$$RS(+($G(X))) Q:$L(ICDR) ICDR
- Q ""
- RY(SYS) ; Global Root from System
- N FILE,ROOT S SYS=$G(SYS) Q:SYS'?1N.N "" Q:SYS=80!(SYS=80.1) "" Q:'$D(^ICDS(+SYS)) ""
- S FILE=$P($G(^ICDS(+SYS,0)),"^",3) Q:+FILE'>0 "" S ROOT=$$RF(FILE) Q:$L(ROOT) ROOT
- Q ""
- RF(FILE) ; Global Root from File
- Q:$G(FILE)=80 "^ICD9(" Q:$G(FILE)=80.1 "^ICD0("
- Q ""
- RR(ID) ; Global Root from Root or Identifier
- Q:ID["ICD9" "^ICD9(" Q:ID["ICD0" "^ICD0(" Q:ID="DX"!(ID["DIA") "^ICD9(" Q:ID="PR"!(ID["PRO")!(ID["OP") "^ICD0("
- Q:ID="ICD"!(ID="10D") "^ICD9(" Q:ID="ICP"!(ID="10P") "^ICD0("
- Q ""
- RS(SYS) ; Global Root from Coding System
- S SYS=$TR(SYS," ","") Q:$D(^ICD9("ABA",+SYS)) "^ICD9(" Q:$D(^ICD0("ABA",+SYS)) "^ICD0("
- Q ""
- RC(COD) ; Global Root from Code
- Q:$D(^ICD9("BA",($G(COD)_" "))) "^ICD9(" Q:$D(^ICD0("BA",($G(COD)_" "))) "^ICD0("
- Q:$D(^ICD9("AVA",(X_" "))) "^ICD9(" Q:$D(^ICD0("AVA",(X_" "))) "^ICD0("
- Q:$D(^ICD9("AEXC",(X_" "))) "^ICD9(" Q:$D(^ICD0("AEXC",(X_" "))) "^ICD0("
- Q ""
- ;
- SYS(SYS,CDT,FMT) ; Resolve System (uses file 80.4)
- ;
- ; Input:
- ;
- ; SYS System/Source Abbreviation/System Identifier/Code
- ; CDT Date (optional)
- ; FMT Output Format (optional)
- ;
- ; I Internal (default)
- ; E External
- ; B Both Internal ^ External
- ;
- ; Output:
- ;
- ; $$SYS System (numeric or alpha)
- ;
- ; Internal External
- ; 1 ICD-9-CM
- ; 2 ICD-9 Proc
- ; 30 ICD-10-CM
- ; 31 ICD-10-PCS
- ; or
- ; -1 on error
- ;
- N ICDC,ICDD,ICDF,ICDI,ICDO,ICDT,ICDU,ICDX,ICDT S ICDI=$G(SYS) Q:'$L(ICDI) -1
- S ICDD=$P($G(CDT),".",1) S ICDF=$$UP^XLFSTR($G(FMT)) S:'$L(ICDF) ICDF="I"
- S:"^E^B^"'[("^"_ICDF_"^") ICDF="I" S ICDU=$$UP^XLFSTR(ICDI)
- S ICDO=$$SC(ICDI) Q:+ICDO>0 $S(ICDF["B":(+ICDO_"^"_$$SNAM(+ICDO)),ICDF["E":$$SNAM(+ICDO),1:+ICDO)
- I ICDI?1N.N Q:$D(^ICDS(+ICDI)) $S(ICDF["B":(+ICDI_"^"_$$SNAM(+ICDI)),ICDF["E":$$SNAM(+ICDI),1:+ICDI)
- S ICDO=$$SS(ICDI) Q:+ICDO>0 $S(ICDF["B":(+ICDO_"^"_$$SNAM(+ICDO)),ICDF["E":$$SNAM(+ICDO),1:+ICDO)
- S ICDO=$$SM(ICDI,ICDD) Q:+ICDO>0 $S(ICDF["B":(+ICDO_"^"_$$SNAM(+ICDO)),ICDF["E":$$SNAM(+ICDO),1:+ICDO)
- S ICDO=$$SP(ICDI) Q:+ICDO>0 $S(ICDF["B":(+ICDO_"^"_$$SNAM(+ICDO)),ICDF["E":$$SNAM(+ICDO),1:+ICDO)
- Q -1
- SS(X) ; System from Coding System file 80.4
- N ICDC,ICDI,ICDO,ICDU S ICDI=$G(X) Q:'$L(ICDI) "" S ICDU=$$UP^XLFSTR(ICDI)
- S ICDO="",ICDC="AZ" F S ICDC=$O(^ICDS(ICDC)) Q:'$L(ICDC) D Q:+ICDO>0
- . Q:ICDC="F" N ICDT S ICDT=$O(^ICDS(ICDC,ICDI,0))
- . S:+ICDT'>0 ICDT=$O(^ICDS(ICDC,ICDU,0)) S:+ICDT>0 ICDO=ICDT
- Q ICDO
- SM(X,CDT) ; System from a Mnemonic
- N ICDD,ICDX,ICDO,ICDU S ICDU=$$UP^XLFSTR($G(X)) Q:'$L(ICDU) "" S ICDD=$G(CDT) S:ICDD'?7N ICDD=$$DT^XLFDT
- S ICDX=$P($G(^ICDS(30,0)),"^",4),ICDO=""
- I (ICDU["DIAG"!(ICDU["ICD9")!(ICDU="80")!(ICDU="DX")) I ICDD?7N,ICDX?7N S ICDO=$S(ICDD<ICDX:1,1:30)
- I (ICDU["PROC"!(ICDU["OPER")!(ICDU["ICD0")!(ICDU["ICP9")!(ICDU="80.1")!(ICDU="PR")) I ICDD?7N,ICDX?7N S ICDO=$S(ICDD<ICDX:2,1:31)
- Q ICDO
- SP(X) ; System from Pattern Match
- N ICDT,ICDI,ICDO S ICDO="",ICDT=$$UP^XLFSTR($G(X)) Q:'$L(ICDT) ""
- F Q:ICDT'["ICD" S ICDT=$P(ICDT,"ICD",1)_$P(ICDT,"ICD",2)
- Q:'$L(ICDT) "" S ICDI="" F S ICDI=$O(^ICDS("B",ICDI)) Q:'$L(ICDI) D Q:+ICDO>0
- . S:ICDT["9"&(ICDT["D")&(ICDT'["P")&(ICDI["9")&(ICDI["CM") ICDO=$O(^ICDS("B",ICDI,0)) Q:ICDO>0
- . S:ICDT["9"&((ICDT["P")!(ICDT["O"))&(ICDI["9")&(ICDI["P") ICDO=$O(^ICDS("B",ICDI,0)) Q:ICDO>0
- . S:ICDT["10"&(ICDT["D")&(ICDT'["P")&(ICDI["10")&(ICDI["CM") ICDO=$O(^ICDS("B",ICDI,0)) Q:ICDO>0
- . S:ICDT["10"&((ICDT["P")!(ICDT["O"))&(ICDI["10")&(ICDI["P") ICDO=$O(^ICDS("B",ICDI,0)) Q:ICDO>0
- Q ICDO
- SC(X) ; System from Code
- N ICDI,ICDC,ICDO,ICDR,ICDU S ICDI=$G(X) S ICDC=$TR(ICDI," ","") Q:'$L(ICDC) ""
- S ICDU=$$UP^XLFSTR(ICDC) S ICDO="" F ICDR="^ICD9(","^ICD0(" D Q:+ICDO>0
- . N TMP F TMP=ICDC,ICDU D Q:+ICDO>0
- . . N ICDS,ICDV,ICDE S ICDS=0 F S ICDS=$O(@(ICDR_"""ABA"","_ICDS_")")) Q:+ICDS'>0 D Q:ICDO>0
- . . . S:$D(@(ICDR_"""ABA"","_ICDS_","""_TMP_" "")")) ICDO=ICDS
- . . Q:ICDO>0 S ICDV=$O(@(ICDR_"""AVA"","""_TMP_" "",0)"))
- . . S:+ICDV>0 ICDO=$P($G(@(ICDR_+ICDV_",1)")),"^",1) Q:ICDO>0
- . . S ICDE=$O(@(ICDR_"""AEXC"","""_TMP_" "",0)"))
- . . S:+ICDE>0 ICDO=$P($G(@(ICDR_+ICDE_",1)")),"^",1) Q:ICDO>0
- Q ICDO
- SINFO(SYS,CDT) ; System Info (uses file 80.4)
- ;
- ; Input:
- ;
- ; SYS System/Source Abbreviation/System Identifier/Code
- ; CDT Date (optional)
- ;
- ; Output:
- ;
- ; $$SINFO System Info (numeric or alpha)
- ;
- ; Internal External
- ; 1 IEN to file 80.4
- ; 2 Coding System
- ; 3 Abbreviation
- ; 4 File Number
- ; 5 Implementation Date
- ; 6 Content
- ;
- ; or
- ; -1 on error
- ;
- N ICDD,ICDS,ICDN,ICDT
- S ICDD=$S($G(CDT)'?7N:$$DT^XLFDT,1:$G(CDT))
- S ICDS=$$SYS($G(SYS),ICDD,"I")
- Q:+ICDS'>0 "-1^Coding System Unknown"
- S ICDN=$G(^ICDS(+ICDS,0)) Q:'$L(ICDN) "-1^Coding System not found"
- S ICDT=$S($P(ICDN,"^",3)=80:"Diagnosis",$P(ICDN,"^",3)=80.1:"Procedure",1:"")
- S SYS=ICDS_"^"_ICDN S:$L(ICDT) SYS=SYS_"^"_ICDT
- Q SYS
- SNAM(SYS) ; System Name
- ;
- ; Input:
- ;
- ; SYS Numeric System Identifier (field 1.1)
- ;
- ; Output:
- ;
- ; $$SYS Character System Name
- ;
- ; or -1 on error
- ;
- S SYS=+($G(SYS)) S SYS=$P($G(^ICDS(+SYS,0)),"^",1)
- Q $S($L(SYS):SYS,1:-1)
- SAB(X,Y) ; Source Abbreviation
- ;
- ; Input:
- ;
- ; X Source Abbreviation or Identifier
- ; Y Date used to determine SAB
- ;
- ; Output:
- ;
- ; $$SAB 3 Character System Identifier
- ;
- N SYS,CDT,TY,VR,OUT,TMP,ICD10 S SYS=$G(X),CDT=$G(Y)
- S:CDT'?7N CDT=$$DT^XLFDT S ICD10=+($$IMP^ICDEX(30))
- S TMP=$$SYS(SYS,CDT) S:+TMP>0&($D(^ICDS(+TMP,0))) SYS=TMP
- Q:+SYS=1 "ICD" Q:+SYS=2 "ICP" Q:+SYS=30 "10D" Q:+SYS=31 "10P"
- Q:SYS="DIAG" $S(CDT'<ICD10:"10D",1:"ICD")
- Q:SYS["ICD9" $S(CDT'<ICD10:"10D",1:"ICD")
- Q:SYS="PROC" $S(CDT'<ICD10:"10P",1:"ICP")
- Q:SYS["ICD0" $S(CDT'<ICD10:"10P",1:"ICP")
- Q:"^ICD^ICP^10D^10P^"[("^"_SYS_"^") SYS
- Q ""
- EXC(FILE,IEN) ; Exclude From lookup
- ;
- ; Input:
- ;
- ; FILE File number 80 or 80.1
- ; IEN Internal Entry Number
- ;
- ; Output:
- ;
- ; $$EXC Boolean value 1 = Yes 0 = No
- ;
- N ICDF,ICDI,ICDR S ICDF=+($G(FILE)),ICDI=+($G(IEN)) Q:"^80^80.1^"'[("^"_ICDF_"^") 0
- S ICDR=$$ROOT(ICDF) Q:"^ICD9(^ICD0(^"'[("^"_$E(ICDR,2,$L(ICDR))_"^") 0 Q:'$D(@(ICDR_+ICDI_",0)")) 0
- Q $S(+($$GET1^DIQ(ICDF,(+ICDI_","),1.8))'>0:0,1:1)
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HICDEXS 15569 printed Feb 18, 2025@23:17:10 Page 2
- ICDEXS ;SLC/KER - ICD Extractor - Support ;12/19/2014
- +1 ;;18.0;DRG Grouper;**57,67**;Oct 20, 2000;Build 1
- +2 ;
- +3 ; Global Variables
- +4 ; ^ICD0( N/A
- +5 ; ^ICD9( N/A
- +6 ; ^ICDS( N/A
- +7 ;
- +8 ; External References
- +9 ; $$GET1^DIQ ICR 2056
- +10 ; $$DT^XLFDT ICR 10103
- +11 ; $$FMTE^XLFDT ICR 10103
- +12 ; $$UP^XLFSTR ICR 10104
- +13 ;
- EFF(FILE,IEN,EDT) ; returns effective date and status for code/modifier
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; FILE File number 80/80.1 (required)
- +5 ; IEN ICD IEN (required)
- +6 ; EDT Date to check (FileMan format) (required)
- +7 ;
- +8 ; Output:
- +9 ;
- +10 ; A 3 piece "^" delimited string
- +11 ;
- +12 ; 1 Status
- +13 ; 1 - Active
- +14 ; 0 - Inactive
- +15 ; 2 Inactivation Date
- +16 ; 3 Activation Date
- +17 ; -or-
- +18 ; -1^error message
- +19 ;
- +20 NEW EFF,EFFB,EFFDOS,EFFDT,EFFN,EFFST,EFILE,ICDY,ROOT,STR
- +21 IF $GET(IEN)=""!(IEN'?1N.N)
- QUIT "-1^No Code Selected"
- +22 SET FILE=$$FILE($GET(FILE))
- if +FILE'>0
- QUIT "-1^Invalid File"
- +23 SET ROOT=$$ROOT(FILE)
- +24 if "^ICD9(^ICD0(^"'[("^"_$EXTRACT(ROOT,2,$LENGTH(ROOT))_"^")
- QUIT "-1^Invalid Global"
- +25 if '$GET(EDT)
- QUIT "-1^No Date Selected"
- SET EDT=$PIECE(EDT,".",1)
- +26 if EDT'?7N
- QUIT "-1^Invalid Date Selected"
- +27 SET IEN=+($GET(IEN))
- if +IEN'>0
- QUIT "-1^IEN Invalid"
- SET EFILE=ROOT_IEN_",66,"
- +28 SET ICDY=$PIECE($GET(@(ROOT_+IEN_",1)")),"^",1)
- if +ICDY'>0
- QUIT "-1^Invalid Coding System"
- +29 SET EDT=$SELECT($GET(EDT)="":$$DT^XLFDT,1:$$DTBR^ICDEX(EDT,,ICDY))+.001
- +30 SET EFF=$ORDER(@(EFILE_"""B"","_EDT_")"),-1)
- if 'EFF
- QUIT "0^^"
- +31 SET EFFN=$ORDER(@(EFILE_"""B"","_EFF_",0)"))
- SET STR=$GET(@(EFILE_EFFN_",0)"))
- if STR=""
- QUIT "0^^"
- +32 SET EFFDT=$PIECE(STR,"^")
- SET EFFST=$PIECE(STR,"^",2)
- SET EFFB=0
- SET EFF=+EFF
- +33 FOR
- SET EFF=$ORDER(@(EFILE_"""B"","_EFF_")"),-1)
- if 'EFF!EFFB
- QUIT
- Begin DoDot:1
- +34 SET EFFN=$ORDER(@(EFILE_"""B"","_EFF_",0)"))
- IF 'EFFN
- SET EFFB=1
- QUIT
- +35 SET EFFDOS=$GET(@(EFILE_EFFN_",0)"))
- IF 'EFFDOS
- SET EFFB=1
- QUIT
- +36 SET EFFB=(EFFST'=$PIECE(EFFDOS,"^",2))
- End DoDot:1
- +37 SET EFFDOS=$PIECE($GET(EFFDOS),"^")
- +38 IF EFFST
- SET $PIECE(STR,"^",3,4)=(EFFDOS)_"^"_EFFDT
- +39 IF '$TEST
- SET $PIECE(STR,"^",3,4)=EFFDT_"^"_(EFFDOS)
- +40 QUIT $PIECE(STR,"^",2,4)
- IA(FILE,IEN) ; Initial Activation Date
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; FILE Global Root/File Number (Required)
- +5 ; IEN Internal Entry Number (Required)
- +6 ;
- +7 ; Output:
- +8 ;
- +9 ; $$IA Initial Activation Date OR -1 ^ Error Message
- +10 ;
- +11 NEW ROOT,EFF,HIS,NOD,ACT,INA
- +12 SET FILE=$$FILE($GET(FILE))
- if +FILE'>0
- QUIT "-1^Invalid File"
- SET ROOT=$$ROOT(FILE)
- +13 if "^ICD9(^ICD0(^"'[("^"_$EXTRACT(ROOT,2,$LENGTH(ROOT))_"^")
- QUIT "-1^Invalid Global"
- +14 SET IEN=$GET(IEN)
- if +IEN'>0!('$DATA(@(ROOT_+IEN_")")))
- QUIT "-1^Invalid Code"
- +15 SET ACT=""
- SET EFF=""
- +16 FOR
- SET EFF=$ORDER(@(ROOT_+IEN_",66,""B"","""_EFF_""")"))
- if (EFF'?7N)!($LENGTH(ACT))
- QUIT
- Begin DoDot:1
- +17 SET HIS=" "
- FOR
- SET HIS=$ORDER(@(ROOT_+IEN_",66,""B"","_EFF_","""_HIS_""")"),-1)
- if +HIS'>0
- QUIT
- Begin DoDot:2
- +18 NEW NOD,STA
- SET NOD=$GET(@(ROOT_+IEN_",66,"_+HIS_",0)"))
- +19 SET STA=$PIECE(NOD,"^",2)
- if STA?1N&(+STA>0)&('$LENGTH(ACT))
- SET ACT=EFF
- End DoDot:2
- if $LENGTH(ACT)
- QUIT
- End DoDot:1
- if $LENGTH(ACT)
- QUIT
- +20 if '$LENGTH(ACT)
- SET ACT="-1^Initial activation date not found"
- +21 QUIT ACT
- LA(FILE,IEN,CDT) ; Last Current Activation Date
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; FILE Global Root/File Number (Required)
- +5 ; IEN Internal Entry Number (Required)
- +6 ; CDT Date (default = TODAY) (Optional)
- +7 ;
- +8 ; Output:
- +9 ;
- +10 ; $$LA Last Activation Date OR -1 ^ Error Message
- +11 ;
- +12 NEW ROOT,EFF,HIS,NOD,ACT,INA,ICDF
- +13 SET FILE=$$FILE($GET(FILE))
- if +FILE'>0
- QUIT "-1^Invalid File"
- SET ROOT=$$ROOT(FILE)
- +14 if "^ICD9(^ICD0(^"'[("^"_$EXTRACT(ROOT,2,$LENGTH(ROOT))_"^")
- QUIT "-1^Invalid Global"
- +15 SET CDT=$GET(CDT)
- if CDT'?7N
- SET CDT=$$DT^XLFDT
- SET IEN=$GET(IEN)
- +16 if +IEN'>0!('$DATA(@(ROOT_+IEN_")")))
- QUIT "-1^Invalid Code"
- +17 SET ACT=""
- SET EFF=CDT+.000001
- +18 FOR
- SET EFF=$ORDER(@(ROOT_+IEN_",66,""B"","""_EFF_""")"),-1)
- if (EFF'?7N)!($LENGTH(ACT))
- QUIT
- Begin DoDot:1
- +19 SET HIS=" "
- FOR
- SET HIS=$ORDER(@(ROOT_+IEN_",66,""B"","_EFF_","""_HIS_""")"),-1)
- if +HIS'>0
- QUIT
- Begin DoDot:2
- +20 NEW NOD,STA
- SET NOD=$GET(@(ROOT_+IEN_",66,"_+HIS_",0)"))
- +21 SET STA=$PIECE(NOD,"^",2)
- if STA?1N&(+STA>0)&('$LENGTH(ACT))
- SET ACT=EFF
- End DoDot:2
- if $LENGTH(ACT)
- QUIT
- End DoDot:1
- if $LENGTH(ACT)
- QUIT
- +22 if '$LENGTH(ACT)
- SET ACT="-1^Not activated on or before "_$$FMTE^XLFDT($GET(CDT),"5DZ")
- +23 QUIT ACT
- LI(FILE,IEN,CDT) ; Last Current Inactivation Date
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; IEN Internal Entry Number (Required)
- +5 ; FILE Global Root/File Number (Required)
- +6 ; CDT Date (default = TODAY) (Optional)
- +7 ;
- +8 ; Output:
- +9 ;
- +10 ; $$LI Last Inactivation Date OR -1 ^ Error Message
- +11 ;
- +12 NEW ROOT,EFF,HIS,NOD,ACT,INA
- +13 SET FILE=$$FILE($GET(FILE))
- if +FILE'>0
- QUIT "-12^Invalid File"
- SET ROOT=$$ROOT(FILE)
- +14 if "^ICD9(^ICD0(^"'[("^"_$EXTRACT(ROOT,2,$LENGTH(ROOT))_"^")
- QUIT "-1^Invalid Global"
- +15 SET CDT=$GET(CDT)
- if CDT'?7N
- SET CDT=$$DT^XLFDT
- SET IEN=$GET(IEN)
- +16 if +IEN'>0!('$DATA(@(ROOT_+IEN_")")))
- QUIT "-1^Invalid Code"
- +17 SET INA=""
- SET EFF=CDT+.000001
- +18 FOR
- SET EFF=$ORDER(@(ROOT_+IEN_",66,""B"","""_EFF_""")"),-1)
- if '$LENGTH(EFF)!(EFF'?7N)!($LENGTH(INA))
- QUIT
- Begin DoDot:1
- +19 SET HIS=" "
- FOR
- SET HIS=$ORDER(@(ROOT_+IEN_",66,""B"","_EFF_","""_HIS_""")"),-1)
- if +HIS'>0
- QUIT
- Begin DoDot:2
- +20 NEW NOD,STA
- SET NOD=$GET(@(ROOT_+IEN_",66,"_+HIS_",0)"))
- +21 SET STA=$PIECE(NOD,"^",2)
- if STA?1N&(+STA'>0)&('$LENGTH(INA))
- SET INA=EFF
- End DoDot:2
- if $LENGTH(INA)
- QUIT
- End DoDot:1
- if $LENGTH(INA)
- QUIT
- +22 if '$LENGTH(INA)
- SET INA="-1^Not inactivated on or before "_$$FMTE^XLFDT($GET(CDT),"5DZ")
- +23 QUIT INA
- LS(FILE,IEN,CDT,FMT) ; Last Status
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; FILE Global Root/File Number (Required)
- +5 ; IEN Internal Entry Number (Required)
- +6 ; CDT Date (default = TODAY) (Optional)
- +7 ; FMT Format
- +8 ; 0 Last Status only (default)
- +9 ; 1 Last Status ^ Effective Date
- +10 ;
- +11 ; Output:
- +12 ;
- +13 ; $$LS Last Status (1/0) OR -1 ^ Error Message
- +14 ;
- +15 NEW ROOT,EFF,HIS,NOD,ACT,INA,LEF,STA
- +16 SET FILE=$$FILE($GET(FILE))
- if +FILE'>0
- QUIT "-12^Invalid File"
- SET ROOT=$$ROOT(FILE)
- +17 if "^ICD9(^ICD0(^"'[("^"_$EXTRACT(ROOT,2,$LENGTH(ROOT))_"^")
- QUIT "-1^Invalid Global"
- +18 SET CDT=$GET(CDT)
- if CDT'?7N
- SET CDT=$$DT^XLFDT
- SET IEN=$GET(IEN)
- +19 if +IEN'>0!('$DATA(@(ROOT_+IEN_")")))
- QUIT "-1^Invalid Code"
- +20 SET INA=""
- SET EFF=CDT+.000001
- SET EFF=$ORDER(@(ROOT_+IEN_",66,""B"","""_EFF_""")"),-1)
- +21 if '$LENGTH(EFF)!(EFF'?7N)
- QUIT "-1^No status on or before "_$$FMTE^XLFDT($GET(CDT),"5DZ")
- +22 SET HIS="~"
- SET HIS=$ORDER(@(ROOT_+IEN_",66,""B"","_EFF_","""_HIS_""")"),-1)
- +23 if +HIS'>0
- QUIT "-1^No status on or before "_$$FMTE^XLFDT($GET(CDT),"5DZ")
- +24 SET NOD=$GET(@(ROOT_+IEN_",66,"_+HIS_",0)"))
- SET STA=$PIECE(NOD,"^",2)
- SET LEF=$PIECE(NOD,"^",1)
- +25 if "^0^1^"'[("^"_STA_"^")
- QUIT "-1^No status on or before "_$$FMTE^XLFDT($GET(CDT),"5DZ")
- +26 if +($GET(FMT))>0&($GET(LEF)?7N)
- SET STA=STA_"^"_LEF
- +27 QUIT STA
- +28 ;
- NUM(CODE) ; Convert Code to a Numeric Value (opposite of $$COD)
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; CODE ICD CODE (required)
- +5 ;
- +6 ; Output:
- +7 ;
- +8 ; NUM Numerical representation of CODE
- +9 ;
- +10 ; or
- +11 ;
- +12 ; -1 on error
- +13 ;
- +14 SET CODE=$GET(CODE)
- if '$LENGTH($GET(CODE))
- QUIT 0
- +15 NEW PSN,OUT,CHR,ERR
- SET ERR=0
- SET OUT=""
- FOR PSN=1:1:9
- Begin DoDot:1
- +16 SET CHR=$EXTRACT(CODE,PSN)
- SET CHR=$SELECT($LENGTH(CHR):$ASCII(CHR),1:32)
- SET CHR=CHR-30
- +17 if CHR'>0
- SET ERR=1
- FOR
- if $LENGTH(CHR)>1
- QUIT
- SET CHR="0"_CHR
- +18 if $LENGTH(CHR)'=2
- SET ERR=1
- SET OUT=OUT_CHR
- End DoDot:1
- +19 if ERR
- QUIT -1
- if +OUT>0
- SET OUT="1"_OUT
- +20 QUIT OUT
- COD(NUM) ; Convert Numeric Value to a Code (opposite of $$NUM)
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; NUM Numerical representation of an ICD Code (required)
- +5 ;
- +6 ; Output:
- +7 ;
- +8 ; CODE ICD Code
- +9 ;
- +10 ; or
- +11 ;
- +12 ; null on error
- +13 ;
- +14 if '$LENGTH(NUM)
- QUIT ""
- if $EXTRACT(NUM,1)'=1
- QUIT ""
- SET NUM=$EXTRACT(NUM,2,$LENGTH(NUM))
- +15 NEW PSN,OUT,CHR,ADD
- SET OUT=""
- +16 FOR PSN=1:2
- SET CHR=$EXTRACT(NUM,PSN,(PSN+1))
- if '$LENGTH(CHR)
- QUIT
- Begin DoDot:1
- +17 SET CHR=+CHR+30
- SET ADD=""
- if CHR'=32
- SET ADD=$CHAR(CHR)
- if $LENGTH(ADD)
- SET OUT=OUT_ADD
- End DoDot:1
- +18 QUIT OUT
- IE(X) ; Internal or External
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; X ICD code or IEN
- +5 ;
- +6 ; Output:
- +7 ;
- +8 ; $$IE Set of Codes
- +9 ;
- +10 ; I Internal format (IEN)
- +11 ; E External format (Code)
- +12 ;
- +13 ; Null on error
- +14 ;
- +15 NEW IN,OUT
- +16 SET IN=$GET(X)
- if '$LENGTH(X)
- QUIT ""
- +17 if IN?1N.N&('$DATA(^ICD9("BA",(IN_" "))))&('$DATA(^ICD0("BA",(IN_" "))))
- QUIT "I"
- +18 if $DATA(^ICD9("BA",(IN_" ")))!($DATA(^ICD0("BA",(IN_" "))))
- QUIT "E"
- +19 QUIT ""
- FILE(X) ; File Number
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; X File/Identifier/Coding System/Code (required)
- +5 ;
- +6 ; Output:
- +7 ;
- +8 ; FILE File Number or -1 on error
- +9 ;
- +10 NEW ICDX,ICDF
- SET (ICDX,X)=$GET(X)
- if '$LENGTH(X)
- QUIT -1
- NEW ICDR
- +11 IF X?1N.N
- if X?1N&(+X=0)
- QUIT 80.1
- if X?1N&(+X=9)
- QUIT 80
- +12 SET ICDR=$$ROOT(X)
- if $DATA(^ICD9("BA",(X_" ")))
- QUIT 80
- if $DATA(^ICD0("BA",(X_" ")))
- QUIT 80.1
- +13 if X=80
- QUIT 80
- if X=80.1
- QUIT 80.1
- if X["ICD9"
- QUIT 80
- if X["ICD0"
- QUIT 80.1
- if X["DX"!(X["DIAG")
- QUIT 80
- if X["PR"!(X["PROC")!(X["OP")!(X["PCS")
- QUIT 80.1
- +14 IF ICDX?1N.N
- IF ICDX'["."
- if $DATA(^ICD9("ABA",+ICDX))
- QUIT 80
- if $DATA(^ICD0("ABA",+ICDX))
- QUIT 80.1
- +15 if $DATA(^ICD9("BA",(X_" ")))
- QUIT 80
- if $DATA(^ICD0("BA",(X_" ")))
- QUIT 80.1
- +16 if $DATA(^ICD9("AVA",(X_" ")))
- QUIT 80
- if $DATA(^ICD0("AVA",(X_" ")))
- QUIT 80.1
- +17 if $DATA(^ICD9("AEXC",(X_" ")))
- QUIT 80
- if $DATA(^ICD0("AEXC",(X_" ")))
- QUIT 80.1
- +18 if ICDR["ICD9"
- QUIT 80
- if ICDR["ICD0"
- QUIT 80.1
- +19 QUIT -1
- ROOT(X) ; Global Root
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; X File Number, File Name, Root, Identifier
- +5 ; or Coding System (required)
- +6 ;
- +7 ; Output:
- +8 ;
- +9 ; ROOT Global Root for File or null
- +10 ;
- +11 NEW ICDR,ICDF
- SET ICDR=$$RY($GET(X))
- if $LENGTH(ICDR)
- QUIT ICDR
- +12 SET ICDR=$$RC($GET(X))
- if $LENGTH(ICDR)
- QUIT ICDR
- SET X=$$UP^XLFSTR($GET(X))
- +13 SET ICDR=$$RF($GET(X))
- if $LENGTH(ICDR)
- QUIT ICDR
- +14 SET ICDR=$$RR($GET(X))
- if $LENGTH(ICDR)
- QUIT ICDR
- +15 if X?1N.N
- SET ICDR=$$RS(+($GET(X)))
- if $LENGTH(ICDR)
- QUIT ICDR
- +16 QUIT ""
- RY(SYS) ; Global Root from System
- +1 NEW FILE,ROOT
- SET SYS=$GET(SYS)
- if SYS'?1N.N
- QUIT ""
- if SYS=80!(SYS=80.1)
- QUIT ""
- if '$DATA(^ICDS(+SYS))
- QUIT ""
- +2 SET FILE=$PIECE($GET(^ICDS(+SYS,0)),"^",3)
- if +FILE'>0
- QUIT ""
- SET ROOT=$$RF(FILE)
- if $LENGTH(ROOT)
- QUIT ROOT
- +3 QUIT ""
- RF(FILE) ; Global Root from File
- +1 if $GET(FILE)=80
- QUIT "^ICD9("
- if $GET(FILE)=80.1
- QUIT "^ICD0("
- +2 QUIT ""
- RR(ID) ; Global Root from Root or Identifier
- +1 if ID["ICD9"
- QUIT "^ICD9("
- if ID["ICD0"
- QUIT "^ICD0("
- if ID="DX"!(ID["DIA")
- QUIT "^ICD9("
- if ID="PR"!(ID["PRO")!(ID["OP")
- QUIT "^ICD0("
- +2 if ID="ICD"!(ID="10D")
- QUIT "^ICD9("
- if ID="ICP"!(ID="10P")
- QUIT "^ICD0("
- +3 QUIT ""
- RS(SYS) ; Global Root from Coding System
- +1 SET SYS=$TRANSLATE(SYS," ","")
- if $DATA(^ICD9("ABA",+SYS))
- QUIT "^ICD9("
- if $DATA(^ICD0("ABA",+SYS))
- QUIT "^ICD0("
- +2 QUIT ""
- RC(COD) ; Global Root from Code
- +1 if $DATA(^ICD9("BA",($GET(COD)_" ")))
- QUIT "^ICD9("
- if $DATA(^ICD0("BA",($GET(COD)_" ")))
- QUIT "^ICD0("
- +2 if $DATA(^ICD9("AVA",(X_" ")))
- QUIT "^ICD9("
- if $DATA(^ICD0("AVA",(X_" ")))
- QUIT "^ICD0("
- +3 if $DATA(^ICD9("AEXC",(X_" ")))
- QUIT "^ICD9("
- if $DATA(^ICD0("AEXC",(X_" ")))
- QUIT "^ICD0("
- +4 QUIT ""
- +5 ;
- SYS(SYS,CDT,FMT) ; Resolve System (uses file 80.4)
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; SYS System/Source Abbreviation/System Identifier/Code
- +5 ; CDT Date (optional)
- +6 ; FMT Output Format (optional)
- +7 ;
- +8 ; I Internal (default)
- +9 ; E External
- +10 ; B Both Internal ^ External
- +11 ;
- +12 ; Output:
- +13 ;
- +14 ; $$SYS System (numeric or alpha)
- +15 ;
- +16 ; Internal External
- +17 ; 1 ICD-9-CM
- +18 ; 2 ICD-9 Proc
- +19 ; 30 ICD-10-CM
- +20 ; 31 ICD-10-PCS
- +21 ; or
- +22 ; -1 on error
- +23 ;
- +24 NEW ICDC,ICDD,ICDF,ICDI,ICDO,ICDT,ICDU,ICDX,ICDT
- SET ICDI=$GET(SYS)
- if '$LENGTH(ICDI)
- QUIT -1
- +25 SET ICDD=$PIECE($GET(CDT),".",1)
- SET ICDF=$$UP^XLFSTR($GET(FMT))
- if '$LENGTH(ICDF)
- SET ICDF="I"
- +26 if "^E^B^"'[("^"_ICDF_"^")
- SET ICDF="I"
- SET ICDU=$$UP^XLFSTR(ICDI)
- +27 SET ICDO=$$SC(ICDI)
- if +ICDO>0
- QUIT $SELECT(ICDF["B":(+ICDO_"^"_$$SNAM(+ICDO)),ICDF["E":$$SNAM(+ICDO),1:+ICDO)
- +28 IF ICDI?1N.N
- if $DATA(^ICDS(+ICDI))
- QUIT $SELECT(ICDF["B":(+ICDI_"^"_$$SNAM(+ICDI)),ICDF["E":$$SNAM(+ICDI),1:+ICDI)
- +29 SET ICDO=$$SS(ICDI)
- if +ICDO>0
- QUIT $SELECT(ICDF["B":(+ICDO_"^"_$$SNAM(+ICDO)),ICDF["E":$$SNAM(+ICDO),1:+ICDO)
- +30 SET ICDO=$$SM(ICDI,ICDD)
- if +ICDO>0
- QUIT $SELECT(ICDF["B":(+ICDO_"^"_$$SNAM(+ICDO)),ICDF["E":$$SNAM(+ICDO),1:+ICDO)
- +31 SET ICDO=$$SP(ICDI)
- if +ICDO>0
- QUIT $SELECT(ICDF["B":(+ICDO_"^"_$$SNAM(+ICDO)),ICDF["E":$$SNAM(+ICDO),1:+ICDO)
- +32 QUIT -1
- SS(X) ; System from Coding System file 80.4
- +1 NEW ICDC,ICDI,ICDO,ICDU
- SET ICDI=$GET(X)
- if '$LENGTH(ICDI)
- QUIT ""
- SET ICDU=$$UP^XLFSTR(ICDI)
- +2 SET ICDO=""
- SET ICDC="AZ"
- FOR
- SET ICDC=$ORDER(^ICDS(ICDC))
- if '$LENGTH(ICDC)
- QUIT
- Begin DoDot:1
- +3 if ICDC="F"
- QUIT
- NEW ICDT
- SET ICDT=$ORDER(^ICDS(ICDC,ICDI,0))
- +4 if +ICDT'>0
- SET ICDT=$ORDER(^ICDS(ICDC,ICDU,0))
- if +ICDT>0
- SET ICDO=ICDT
- End DoDot:1
- if +ICDO>0
- QUIT
- +5 QUIT ICDO
- SM(X,CDT) ; System from a Mnemonic
- +1 NEW ICDD,ICDX,ICDO,ICDU
- SET ICDU=$$UP^XLFSTR($GET(X))
- if '$LENGTH(ICDU)
- QUIT ""
- SET ICDD=$GET(CDT)
- if ICDD'?7N
- SET ICDD=$$DT^XLFDT
- +2 SET ICDX=$PIECE($GET(^ICDS(30,0)),"^",4)
- SET ICDO=""
- +3 IF (ICDU["DIAG"!(ICDU["ICD9")!(ICDU="80")!(ICDU="DX"))
- IF ICDD?7N
- IF ICDX?7N
- SET ICDO=$SELECT(ICDD<ICDX:1,1:30)
- +4 IF (ICDU["PROC"!(ICDU["OPER")!(ICDU["ICD0")!(ICDU["ICP9")!(ICDU="80.1")!(ICDU="PR"))
- IF ICDD?7N
- IF ICDX?7N
- SET ICDO=$SELECT(ICDD<ICDX:2,1:31)
- +5 QUIT ICDO
- SP(X) ; System from Pattern Match
- +1 NEW ICDT,ICDI,ICDO
- SET ICDO=""
- SET ICDT=$$UP^XLFSTR($GET(X))
- if '$LENGTH(ICDT)
- QUIT ""
- +2 FOR
- if ICDT'["ICD"
- QUIT
- SET ICDT=$PIECE(ICDT,"ICD",1)_$PIECE(ICDT,"ICD",2)
- +3 if '$LENGTH(ICDT)
- QUIT ""
- SET ICDI=""
- FOR
- SET ICDI=$ORDER(^ICDS("B",ICDI))
- if '$LENGTH(ICDI)
- QUIT
- Begin DoDot:1
- +4 if ICDT["9"&(ICDT["D")&(ICDT'["P")&(ICDI["9")&(ICDI["CM")
- SET ICDO=$ORDER(^ICDS("B",ICDI,0))
- if ICDO>0
- QUIT
- +5 if ICDT["9"&((ICDT["P")!(ICDT["O"))&(ICDI["9")&(ICDI["P")
- SET ICDO=$ORDER(^ICDS("B",ICDI,0))
- if ICDO>0
- QUIT
- +6 if ICDT["10"&(ICDT["D")&(ICDT'["P")&(ICDI["10")&(ICDI["CM")
- SET ICDO=$ORDER(^ICDS("B",ICDI,0))
- if ICDO>0
- QUIT
- +7 if ICDT["10"&((ICDT["P")!(ICDT["O"))&(ICDI["10")&(ICDI["P")
- SET ICDO=$ORDER(^ICDS("B",ICDI,0))
- if ICDO>0
- QUIT
- End DoDot:1
- if +ICDO>0
- QUIT
- +8 QUIT ICDO
- SC(X) ; System from Code
- +1 NEW ICDI,ICDC,ICDO,ICDR,ICDU
- SET ICDI=$GET(X)
- SET ICDC=$TRANSLATE(ICDI," ","")
- if '$LENGTH(ICDC)
- QUIT ""
- +2 SET ICDU=$$UP^XLFSTR(ICDC)
- SET ICDO=""
- FOR ICDR="^ICD9(","^ICD0("
- Begin DoDot:1
- +3 NEW TMP
- FOR TMP=ICDC,ICDU
- Begin DoDot:2
- +4 NEW ICDS,ICDV,ICDE
- SET ICDS=0
- FOR
- SET ICDS=$ORDER(@(ICDR_"""ABA"","_ICDS_")"))
- if +ICDS'>0
- QUIT
- Begin DoDot:3
- +5 if $DATA(@(ICDR_"""ABA"","_ICDS_","""_TMP_" "")"))
- SET ICDO=ICDS
- End DoDot:3
- if ICDO>0
- QUIT
- +6 if ICDO>0
- QUIT
- SET ICDV=$ORDER(@(ICDR_"""AVA"","""_TMP_" "",0)"))
- +7 if +ICDV>0
- SET ICDO=$PIECE($GET(@(ICDR_+ICDV_",1)")),"^",1)
- if ICDO>0
- QUIT
- +8 SET ICDE=$ORDER(@(ICDR_"""AEXC"","""_TMP_" "",0)"))
- +9 if +ICDE>0
- SET ICDO=$PIECE($GET(@(ICDR_+ICDE_",1)")),"^",1)
- if ICDO>0
- QUIT
- End DoDot:2
- if +ICDO>0
- QUIT
- End DoDot:1
- if +ICDO>0
- QUIT
- +10 QUIT ICDO
- SINFO(SYS,CDT) ; System Info (uses file 80.4)
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; SYS System/Source Abbreviation/System Identifier/Code
- +5 ; CDT Date (optional)
- +6 ;
- +7 ; Output:
- +8 ;
- +9 ; $$SINFO System Info (numeric or alpha)
- +10 ;
- +11 ; Internal External
- +12 ; 1 IEN to file 80.4
- +13 ; 2 Coding System
- +14 ; 3 Abbreviation
- +15 ; 4 File Number
- +16 ; 5 Implementation Date
- +17 ; 6 Content
- +18 ;
- +19 ; or
- +20 ; -1 on error
- +21 ;
- +22 NEW ICDD,ICDS,ICDN,ICDT
- +23 SET ICDD=$SELECT($GET(CDT)'?7N:$$DT^XLFDT,1:$GET(CDT))
- +24 SET ICDS=$$SYS($GET(SYS),ICDD,"I")
- +25 if +ICDS'>0
- QUIT "-1^Coding System Unknown"
- +26 SET ICDN=$GET(^ICDS(+ICDS,0))
- if '$LENGTH(ICDN)
- QUIT "-1^Coding System not found"
- +27 SET ICDT=$SELECT($PIECE(ICDN,"^",3)=80:"Diagnosis",$PIECE(ICDN,"^",3)=80.1:"Procedure",1:"")
- +28 SET SYS=ICDS_"^"_ICDN
- if $LENGTH(ICDT)
- SET SYS=SYS_"^"_ICDT
- +29 QUIT SYS
- SNAM(SYS) ; System Name
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; SYS Numeric System Identifier (field 1.1)
- +5 ;
- +6 ; Output:
- +7 ;
- +8 ; $$SYS Character System Name
- +9 ;
- +10 ; or -1 on error
- +11 ;
- +12 SET SYS=+($GET(SYS))
- SET SYS=$PIECE($GET(^ICDS(+SYS,0)),"^",1)
- +13 QUIT $SELECT($LENGTH(SYS):SYS,1:-1)
- SAB(X,Y) ; Source Abbreviation
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; X Source Abbreviation or Identifier
- +5 ; Y Date used to determine SAB
- +6 ;
- +7 ; Output:
- +8 ;
- +9 ; $$SAB 3 Character System Identifier
- +10 ;
- +11 NEW SYS,CDT,TY,VR,OUT,TMP,ICD10
- SET SYS=$GET(X)
- SET CDT=$GET(Y)
- +12 if CDT'?7N
- SET CDT=$$DT^XLFDT
- SET ICD10=+($$IMP^ICDEX(30))
- +13 SET TMP=$$SYS(SYS,CDT)
- if +TMP>0&($DATA(^ICDS(+TMP,0)))
- SET SYS=TMP
- +14 if +SYS=1
- QUIT "ICD"
- if +SYS=2
- QUIT "ICP"
- if +SYS=30
- QUIT "10D"
- if +SYS=31
- QUIT "10P"
- +15 if SYS="DIAG"
- QUIT $SELECT(CDT'<ICD10:"10D",1:"ICD")
- +16 if SYS["ICD9"
- QUIT $SELECT(CDT'<ICD10:"10D",1:"ICD")
- +17 if SYS="PROC"
- QUIT $SELECT(CDT'<ICD10:"10P",1:"ICP")
- +18 if SYS["ICD0"
- QUIT $SELECT(CDT'<ICD10:"10P",1:"ICP")
- +19 if "^ICD^ICP^10D^10P^"[("^"_SYS_"^")
- QUIT SYS
- +20 QUIT ""
- EXC(FILE,IEN) ; Exclude From lookup
- +1 ;
- +2 ; Input:
- +3 ;
- +4 ; FILE File number 80 or 80.1
- +5 ; IEN Internal Entry Number
- +6 ;
- +7 ; Output:
- +8 ;
- +9 ; $$EXC Boolean value 1 = Yes 0 = No
- +10 ;
- +11 NEW ICDF,ICDI,ICDR
- SET ICDF=+($GET(FILE))
- SET ICDI=+($GET(IEN))
- if "^80^80.1^"'[("^"_ICDF_"^")
- QUIT 0
- +12 SET ICDR=$$ROOT(ICDF)
- if "^ICD9(^ICD0(^"'[("^"_$EXTRACT(ICDR,2,$LENGTH(ICDR))_"^")
- QUIT 0
- if '$DATA(@(ICDR_+ICDI_",0)"))
- QUIT 0
- +13 QUIT $SELECT(+($$GET1^DIQ(ICDF,(+ICDI_","),1.8))'>0:0,1:1)