IBDLXDG ;ALB/CFS - ICD-10 DIAGNOSIS CODE LOOK UP ;03/27/2012
;;3.0;AUTOMATED INFO COLLECTION SYS;**63**;APR 24, 1997;Build 80
;
;
;ICRs
; Reference to $$DIAGSRCH^LEX10CS supported by ICR #5681
; Reference to $$IMPDATE^LEXU supported by ICR #5679
; Reference to $$FREQ^LEXU supported by ICR #5679
; Reference to $$MAX^LEXU supported by ICR #5679
; Reference to $$ICDDX^ICDEX supported by ICR #5747
; Reference to ^DISV supported by ICR #510
;
;//---------
;The entry point for ICD-10 diagnosis search functionality
;can be called from applications directly
;input parameters :
; IBDDT - date of interest (Fileman format)
; IBDDFLT - default values for the search string (can be a code by default)
; IBDPARAM - parameters/string constants (see SETPARAM for details)
;returns ICD-10 code selected by the user:
; IEN file #80;ICD code value;IEN file # 757.01^description
; results
; or -1 if invalid data(press enter)
; "" if not found
; or -2 if time out
; or -3 if ^ or ^^
; or -4 in ICD10 if the user answered NO for the question "Do you wish to continue(Y/N)?"
; or -5 if no changes to the default value
DIAG10(IBDDT,IBDDFLT,IBDPARAM) ;
N IBDROOT,IBDRETV,IBDSPACE S IBDROOT="^ICD9("
N IBDINP
F D Q:IBDINP<0!($L($P(IBDINP,U,2))>1)!(IBDSPACE=1)
. ;user enters ANY text like "diabetes" or code or space
. S IBDSPACE=0
. S IBDINP=$$SRCHSTR(IBDPARAM("SEARCH_PROMPT"),IBDPARAM("HELP ?"),IBDPARAM("HELP ??"),IBDDFLT)
. ;process the space bar recall
. I $P(IBDINP,U,2)=" ",$G(IBDROOT)]"" D S:IBDRETV>0 IBDSPACE=1 Q
. . ;if space bar was entered then get the last code entered by the user from ^DISV
. . S IBDRETV=$$SPACEBAR(IBDDT,IBDROOT,30)
. . I IBDRETV<0 W "??" Q
. . W $P(IBDRETV,";",2)
. I IBDINP'<0 I $L($P(IBDINP,U,2))'>1 W !!,IBDPARAM("ENTER MORE") W:$L(IBDPARAM("ENTER MORE2"))>0 !,IBDPARAM("ENTER MORE2") W ! ;user should enter at least 2 characters
;if space bar was entered then get the last code entered by the user from ^DISV and quit
I IBDSPACE=1,IBDRETV>0 Q IBDRETV
I IBDINP<0 Q +IBDINP
;
;send the search test to Lexicon and let the user pick one
S IBDRETV=$$LEXICD10($P(IBDINP,U,2),IBDDT,.IBDPARAM)
;
;if spacebar recall is supported, if code is selected, if it is valid then
;save selection in ^DISV
I $G(IBDROOT)]"",IBDRETV>0 D SAVSPACE(IBDROOT,+IBDRETV)
;
Q IBDRETV
;
;
;retrieves the last code selected by the user - space bar recall logic here
; if nothing then returns -1
;IBDDT - date of service
;IBDROOT - global root is used in ^DISV (ex. "^ICD9(" )
;IBDCODSY - coding system for which the user is trying to enter an ICD code. It is used to check
; if the code stored in ^DISV matches the coding system the user is using at the prompt.
; 30 - for ICD-10 diagnoses
; 1 - for ICD-9 diagnoses
SPACEBAR(IBDDT,IBDROOT,IBDCODSY) ;
N IBDCODE,IBDRTV,IBDX
I IBDROOT="^ICD9(" D
. S IBDCODE=$G(^DISV(DUZ,IBDROOT)) ;needs ICR #510 subscription
. I +IBDCODE=0 S IBDRTV=-1 Q
. ;check if the code in ^DISV for the ICD-10 coding system (30 in the 3rd parameter)
. ;we don't need to check this for ICD-9 becuase
. S IBDX=$$ICDDX^ICDEX(IBDCODE,IBDDT,IBDCODSY,"I")
. S IBDRTV=$P(IBDX,U,1)_";"_$P(IBDX,U,2)_";"_$P(IBDX,U,4)
;if IBDROOT is different then implement your own logic here
Q IBDRTV
;
;store the selected code for the space bar recall feature
;IBDROOT - global root is used in ^DISV (ex. "^ICD9(" )
;IBDRETV - IEN of the top level entry wiht ICD code field
SAVSPACE(IBDROOT,IBDRETV) ;
I +$G(DUZ)=0 Q
I IBDROOT="^ICD9(" D RECALL^DILFD(80,(+IBDRETV)_",",+DUZ) Q ;need subscription to ICR #510
;if IBDROOT is different then implement your own logic here
Q
;
;
;--------------
;The entry point for ICD-10 diagnosis search functionality
;can be called from applications directly
; Supported ICR 5681 ($$DIAGSRCH^LEX10CS)
;input parameters :
; IBDTXT - search string
; IBDDATE - date of interest
; IBDPAR - array with text messages and other string constants
;returns ICD-10 code selected by the user:
; IEN file #80;ICD code value^description
; or
; "" if not found
; -1 if exit : ^ or ^^
; -2 if continue searching
;
LEXICD10(IBDTXT,IBDDATE,IBDPAR) ; ICD-10 Search
N IBDLVTXT
;parameters check
S IBDDATE=+$G(IBDDATE)
I IBDDATE'?7N Q -1
S IBDTXT=$G(IBDTXT)
Q:'$L(IBDTXT) -1
N IBDNUMB
S IBDNUMB=$$FREQ^LEXU(IBDTXT)
I IBDNUMB>$$MAX^LEXU(30) D I $$QUESTION(2,IBDPARAM("WISH CONTINUE"),IBDPARAM("YES OR NO"))'=1 Q -4
. W !
. D FORMWRIT(IBDPAR("EXCEEDS MESSAGE1")_IBDTXT_IBDPAR("EXCEEDS MESSAGE2")_IBDNUMB_IBDPAR("EXCEEDS MESSAGE3")_IBDTXT_""".",0)
. D FORMWRIT("",2)
. W !
;new and set variables
N DIROUT,DUOUT,DTOUT,IBDEXIT,IBDICDNT
N IBDRETV,IBDXX,IBDLEVEL
S IBDRETV=""
S IBDEXIT=0
S IBDLEVEL=1,IBDLVTXT(IBDLEVEL)=IBDTXT ;level 1 stores the original search string
; main loop
F Q:IBDEXIT>0 D
.K IBDICDY
.;get the search string from the current level and call LEX API
.;don't pass the date - this will initiate the unversioned lookup for AICS to get all codes - active and inactive
.S IBDICDY=$$DIAGSRCH^LEX10CS(IBDLVTXT(IBDLEVEL),.IBDICDY,,30)
.;cleanup the output array:
.; - leave codes active on the date
.; - leave codes inactive on the date if their last status is ACTIVE
.; - remove codes inactive on the date if their last status is INACTIVE
.I IBDICDY>0 S IBDICDY=$$REMINARR^IBDUTICD(.IBDICDY,IBDDATE)
.S:$O(IBDICDY(" "),-1)>0 IBDICDY=+IBDICDY
.; Nothing found
.I +IBDICDY'>0 S IBDEXIT=1 S IBDXX=-1 Q
.; display the list of items and ask the user to select the item from the list
.S IBDXX=$$SEL^IBDLXDG2(.IBDICDY,4)
.; if ^ was entered
.; if this is on the top level then quit
.I IBDXX=-2,IBDLEVEL'>1 S IBDRETV=-1 S IBDEXIT=1 Q
.; if lower level then go one level up
.I IBDXX=-2,IBDLEVEL>1 S:IBDLEVEL>1 IBDLEVEL=IBDLEVEL-1 Q
.; If timeout, or not selected, or ^^ then quit
.I IBDXX=-1 S IBDRETV=-1 S IBDEXIT=1 Q
.; if Code Found and Selected by the user save selection in IBDRETV and quit
.I $P(IBDXX,";")'="99:CAT" S IBDRETV=IBDXX S IBDEXIT=1 Q
.; If Category Found and Selected by the user:
.; go to the next inner level
.; change level number
.S IBDLEVEL=IBDLEVEL+1
.; set the new level with the new search string
.; and repeat
.S IBDLVTXT(IBDLEVEL)=$P($P($G(IBDXX),"^"),";",2)
Q IBDRETV
;
;---------
; Clean up environment and quit
EXIT ;
K %,DIC,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
Q
;
;-----------
; Look-up help for ?
INPHLP ;
I $G(X)["???" D INPHLP3 Q
I $G(X)["??" D INPHLP2 Q
W !," Enter code or ""text"" for more information." Q
Q
;-----------
; Look-up help for ??
INPHLP2 ;
W !," Enter a ""free text"" term or part of a term such as ""femur fracture""."
W !!," or "
W !!," Enter a ""classification code"" (ICD/CPT etc) to find the single term"
W !," associated with the code."
W !!," or "
W !!," Enter a ""partial code"". Include the decimal when a search criterion"
W !," includes 3 characters or more for code searches."
Q
;--------
; Look-up help for ???
INPHLP3 ;
W !," Number of Code Matches"
W !," ----------------------"
W !!," The ICD-10 Diagnosis Code search will show the user the number of matches"
W !," found, indicate if additional characters in ICD code exist, and the number"
W !," of codes within the category or subcategory that are available for selection."
W !," For example:"
W !!," 19 matches found"
W !!," M91. - Juvenile osteochondrosis of hip and pelvis (19)"
W !!," This indicates that 19 unique matches or matching groups have been found"
W !," and will be displayed."
W !!," M91. - the ""-"" indicates that there are additional characters that specify"
W !," unique ICD-10 codes available."
W !!," (19) Indicates that there are 19 additional ICD-10 codes in the M91 ""family"""
W !," that are possible selections."
Q
;--------
;prompt the user for a date of interest
;input parameters :
; IBDPRMT - prompt
;returns YYYMMDD
; or -1 if invalid date
; or -2 if time out
; or -3 if ^
ASKDATE(IBDPRMT) ;
N %DT,DIROUT,DUOUT,DTOUT
S %DT="AEX",%DT("A")=$G(IBDPRMT,"Enter a date: ")
D ^%DT
Q:Y<0 -1
Q:$D(DTOUT) -2
Q:X="^" -3
Q (+Y)
;--------
;ask YES/NO questions
;input parameters :
; IBDDFLT- 0/null- not default, 1- yes, 2 -no
; IBDPROM - prompt string
;returns
; 2 - no,
; 1 - yes,
; 0 - no answer (time out)
; -3 - ^ or ^^
QUESTION(IBDDFLT,IBDPROM,IBDHELP) ;
N DIR
S %=$G(IBDDFLT,2)
S DIR(0)="Y",DIR("A")=IBDPROM,DIR("B")=$S(%=1:"Yes",%=2:"No",1:"")
S:$L($G(IBDHELP)) DIR("?")=IBDHELP
D ^DIR
Q:Y["^" -3
Q:Y=1 1
Q:Y=0 2
Q 0
;
;------------
;get search string
;input parameters :
; IBDPRMT prompt text
; IBDHLP1 "?" help text
; IBDHLP2 "??" help text
; IBDDFLT- default response
;returns piece1 ^ piece 2
; piece1:
; 0 if normal input
; or -1 if invalid data
; or -2 if time out
; or -3 if ^
; or -5 if user accepts default value then no need to validate it
; or -6 if user enters "@"
; piece2: string entered by the user
SRCHSTR(IBDPRMT,IBDHLP1,IBDHLP2,IBDDFLT) ;
N DIR
S DIR("A")=IBDPRMT
S:($G(IBDHLP1)]"") DIR("?")=IBDHLP1
S:($G(IBDHLP2)]"") DIR("??")=IBDHLP2
I $L($G(IBDDFLT)) S DIR("B")=IBDDFLT
S DIR(0)="FAOR^0:245"
D ^DIR
Q:$D(DTOUT) -2
Q:$D(DUOUT) -3
;Q:X="@" -6 ;quit if user entered "@" and handle deletion case in your application - not used in AICS
Q:Y["^" -3
Q:Y="" -1
;Q:(($L($G(IBDDFLT)))&(Y=IBDDFLT)) -5 ;if user accepts default value then no need to validate it - not used in AICS
Q 0_U_Y
;
;----------
;Determines and returns ACTIVE coding system for DIAGNOSES based on date of interest
;input parameters :
; IBDICDD - date of interest
; if date of interest is null, today's date will be assumed
;returns coding system
; as a pointer to the ICD CODING SYSTEM file #80.4 (supported ICR 5780)
; 30 if ICD-10-CM is active system
; 1 if ICD-9-CM is active system
ICDSYSDG(IBDICDD) ;
N IBDIMPDT
S IBDICDD=$S(IBDICDD<0!($L(+IBDICDD)'=7):DT,1:+$G(IBDICDD))
S IBDIMPDT=$$IMPDATE^LEXU("10D")
Q $S(IBDICDD'<IBDIMPDT:30,1:1)
;
;set parameters
;edit these hardcoded strings that are used for prompts, messages and so on to adjust them to your application's needs
;input parameters
; IBDPAR - local array to sets and store string constants for your messages and prompts
SETPARAM(IBDPAR) ;
S IBDPAR("ASKDATE")="Date of interest? "
S IBDPAR("SEARCH_PROMPT")="Enter Diagnosis, a Code or a Code Fragment: "
S IBDPAR("HELP ?")="^D INPHLP^IBDLXDG"
S IBDPAR("HELP ??")="^D INPHLP2^IBDLXDG"
S IBDPAR("NO DATA FOUND")=" No records found matching the value entered, revise search or enter ""?"" for"
S IBDPAR("NO DATA FOUND 2")=" help."
S IBDPAR("EXITING")=" Exiting"
S IBDPAR("TRY LATER")=" Try again later"
S IBDPAR("NO DATA SELECTED")=" No data selected"
S IBDPAR("TRY ANOTHER")="Try another"
S IBDPAR("WISH CONTINUE")="Do you wish to continue (Y/N)"
S IBDPAR("EXCEEDS MESSAGE1")="Searching for """
S IBDPAR("EXCEEDS MESSAGE2")=""" requires inspecting "
S IBDPAR("EXCEEDS MESSAGE3")=" records to determine if they match the search criteria. This could take quite some time. Suggest refining the search by further specifying """
S IBDPAR("ENTER MORE")=" Please enter at least the first two characters of the ICD-10 code or code"
S IBDPAR("ENTER MORE2")=" description to start the search."
S IBDPAR("YES OR NO")="Answer 'Y' for 'Yes' or 'N' for 'No'"
Q
;
;
;a wrapper for ^DIWP
;accumulates a text and then writes it to the device
;input parameters :
; X - text
; IBDMODE:
; 0 - start
; 1 - accumulate
; 2 - write
;example:
;D FORMWRIT^IBDLXDG("this API is a wrapper for ^DIWP, it accumulates a text and then writes it to the device, you can use it in your application code",0)
;D FORMWRIT^IBDLXDG("some more text ",1)
;D FORMWRIT^IBDLXDG("",2)
FORMWRIT(X,IBDMODE) ;
N IBDLI1,DIWL,DIWR
;if "start" mode
I IBDMODE=0 K ^UTILITY($J,"W")
S DIWL=1,DIWR=79
I $L(X)>0 D ^DIWP
;if "write" mode
I IBDMODE=2 D
. S IBDLI1=0 F S IBDLI1=$O(^UTILITY($J,"W",1,IBDLI1)) Q:+IBDLI1=0 W !,$G(^UTILITY($J,"W",1,IBDLI1,0))
. K ^UTILITY($J,"W")
Q
;
;---------------
;Initialize variables if you need , your application most likely already has this
INITVARS ;
D HOME^%ZIS
S:$G(DT)=0 DT=$$DT^XLFDT
Q
;
--- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HIBDLXDG 12543 printed Oct 16, 2024@18:54:44 Page 2
IBDLXDG ;ALB/CFS - ICD-10 DIAGNOSIS CODE LOOK UP ;03/27/2012
+1 ;;3.0;AUTOMATED INFO COLLECTION SYS;**63**;APR 24, 1997;Build 80
+2 ;
+3 ;
+4 ;ICRs
+5 ; Reference to $$DIAGSRCH^LEX10CS supported by ICR #5681
+6 ; Reference to $$IMPDATE^LEXU supported by ICR #5679
+7 ; Reference to $$FREQ^LEXU supported by ICR #5679
+8 ; Reference to $$MAX^LEXU supported by ICR #5679
+9 ; Reference to $$ICDDX^ICDEX supported by ICR #5747
+10 ; Reference to ^DISV supported by ICR #510
+11 ;
+12 ;//---------
+13 ;The entry point for ICD-10 diagnosis search functionality
+14 ;can be called from applications directly
+15 ;input parameters :
+16 ; IBDDT - date of interest (Fileman format)
+17 ; IBDDFLT - default values for the search string (can be a code by default)
+18 ; IBDPARAM - parameters/string constants (see SETPARAM for details)
+19 ;returns ICD-10 code selected by the user:
+20 ; IEN file #80;ICD code value;IEN file # 757.01^description
+21 ; results
+22 ; or -1 if invalid data(press enter)
+23 ; "" if not found
+24 ; or -2 if time out
+25 ; or -3 if ^ or ^^
+26 ; or -4 in ICD10 if the user answered NO for the question "Do you wish to continue(Y/N)?"
+27 ; or -5 if no changes to the default value
DIAG10(IBDDT,IBDDFLT,IBDPARAM) ;
+1 NEW IBDROOT,IBDRETV,IBDSPACE
SET IBDROOT="^ICD9("
+2 NEW IBDINP
+3 FOR
Begin DoDot:1
+4 ;user enters ANY text like "diabetes" or code or space
+5 SET IBDSPACE=0
+6 SET IBDINP=$$SRCHSTR(IBDPARAM("SEARCH_PROMPT"),IBDPARAM("HELP ?"),IBDPARAM("HELP ??"),IBDDFLT)
+7 ;process the space bar recall
+8 IF $PIECE(IBDINP,U,2)=" "
IF $GET(IBDROOT)]""
Begin DoDot:2
+9 ;if space bar was entered then get the last code entered by the user from ^DISV
+10 SET IBDRETV=$$SPACEBAR(IBDDT,IBDROOT,30)
+11 IF IBDRETV<0
WRITE "??"
QUIT
+12 WRITE $PIECE(IBDRETV,";",2)
End DoDot:2
if IBDRETV>0
SET IBDSPACE=1
QUIT
+13 ;user should enter at least 2 characters
IF IBDINP'<0
IF $LENGTH($PIECE(IBDINP,U,2))'>1
WRITE !!,IBDPARAM("ENTER MORE")
if $LENGTH(IBDPARAM("ENTER MORE2"))>0
WRITE !,IBDPARAM("ENTER MORE2")
WRITE !
End DoDot:1
if IBDINP<0!($LENGTH($PIECE(IBDINP,U,2))>1)!(IBDSPACE=1)
QUIT
+14 ;if space bar was entered then get the last code entered by the user from ^DISV and quit
+15 IF IBDSPACE=1
IF IBDRETV>0
QUIT IBDRETV
+16 IF IBDINP<0
QUIT +IBDINP
+17 ;
+18 ;send the search test to Lexicon and let the user pick one
+19 SET IBDRETV=$$LEXICD10($PIECE(IBDINP,U,2),IBDDT,.IBDPARAM)
+20 ;
+21 ;if spacebar recall is supported, if code is selected, if it is valid then
+22 ;save selection in ^DISV
+23 IF $GET(IBDROOT)]""
IF IBDRETV>0
DO SAVSPACE(IBDROOT,+IBDRETV)
+24 ;
+25 QUIT IBDRETV
+26 ;
+27 ;
+28 ;retrieves the last code selected by the user - space bar recall logic here
+29 ; if nothing then returns -1
+30 ;IBDDT - date of service
+31 ;IBDROOT - global root is used in ^DISV (ex. "^ICD9(" )
+32 ;IBDCODSY - coding system for which the user is trying to enter an ICD code. It is used to check
+33 ; if the code stored in ^DISV matches the coding system the user is using at the prompt.
+34 ; 30 - for ICD-10 diagnoses
+35 ; 1 - for ICD-9 diagnoses
SPACEBAR(IBDDT,IBDROOT,IBDCODSY) ;
+1 NEW IBDCODE,IBDRTV,IBDX
+2 IF IBDROOT="^ICD9("
Begin DoDot:1
+3 ;needs ICR #510 subscription
SET IBDCODE=$GET(^DISV(DUZ,IBDROOT))
+4 IF +IBDCODE=0
SET IBDRTV=-1
QUIT
+5 ;check if the code in ^DISV for the ICD-10 coding system (30 in the 3rd parameter)
+6 ;we don't need to check this for ICD-9 becuase
+7 SET IBDX=$$ICDDX^ICDEX(IBDCODE,IBDDT,IBDCODSY,"I")
+8 SET IBDRTV=$PIECE(IBDX,U,1)_";"_$PIECE(IBDX,U,2)_";"_$PIECE(IBDX,U,4)
End DoDot:1
+9 ;if IBDROOT is different then implement your own logic here
+10 QUIT IBDRTV
+11 ;
+12 ;store the selected code for the space bar recall feature
+13 ;IBDROOT - global root is used in ^DISV (ex. "^ICD9(" )
+14 ;IBDRETV - IEN of the top level entry wiht ICD code field
SAVSPACE(IBDROOT,IBDRETV) ;
+1 IF +$GET(DUZ)=0
QUIT
+2 ;need subscription to ICR #510
IF IBDROOT="^ICD9("
DO RECALL^DILFD(80,(+IBDRETV)_",",+DUZ)
QUIT
+3 ;if IBDROOT is different then implement your own logic here
+4 QUIT
+5 ;
+6 ;
+7 ;--------------
+8 ;The entry point for ICD-10 diagnosis search functionality
+9 ;can be called from applications directly
+10 ; Supported ICR 5681 ($$DIAGSRCH^LEX10CS)
+11 ;input parameters :
+12 ; IBDTXT - search string
+13 ; IBDDATE - date of interest
+14 ; IBDPAR - array with text messages and other string constants
+15 ;returns ICD-10 code selected by the user:
+16 ; IEN file #80;ICD code value^description
+17 ; or
+18 ; "" if not found
+19 ; -1 if exit : ^ or ^^
+20 ; -2 if continue searching
+21 ;
LEXICD10(IBDTXT,IBDDATE,IBDPAR) ; ICD-10 Search
+1 NEW IBDLVTXT
+2 ;parameters check
+3 SET IBDDATE=+$GET(IBDDATE)
+4 IF IBDDATE'?7N
QUIT -1
+5 SET IBDTXT=$GET(IBDTXT)
+6 if '$LENGTH(IBDTXT)
QUIT -1
+7 NEW IBDNUMB
+8 SET IBDNUMB=$$FREQ^LEXU(IBDTXT)
+9 IF IBDNUMB>$$MAX^LEXU(30)
Begin DoDot:1
+10 WRITE !
+11 DO FORMWRIT(IBDPAR("EXCEEDS MESSAGE1")_IBDTXT_IBDPAR("EXCEEDS MESSAGE2")_IBDNUMB_IBDPAR("EXCEEDS MESSAGE3")_IBDTXT_""".",0)
+12 DO FORMWRIT("",2)
+13 WRITE !
End DoDot:1
IF $$QUESTION(2,IBDPARAM("WISH CONTINUE"),IBDPARAM("YES OR NO"))'=1
QUIT -4
+14 ;new and set variables
+15 NEW DIROUT,DUOUT,DTOUT,IBDEXIT,IBDICDNT
+16 NEW IBDRETV,IBDXX,IBDLEVEL
+17 SET IBDRETV=""
+18 SET IBDEXIT=0
+19 ;level 1 stores the original search string
SET IBDLEVEL=1
SET IBDLVTXT(IBDLEVEL)=IBDTXT
+20 ; main loop
+21 FOR
if IBDEXIT>0
QUIT
Begin DoDot:1
+22 KILL IBDICDY
+23 ;get the search string from the current level and call LEX API
+24 ;don't pass the date - this will initiate the unversioned lookup for AICS to get all codes - active and inactive
+25 SET IBDICDY=$$DIAGSRCH^LEX10CS(IBDLVTXT(IBDLEVEL),.IBDICDY,,30)
+26 ;cleanup the output array:
+27 ; - leave codes active on the date
+28 ; - leave codes inactive on the date if their last status is ACTIVE
+29 ; - remove codes inactive on the date if their last status is INACTIVE
+30 IF IBDICDY>0
SET IBDICDY=$$REMINARR^IBDUTICD(.IBDICDY,IBDDATE)
+31 if $ORDER(IBDICDY(" "),-1)>0
SET IBDICDY=+IBDICDY
+32 ; Nothing found
+33 IF +IBDICDY'>0
SET IBDEXIT=1
SET IBDXX=-1
QUIT
+34 ; display the list of items and ask the user to select the item from the list
+35 SET IBDXX=$$SEL^IBDLXDG2(.IBDICDY,4)
+36 ; if ^ was entered
+37 ; if this is on the top level then quit
+38 IF IBDXX=-2
IF IBDLEVEL'>1
SET IBDRETV=-1
SET IBDEXIT=1
QUIT
+39 ; if lower level then go one level up
+40 IF IBDXX=-2
IF IBDLEVEL>1
if IBDLEVEL>1
SET IBDLEVEL=IBDLEVEL-1
QUIT
+41 ; If timeout, or not selected, or ^^ then quit
+42 IF IBDXX=-1
SET IBDRETV=-1
SET IBDEXIT=1
QUIT
+43 ; if Code Found and Selected by the user save selection in IBDRETV and quit
+44 IF $PIECE(IBDXX,";")'="99:CAT"
SET IBDRETV=IBDXX
SET IBDEXIT=1
QUIT
+45 ; If Category Found and Selected by the user:
+46 ; go to the next inner level
+47 ; change level number
+48 SET IBDLEVEL=IBDLEVEL+1
+49 ; set the new level with the new search string
+50 ; and repeat
+51 SET IBDLVTXT(IBDLEVEL)=$PIECE($PIECE($GET(IBDXX),"^"),";",2)
End DoDot:1
+52 QUIT IBDRETV
+53 ;
+54 ;---------
+55 ; Clean up environment and quit
EXIT ;
+1 KILL %,DIC,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
+2 QUIT
+3 ;
+4 ;-----------
+5 ; Look-up help for ?
INPHLP ;
+1 IF $GET(X)["???"
DO INPHLP3
QUIT
+2 IF $GET(X)["??"
DO INPHLP2
QUIT
+3 WRITE !," Enter code or ""text"" for more information."
QUIT
+4 QUIT
+5 ;-----------
+6 ; Look-up help for ??
INPHLP2 ;
+1 WRITE !," Enter a ""free text"" term or part of a term such as ""femur fracture""."
+2 WRITE !!," or "
+3 WRITE !!," Enter a ""classification code"" (ICD/CPT etc) to find the single term"
+4 WRITE !," associated with the code."
+5 WRITE !!," or "
+6 WRITE !!," Enter a ""partial code"". Include the decimal when a search criterion"
+7 WRITE !," includes 3 characters or more for code searches."
+8 QUIT
+9 ;--------
+10 ; Look-up help for ???
INPHLP3 ;
+1 WRITE !," Number of Code Matches"
+2 WRITE !," ----------------------"
+3 WRITE !!," The ICD-10 Diagnosis Code search will show the user the number of matches"
+4 WRITE !," found, indicate if additional characters in ICD code exist, and the number"
+5 WRITE !," of codes within the category or subcategory that are available for selection."
+6 WRITE !," For example:"
+7 WRITE !!," 19 matches found"
+8 WRITE !!," M91. - Juvenile osteochondrosis of hip and pelvis (19)"
+9 WRITE !!," This indicates that 19 unique matches or matching groups have been found"
+10 WRITE !," and will be displayed."
+11 WRITE !!," M91. - the ""-"" indicates that there are additional characters that specify"
+12 WRITE !," unique ICD-10 codes available."
+13 WRITE !!," (19) Indicates that there are 19 additional ICD-10 codes in the M91 ""family"""
+14 WRITE !," that are possible selections."
+15 QUIT
+16 ;--------
+17 ;prompt the user for a date of interest
+18 ;input parameters :
+19 ; IBDPRMT - prompt
+20 ;returns YYYMMDD
+21 ; or -1 if invalid date
+22 ; or -2 if time out
+23 ; or -3 if ^
ASKDATE(IBDPRMT) ;
+1 NEW %DT,DIROUT,DUOUT,DTOUT
+2 SET %DT="AEX"
SET %DT("A")=$GET(IBDPRMT,"Enter a date: ")
+3 DO ^%DT
+4 if Y<0
QUIT -1
+5 if $DATA(DTOUT)
QUIT -2
+6 if X="^"
QUIT -3
+7 QUIT (+Y)
+8 ;--------
+9 ;ask YES/NO questions
+10 ;input parameters :
+11 ; IBDDFLT- 0/null- not default, 1- yes, 2 -no
+12 ; IBDPROM - prompt string
+13 ;returns
+14 ; 2 - no,
+15 ; 1 - yes,
+16 ; 0 - no answer (time out)
+17 ; -3 - ^ or ^^
QUESTION(IBDDFLT,IBDPROM,IBDHELP) ;
+1 NEW DIR
+2 SET %=$GET(IBDDFLT,2)
+3 SET DIR(0)="Y"
SET DIR("A")=IBDPROM
SET DIR("B")=$SELECT(%=1:"Yes",%=2:"No",1:"")
+4 if $LENGTH($GET(IBDHELP))
SET DIR("?")=IBDHELP
+5 DO ^DIR
+6 if Y["^"
QUIT -3
+7 if Y=1
QUIT 1
+8 if Y=0
QUIT 2
+9 QUIT 0
+10 ;
+11 ;------------
+12 ;get search string
+13 ;input parameters :
+14 ; IBDPRMT prompt text
+15 ; IBDHLP1 "?" help text
+16 ; IBDHLP2 "??" help text
+17 ; IBDDFLT- default response
+18 ;returns piece1 ^ piece 2
+19 ; piece1:
+20 ; 0 if normal input
+21 ; or -1 if invalid data
+22 ; or -2 if time out
+23 ; or -3 if ^
+24 ; or -5 if user accepts default value then no need to validate it
+25 ; or -6 if user enters "@"
+26 ; piece2: string entered by the user
SRCHSTR(IBDPRMT,IBDHLP1,IBDHLP2,IBDDFLT) ;
+1 NEW DIR
+2 SET DIR("A")=IBDPRMT
+3 if ($GET(IBDHLP1)]"")
SET DIR("?")=IBDHLP1
+4 if ($GET(IBDHLP2)]"")
SET DIR("??")=IBDHLP2
+5 IF $LENGTH($GET(IBDDFLT))
SET DIR("B")=IBDDFLT
+6 SET DIR(0)="FAOR^0:245"
+7 DO ^DIR
+8 if $DATA(DTOUT)
QUIT -2
+9 if $DATA(DUOUT)
QUIT -3
+10 ;Q:X="@" -6 ;quit if user entered "@" and handle deletion case in your application - not used in AICS
+11 if Y["^"
QUIT -3
+12 if Y=""
QUIT -1
+13 ;Q:(($L($G(IBDDFLT)))&(Y=IBDDFLT)) -5 ;if user accepts default value then no need to validate it - not used in AICS
+14 QUIT 0_U_Y
+15 ;
+16 ;----------
+17 ;Determines and returns ACTIVE coding system for DIAGNOSES based on date of interest
+18 ;input parameters :
+19 ; IBDICDD - date of interest
+20 ; if date of interest is null, today's date will be assumed
+21 ;returns coding system
+22 ; as a pointer to the ICD CODING SYSTEM file #80.4 (supported ICR 5780)
+23 ; 30 if ICD-10-CM is active system
+24 ; 1 if ICD-9-CM is active system
ICDSYSDG(IBDICDD) ;
+1 NEW IBDIMPDT
+2 SET IBDICDD=$SELECT(IBDICDD<0!($LENGTH(+IBDICDD)'=7):DT,1:+$GET(IBDICDD))
+3 SET IBDIMPDT=$$IMPDATE^LEXU("10D")
+4 QUIT $SELECT(IBDICDD'<IBDIMPDT:30,1:1)
+5 ;
+6 ;set parameters
+7 ;edit these hardcoded strings that are used for prompts, messages and so on to adjust them to your application's needs
+8 ;input parameters
+9 ; IBDPAR - local array to sets and store string constants for your messages and prompts
SETPARAM(IBDPAR) ;
+1 SET IBDPAR("ASKDATE")="Date of interest? "
+2 SET IBDPAR("SEARCH_PROMPT")="Enter Diagnosis, a Code or a Code Fragment: "
+3 SET IBDPAR("HELP ?")="^D INPHLP^IBDLXDG"
+4 SET IBDPAR("HELP ??")="^D INPHLP2^IBDLXDG"
+5 SET IBDPAR("NO DATA FOUND")=" No records found matching the value entered, revise search or enter ""?"" for"
+6 SET IBDPAR("NO DATA FOUND 2")=" help."
+7 SET IBDPAR("EXITING")=" Exiting"
+8 SET IBDPAR("TRY LATER")=" Try again later"
+9 SET IBDPAR("NO DATA SELECTED")=" No data selected"
+10 SET IBDPAR("TRY ANOTHER")="Try another"
+11 SET IBDPAR("WISH CONTINUE")="Do you wish to continue (Y/N)"
+12 SET IBDPAR("EXCEEDS MESSAGE1")="Searching for """
+13 SET IBDPAR("EXCEEDS MESSAGE2")=""" requires inspecting "
+14 SET IBDPAR("EXCEEDS MESSAGE3")=" records to determine if they match the search criteria. This could take quite some time. Suggest refining the search by further specifying """
+15 SET IBDPAR("ENTER MORE")=" Please enter at least the first two characters of the ICD-10 code or code"
+16 SET IBDPAR("ENTER MORE2")=" description to start the search."
+17 SET IBDPAR("YES OR NO")="Answer 'Y' for 'Yes' or 'N' for 'No'"
+18 QUIT
+19 ;
+20 ;
+21 ;a wrapper for ^DIWP
+22 ;accumulates a text and then writes it to the device
+23 ;input parameters :
+24 ; X - text
+25 ; IBDMODE:
+26 ; 0 - start
+27 ; 1 - accumulate
+28 ; 2 - write
+29 ;example:
+30 ;D FORMWRIT^IBDLXDG("this API is a wrapper for ^DIWP, it accumulates a text and then writes it to the device, you can use it in your application code",0)
+31 ;D FORMWRIT^IBDLXDG("some more text ",1)
+32 ;D FORMWRIT^IBDLXDG("",2)
FORMWRIT(X,IBDMODE) ;
+1 NEW IBDLI1,DIWL,DIWR
+2 ;if "start" mode
+3 IF IBDMODE=0
KILL ^UTILITY($JOB,"W")
+4 SET DIWL=1
SET DIWR=79
+5 IF $LENGTH(X)>0
DO ^DIWP
+6 ;if "write" mode
+7 IF IBDMODE=2
Begin DoDot:1
+8 SET IBDLI1=0
FOR
SET IBDLI1=$ORDER(^UTILITY($JOB,"W",1,IBDLI1))
if +IBDLI1=0
QUIT
WRITE !,$GET(^UTILITY($JOB,"W",1,IBDLI1,0))
+9 KILL ^UTILITY($JOB,"W")
End DoDot:1
+10 QUIT
+11 ;
+12 ;---------------
+13 ;Initialize variables if you need , your application most likely already has this
INITVARS ;
+1 DO HOME^%ZIS
+2 if $GET(DT)=0
SET DT=$$DT^XLFDT
+3 QUIT
+4 ;