ICDCODLK ;KUM - LOOK UP ICD-10 PROCEDURE CODE;12/07/2011
;;18.0;DRG Grouper;**64**;Oct 20, 2000;Build 103
;
; ICDDATE is EFFECTIVE DATE that passed from Calling Routine
;
EN ; Initialize variables
W @IOF D LOOK
G EXIT
LOOK ; Look-up term
W !! K X S ICDPRC="" D ASK K DIC
AGAIN ; Try again?
W !,"Try another" S %=$S(+($$X):1,1:2)
D YN^DICN I %=-1!(%=2) Q
I '% W !!,"You have searched for a string in the Lexicon, do you want to" G AGAIN
I +($$X)&(%=1) G LOOK
I '+($$X)&(%=1) G LOOK
I (+($$X)&(%=2))!('+($$X)&(%=1)) Q
G LOOK Q
ASK ; Get user input
N DUOUT,DTOUT,DIR,DIRUT,DIROUT,ICDDATE1,ICDT1,ICDX,ICDXX,ICDPRT
I $G(ICDXX1) S ICDPRT="Enter Operation/Procedure (ICD 10):"
I $G(ICDDATE)="" D EFFDATE^ICDDRGM G EXIT:$D(DUOUT),EXIT:$D(DTOUT)
I $G(ICDDATE)'="" S ICDDATE1=ICDDATE
S ICDRES=1
I $G(ICDPRC)="" S ICDPRC="" D GICDPRC
I ICDPRC="" S ICDX=0
I ICDPRC'="" S ICDX=1
I ICDPRC'["*" G ASKCONT1
I ICDPRC["*" S ICDPRC=$P(ICDPRC,"*",1) ; D GICDPRC
;S ICDPRC="",ICDX=0
F ICDT1=1:1 Q:($L($G(ICDPRC))>=7)!(ICDPRC["^")!(ICDRES=0) D
. S ICDRES=$$PCSDIG^LEX10CS(ICDPRC,ICDDATE1)
. I ICDRES=1 D
. . D LOAD
. . D PRCDESCB
. . D PRCDESC
. . S X=$$SEL^ICDSELPS(.ICDS,5)
. . I X'=-1 S ICDPRC=ICDPRC_$P(X,"^",1)
. . S ICDX=1
. . D GICDPRC
. I ICDRES'=1 W !,ICDPRC_" IS NOT A VALID ICD PROCEDURE CODE" G EXIT
I $G(ICDXX1),ICDPRC["^^" S ICDPRC=$E(ICDPRC,1,$L(ICDPRC)-2)
I '$G(ICDXX1),ICDPRC["^" G EXIT
ASKCONT1 ; Tag to continue when ICDPRC doesnt have *
I $L($G(ICDPRC))=7&(ICDPRC'["^") D
. S ICDRES=$$PCSDIG^LEX10CS(ICDPRC,ICDDATE1)
. I ICDRES=1 D
. . S ICDPDESC=LEXPCDAT("PCSDESC")
. . S ICDPSTS=LEXPCDAT("STATUS")
. . D PRCDESCB
. . D PRCDESC
. . W !!,ICDPRC,?15,ICDPDESC,! ;add printing of descript disclaimer msg
. . I $G(ICDXX1) S ICDXX=+$$CODEN^ICDEX(ICDPRC,80.1)
. . I '$P(ICDPSTS,"^",1) W " **CODE INACTIVE" I $P(ICDPSTS,"^",2)'="" S Y=$P(ICDPSTS,"^",2) D DD^%DT W " AS OF ",Y," **",!
. I ICDRES'=1 D
. . W !,ICDPRC_" IS NOT A VALID PROCEDURE CODE."
I $L($G(ICDPRC))=7&(ICDPRC'["^")&(ICDRES=1)&('$P($G(ICDPSTS),"^",1)) G ASKCNT2
I $L($G(ICDPRC))'=7,ICDPRC'="",ICDPRC'["^" S ICDRES=0 W !,ICDPRC_" IS NOT A VALID ICD PROCEDURE CODE"_$S($G(ICDXX1):". IGNORING THE PROCEDURE CODE",1:".")
S (X,Y)=""
I ICDPRC["^" S X="^",Y=""
S:$G(ICDXX) (X,Y)=ICDXX
I $G(ICDXX1) D
. I (ICDRES'=1)!(($L($G(ICDPRC))'=7)&(ICDPRC'="")&(ICDPRC'["^")) S X=0 R ICDQWE:300 K ICDQWE Q
. I ICDPRC'="" D
. . W !,"OK? (Yes/No) " S %=1
. . D YN^DICN
. . I %'=1 S X=0
ASKCNT2 K ICDDATE1,ICDRES,ICDPDESC,ICDPSTS,LEXPCDAT,ICDPRCT,ICDPRCX,ICDLEX
Q
INPHLP ; Look-up help
Q:X["^^" "^^" Q:X["^" "^"
W !," Enter a ""free text"" term. Best results occur using one to "
W !," three full or partial words without a suffix"
W:$G(X)'["??" "."
W:$G(X)["??" " (i.e., ""DIABETES"","
W:$G(X)["??" !," ""DIAB MELL"",""DIAB MELL INSUL"")"
W !," or "
W !," Enter a classification code (ICD/CPT etc) to find the single "
W !," term associated with the code."
W:$G(X)["??" " Example, a lookup of code 239.0 "
W:$G(X)["??" !," returns one and only one term, that is the preferred "
W:$G(X)["??" !," term for the code 239.0, ""Neoplasm of unspecified nature "
W:$G(X)["??" !," of digestive system"""
W !," or "
W !," Enter a classification code (ICD/CPT etc) followed by a plus"
W !," sign (+) to retrieve all terms associated with the code."
W:$G(X)["??" " Example,"
W:$G(X)["??" !," a lookup of 239.0+ returns all terms that are linked to the "
W:$G(X)["??" !," code 239.0."
Q
EXIT ; Clean up environment and quit
K %,DIC,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y,ICDLEX,ICDPRCX,ICDPRCT
Q
X(ICDLEX) ; Evaluate X
Q:$L($G(X)) 1 Q 0
Y(ICDLEX) ; Evaluate Y
Q:+($G(Y))>1 1 Q 0
LOAD ; Load data
K ICDS
S ICDLOAD1=1
S ICDLOADP=""
S ICDLOAD="" F S ICDLOAD=$O(LEXPCDAT("NEXLEV",ICDLOAD)) Q:ICDLOAD="" D
. I ICDLOAD'=ICDLOADP D
. . S ICDS(ICDLOAD1,0)=ICDLOAD
. . S ICDS(ICDLOAD1,"LEX")=LEXPCDAT("NEXLEV",ICDLOAD,"DESC")
. . S ICDLOAD1=ICDLOAD1+1
. . S ICDLOADP=ICDLOAD
K ICDLOAD1,ICDLOADP,ICDLOAD
Q
PRCDESC ; Display Descriptions of each character
S ICDPRCT=ICDPRC,ICDPRCT1="",ICDX=0
F ICDTEMP=1:1 Q:ICDPRCT="" D
. S ICDC=$E(ICDPRCT,1,1)
. S ICDRES=$$PCSDIG^LEX10CS(ICDPRCT1,ICDDATE1)
. I ICDRES'=1 D
. . S ICDPRCT=""
. I ICDRES=1 D
. . S ICDLOAD="" F S ICDLOAD=$O(LEXPCDAT("NEXLEV",ICDLOAD)) Q:ICDLOAD=""!(ICDLOAD=ICDC)
. . I ICDLOAD=ICDC W ICDC_" - "_LEXPCDAT("NEXLEV",ICDLOAD,"DESC") W !
. . S ICDPRCT=$E(ICDPRCT,2,$L(ICDPRCT))
. . S ICDPRCT1=ICDPRCT1_ICDC
K ICDTEMP,ICDPRCT,ICDPRCT1,ICDC,ICDLOAD
Q
GICDPRC ; Get ICDPRC from User
S ICDPRCX="" S ICDPRCT=""
AA ; Read character by character
W @IOF
I $G(ICDX)=1 D PRCDESC W !
W "Press '*' to display available choices for next character or '^' to exit."
I $G(ICDPRT)="" S ICDPRT="ICD-10 Procedure code:"
W !,ICDPRT_ICDPRC S ICDREAD="R *ICDA:300 I '$T S ICDA=13"
X ICDREAD
; Show choices on "*"
I ICDA=42 G BB
; Exit when Enter and is full length else ignore
;I ICDA=13 G:$L(ICDPRC)>6 BB S ICDX=1 G AA
I ICDA=13,$G(ICDXX1) S:$L(ICDPRC)'=7 ICDPRC=ICDPRC_$C(94)_$C(94) G BB
I ICDA=13,'$G(ICDXX1) G:$L(ICDPRC)>6 BB S ICDX=1 G AA
; If Backspace is entered, truncate last character and display the ICDPRC
I ICDA=127 S ICDPRC=$E(ICDPRC,1,$L(ICDPRC)-1) S ICDX=1 G AA
; If ^ is entered, exit
I ICDA=94 S ICDPRC=ICDPRC_$C(ICDA) G BB
; check for valid characters
I ICDA<48!((ICDA>57)&(ICDA<65))!((ICDA>90)&(ICDA<97))!(ICDA>122) G AA
; Any character other than Enter or Backspace
I ICDA'=127 D
. S ICDPRC=ICDPRC_$C(ICDA)
. S ICDX=1 G AA
BB ;Exit
W !
K ICDA,ICDREAD
Q
PRCDESCB ; Call Before PRCDESC
W @IOF
W "Press '*' to display available choices for next character or '^' to exit."
W !,"ICD-10 Procedure code:"_ICDPRC
W !
Q
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HICDCODLK 5961 printed Oct 16, 2024@17:50:44 Page 2
ICDCODLK ;KUM - LOOK UP ICD-10 PROCEDURE CODE;12/07/2011
+1 ;;18.0;DRG Grouper;**64**;Oct 20, 2000;Build 103
+2 ;
+3 ; ICDDATE is EFFECTIVE DATE that passed from Calling Routine
+4 ;
EN ; Initialize variables
+1 WRITE @IOF
DO LOOK
+2 GOTO EXIT
LOOK ; Look-up term
+1 WRITE !!
KILL X
SET ICDPRC=""
DO ASK
KILL DIC
AGAIN ; Try again?
+1 WRITE !,"Try another"
SET %=$SELECT(+($$X):1,1:2)
+2 DO YN^DICN
IF %=-1!(%=2)
QUIT
+3 IF '%
WRITE !!,"You have searched for a string in the Lexicon, do you want to"
GOTO AGAIN
+4 IF +($$X)&(%=1)
GOTO LOOK
+5 IF '+($$X)&(%=1)
GOTO LOOK
+6 IF (+($$X)&(%=2))!('+($$X)&(%=1))
QUIT
+7 GOTO LOOK
QUIT
ASK ; Get user input
+1 NEW DUOUT,DTOUT,DIR,DIRUT,DIROUT,ICDDATE1,ICDT1,ICDX,ICDXX,ICDPRT
+2 IF $GET(ICDXX1)
SET ICDPRT="Enter Operation/Procedure (ICD 10):"
+3 IF $GET(ICDDATE)=""
DO EFFDATE^ICDDRGM
if $DATA(DUOUT)
GOTO EXIT
if $DATA(DTOUT)
GOTO EXIT
+4 IF $GET(ICDDATE)'=""
SET ICDDATE1=ICDDATE
+5 SET ICDRES=1
+6 IF $GET(ICDPRC)=""
SET ICDPRC=""
DO GICDPRC
+7 IF ICDPRC=""
SET ICDX=0
+8 IF ICDPRC'=""
SET ICDX=1
+9 IF ICDPRC'["*"
GOTO ASKCONT1
+10 ; D GICDPRC
IF ICDPRC["*"
SET ICDPRC=$PIECE(ICDPRC,"*",1)
+11 ;S ICDPRC="",ICDX=0
+12 FOR ICDT1=1:1
if ($LENGTH($GET(ICDPRC))>=7)!(ICDPRC["^")!(ICDRES=0)
QUIT
Begin DoDot:1
+13 SET ICDRES=$$PCSDIG^LEX10CS(ICDPRC,ICDDATE1)
+14 IF ICDRES=1
Begin DoDot:2
+15 DO LOAD
+16 DO PRCDESCB
+17 DO PRCDESC
+18 SET X=$$SEL^ICDSELPS(.ICDS,5)
+19 IF X'=-1
SET ICDPRC=ICDPRC_$PIECE(X,"^",1)
+20 SET ICDX=1
+21 DO GICDPRC
End DoDot:2
+22 IF ICDRES'=1
WRITE !,ICDPRC_" IS NOT A VALID ICD PROCEDURE CODE"
GOTO EXIT
End DoDot:1
+23 IF $GET(ICDXX1)
IF ICDPRC["^^"
SET ICDPRC=$EXTRACT(ICDPRC,1,$LENGTH(ICDPRC)-2)
+24 IF '$GET(ICDXX1)
IF ICDPRC["^"
GOTO EXIT
ASKCONT1 ; Tag to continue when ICDPRC doesnt have *
+1 IF $LENGTH($GET(ICDPRC))=7&(ICDPRC'["^")
Begin DoDot:1
+2 SET ICDRES=$$PCSDIG^LEX10CS(ICDPRC,ICDDATE1)
+3 IF ICDRES=1
Begin DoDot:2
+4 SET ICDPDESC=LEXPCDAT("PCSDESC")
+5 SET ICDPSTS=LEXPCDAT("STATUS")
+6 DO PRCDESCB
+7 DO PRCDESC
+8 ;add printing of descript disclaimer msg
WRITE !!,ICDPRC,?15,ICDPDESC,!
+9 IF $GET(ICDXX1)
SET ICDXX=+$$CODEN^ICDEX(ICDPRC,80.1)
+10 IF '$PIECE(ICDPSTS,"^",1)
WRITE " **CODE INACTIVE"
IF $PIECE(ICDPSTS,"^",2)'=""
SET Y=$PIECE(ICDPSTS,"^",2)
DO DD^%DT
WRITE " AS OF ",Y," **",!
End DoDot:2
+11 IF ICDRES'=1
Begin DoDot:2
+12 WRITE !,ICDPRC_" IS NOT A VALID PROCEDURE CODE."
End DoDot:2
End DoDot:1
+13 IF $LENGTH($GET(ICDPRC))=7&(ICDPRC'["^")&(ICDRES=1)&('$PIECE($GET(ICDPSTS),"^",1))
GOTO ASKCNT2
+14 IF $LENGTH($GET(ICDPRC))'=7
IF ICDPRC'=""
IF ICDPRC'["^"
SET ICDRES=0
WRITE !,ICDPRC_" IS NOT A VALID ICD PROCEDURE CODE"_$SELECT($GET(ICDXX1):". IGNORING THE PROCEDURE CODE",1:".")
+15 SET (X,Y)=""
+16 IF ICDPRC["^"
SET X="^"
SET Y=""
+17 if $GET(ICDXX)
SET (X,Y)=ICDXX
+18 IF $GET(ICDXX1)
Begin DoDot:1
+19 IF (ICDRES'=1)!(($LENGTH($GET(ICDPRC))'=7)&(ICDPRC'="")&(ICDPRC'["^"))
SET X=0
READ ICDQWE:300
KILL ICDQWE
QUIT
+20 IF ICDPRC'=""
Begin DoDot:2
+21 WRITE !,"OK? (Yes/No) "
SET %=1
+22 DO YN^DICN
+23 IF %'=1
SET X=0
End DoDot:2
End DoDot:1
ASKCNT2 KILL ICDDATE1,ICDRES,ICDPDESC,ICDPSTS,LEXPCDAT,ICDPRCT,ICDPRCX,ICDLEX
+1 QUIT
INPHLP ; Look-up help
+1 if X["^^"
QUIT "^^"
if X["^"
QUIT "^"
+2 WRITE !," Enter a ""free text"" term. Best results occur using one to "
+3 WRITE !," three full or partial words without a suffix"
+4 if $GET(X)'["??"
WRITE "."
+5 if $GET(X)["??"
WRITE " (i.e., ""DIABETES"","
+6 if $GET(X)["??"
WRITE !," ""DIAB MELL"",""DIAB MELL INSUL"")"
+7 WRITE !," or "
+8 WRITE !," Enter a classification code (ICD/CPT etc) to find the single "
+9 WRITE !," term associated with the code."
+10 if $GET(X)["??"
WRITE " Example, a lookup of code 239.0 "
+11 if $GET(X)["??"
WRITE !," returns one and only one term, that is the preferred "
+12 if $GET(X)["??"
WRITE !," term for the code 239.0, ""Neoplasm of unspecified nature "
+13 if $GET(X)["??"
WRITE !," of digestive system"""
+14 WRITE !," or "
+15 WRITE !," Enter a classification code (ICD/CPT etc) followed by a plus"
+16 WRITE !," sign (+) to retrieve all terms associated with the code."
+17 if $GET(X)["??"
WRITE " Example,"
+18 if $GET(X)["??"
WRITE !," a lookup of 239.0+ returns all terms that are linked to the "
+19 if $GET(X)["??"
WRITE !," code 239.0."
+20 QUIT
EXIT ; Clean up environment and quit
+1 KILL %,DIC,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y,ICDLEX,ICDPRCX,ICDPRCT
+2 QUIT
X(ICDLEX) ; Evaluate X
+1 if $LENGTH($GET(X))
QUIT 1
QUIT 0
Y(ICDLEX) ; Evaluate Y
+1 if +($GET(Y))>1
QUIT 1
QUIT 0
LOAD ; Load data
+1 KILL ICDS
+2 SET ICDLOAD1=1
+3 SET ICDLOADP=""
+4 SET ICDLOAD=""
FOR
SET ICDLOAD=$ORDER(LEXPCDAT("NEXLEV",ICDLOAD))
if ICDLOAD=""
QUIT
Begin DoDot:1
+5 IF ICDLOAD'=ICDLOADP
Begin DoDot:2
+6 SET ICDS(ICDLOAD1,0)=ICDLOAD
+7 SET ICDS(ICDLOAD1,"LEX")=LEXPCDAT("NEXLEV",ICDLOAD,"DESC")
+8 SET ICDLOAD1=ICDLOAD1+1
+9 SET ICDLOADP=ICDLOAD
End DoDot:2
End DoDot:1
+10 KILL ICDLOAD1,ICDLOADP,ICDLOAD
+11 QUIT
PRCDESC ; Display Descriptions of each character
+1 SET ICDPRCT=ICDPRC
SET ICDPRCT1=""
SET ICDX=0
+2 FOR ICDTEMP=1:1
if ICDPRCT=""
QUIT
Begin DoDot:1
+3 SET ICDC=$EXTRACT(ICDPRCT,1,1)
+4 SET ICDRES=$$PCSDIG^LEX10CS(ICDPRCT1,ICDDATE1)
+5 IF ICDRES'=1
Begin DoDot:2
+6 SET ICDPRCT=""
End DoDot:2
+7 IF ICDRES=1
Begin DoDot:2
+8 SET ICDLOAD=""
FOR
SET ICDLOAD=$ORDER(LEXPCDAT("NEXLEV",ICDLOAD))
if ICDLOAD=""!(ICDLOAD=ICDC)
QUIT
+9 IF ICDLOAD=ICDC
WRITE ICDC_" - "_LEXPCDAT("NEXLEV",ICDLOAD,"DESC")
WRITE !
+10 SET ICDPRCT=$EXTRACT(ICDPRCT,2,$LENGTH(ICDPRCT))
+11 SET ICDPRCT1=ICDPRCT1_ICDC
End DoDot:2
End DoDot:1
+12 KILL ICDTEMP,ICDPRCT,ICDPRCT1,ICDC,ICDLOAD
+13 QUIT
GICDPRC ; Get ICDPRC from User
+1 SET ICDPRCX=""
SET ICDPRCT=""
AA ; Read character by character
+1 WRITE @IOF
+2 IF $GET(ICDX)=1
DO PRCDESC
WRITE !
+3 WRITE "Press '*' to display available choices for next character or '^' to exit."
+4 IF $GET(ICDPRT)=""
SET ICDPRT="ICD-10 Procedure code:"
+5 WRITE !,ICDPRT_ICDPRC
SET ICDREAD="R *ICDA:300 I '$T S ICDA=13"
+6 XECUTE ICDREAD
+7 ; Show choices on "*"
+8 IF ICDA=42
GOTO BB
+9 ; Exit when Enter and is full length else ignore
+10 ;I ICDA=13 G:$L(ICDPRC)>6 BB S ICDX=1 G AA
+11 IF ICDA=13
IF $GET(ICDXX1)
if $LENGTH(ICDPRC)'=7
SET ICDPRC=ICDPRC_$CHAR(94)_$CHAR(94)
GOTO BB
+12 IF ICDA=13
IF '$GET(ICDXX1)
if $LENGTH(ICDPRC)>6
GOTO BB
SET ICDX=1
GOTO AA
+13 ; If Backspace is entered, truncate last character and display the ICDPRC
+14 IF ICDA=127
SET ICDPRC=$EXTRACT(ICDPRC,1,$LENGTH(ICDPRC)-1)
SET ICDX=1
GOTO AA
+15 ; If ^ is entered, exit
+16 IF ICDA=94
SET ICDPRC=ICDPRC_$CHAR(ICDA)
GOTO BB
+17 ; check for valid characters
+18 IF ICDA<48!((ICDA>57)&(ICDA<65))!((ICDA>90)&(ICDA<97))!(ICDA>122)
GOTO AA
+19 ; Any character other than Enter or Backspace
+20 IF ICDA'=127
Begin DoDot:1
+21 SET ICDPRC=ICDPRC_$CHAR(ICDA)
+22 SET ICDX=1
GOTO AA
End DoDot:1
BB ;Exit
+1 WRITE !
+2 KILL ICDA,ICDREAD
+3 QUIT
PRCDESCB ; Call Before PRCDESC
+1 WRITE @IOF
+2 WRITE "Press '*' to display available choices for next character or '^' to exit."
+3 WRITE !,"ICD-10 Procedure code:"_ICDPRC
+4 WRITE !
+5 QUIT