- YSLXDG ; ALB/RBD - ICD-10 DIAGNOSIS CODE LOOK UP FOR MENTAL HEALTH ;10 May 2013 11:17 AM
- ;;5.01;MENTAL HEALTH;**107**;Dec 30, 1994;Build 23
- ;
- ;based on ^ZZLXDG which is the standard Diagnosis Search Protocol
- ;beginning routine.
- ;
- Q
- ;
- EN ;
- D INITVARS ;set standards variables, you might not need this if it
- ; was already done in your application
- N YSQUIT ; to manage loop
- K YSRETV ;to store the selected code information
- N YSPARAM ; to set your application specific prompts and messages
- N YSCSYS ;coding system "ICD9" or ICD10"
- N YSOUT ;to return all available information about the selected code
- ;settings:
- D SETPARAM(.YSPARAM) ;edit the SETPARAM subroutine below to set your
- ; application specific prompts
- I YSDT'>0 S YSRETV=-1 Q
- ;starting main loop
- S YSQUIT=0 F Q:YSQUIT=1 D
- . S YSRETV=0,YSOUT=""
- . W !! ;reprompt a few lines down
- . ;prompt for the date of interest (date should be available for MH)
- . I YSDT'>0 S YSRETV=-1,YSQUIT=1 Q
- . ;S YSDT=$$ASKDATE(YSPARAM("ASKDATE"))
- . ;prompt for "try again" with "No" as default if ^ or null entered
- . ;for the date or if timed out
- . I YSDT'>0 S:$$QUESTION(2,YSPARAM("TRY ANOTHER"))'=1 YSQUIT=1 Q
- . ;determine coding system based on the date of interest
- . ;If coding system not ICD-10 or greater, then Quit (let MH code
- . ; handle it as before for now)
- . S YSCSYS=$$ICDSYSDG(YSDT) I YSCSYS=1 S YSRETV=-1,YSQUIT=1 Q
- . ;set default response for your prompt
- . S YSDFLT=""
- . ;run either ICD9 or ICD10 prompt/search/select logic
- . ;ICD9 (1 is a pointer to the ICD-9 diagnosis system entry in the
- . ;new file #80.4)
- . I YSCSYS=1 S YSRETV=$$DIAG9(YSDT,YSDFLT,.YSOUT,.YSPARAM) I YSRETV=-2 S:$$QUESTION(1,YSPARAM("TRY ANOTHER"))'=1 YSQUIT=1 Q
- . ;ICD10 (30 is a pointer to the ICD-10 diagnosis system entry in the new file #80.4)
- . I YSCSYS=30 S YSRETV=$$DIAG10(YSDT,YSDFLT,.YSPARAM)
- . I $P(YSRETV,U,2)="LIST CHOICE" S YSRETV=$P(YSRETV,U,1),YSQUIT=1 Q
- . ;display information about the code selected
- . I YSRETV>0 W !,"SELECTED: " D CODEINFO(YSRETV) S YSQUIT=1 Q
- . ;if no data found
- . I YSRETV="" W !!,YSPARAM("NO DATA FOUND") S:$$QUESTION(1,YSPARAM("TRY ANOTHER"))'=1 YSQUIT=1,YSRETV=-1 Q
- . ;in ICD10 if the user answered NO for the question "Do you wish to continue(Y/N)?"
- . I YSRETV=-4 S:$$QUESTION(1,YSPARAM("TRY ANOTHER"))'=1 YSQUIT=1 Q
- . ;no data or was aborted
- . I YSRETV=-2 S:$$QUESTION(1,YSPARAM("TRY ANOTHER"))'=1 YSQUIT=1 Q
- . ;if exit due to ^ in the ICD Diagnosis code prompt
- . I YSRETV=-3 S:$$QUESTION(2,YSPARAM("TRY ANOTHER"))'=1 YSQUIT=1 Q
- . ;if no data found
- . I YSRETV=-1 S:$$QUESTION(2,YSPARAM("TRY ANOTHER"))'=1 YSQUIT=1 Q
- . ; if continue search
- Q
- ;
- ;//---------
- ;The entry point for ICD-10 diagnosis search functionality
- ;can be called from applications directly
- ;input parameters :
- ; YSDT - date of interest
- ; YSDFLT - default values for the search string (can be a code by default)
- ; YSOUT - local array to return results (passed as a reference)
- ; YSPARAM - parameters/string constants (see SETPARAM for details)
- ;returns ICD-10 code selected by the user:
- ; IEN file #80;ICD code value^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)?"
- ;
- DIAG10(YSDT,YSDFLT,YSPARAM) ;
- N YSINP
- S YSINP=$$SRCHSTR(YSPARAM("SEARCH_PROMPT"),YSPARAM("HELP ?"),YSPARAM("HELP ??"),YSDFLT)
- I YSINP<0 Q +YSINP
- I $P(YSINP,U,2)?.N Q $P(YSINP,U,2)_U_"LIST CHOICE"
- Q $$LEXICD10($P(YSINP,U,2),YSDT,.YSPARAM)
- ;
- ;//---------
- ;The entry point for ICD-9 FileMan type (^DIC) diagnosis search functionality
- ;can be called from applications directly
- ;input parameters :
- ; YSDT - date of interest
- ; YSDFLT - default values for the search string (can be a code by default)
- ; YSOUT - local array to return results(passed as a reference)
- ; YSPARAM - parameters/string constants (see SETPARAM for details)
- ;returns ICD-9 code selected by the user:
- ; IEN file #80;ICD code value^description
- ; -2 no data or was aborted
- ; -1 if timeout
- DIAG9(YSDT,YSDFLT,YSOUT,YSPARAM) ;
- N YSINP,YSRETV
- S YSINP=$$SRCHSTR(YSPARAM("SEARCH_PROMPT"),YSPARAM("HELP ?"),YSPARAM("HELP ??"),YSDFLT)
- I YSINP=-1 Q -1 ;enter
- I YSINP=-3 Q -1 ;^ or ^^
- I YSINP=-2 Q -2 ;timeout or not found
- I YSINP=-1!(YSINP=-3) Q -2
- I YSINP<0 Q +YSINP
- S YSRETV=$$ICD9($P(YSINP,U,2),YSDT,.YSOUT)
- I YSRETV=-1 Q -2
- Q YSRETV
- ;
- ;--------------
- ;The entry point for ICD-10 diagnosis search functionality
- ;can be called from applications directly
- ; Supported ICR 5681 ($$DIAGSRCH^LEX10CS)
- ;input parameters :
- ; YSTXT - search string
- ; YSDATE - date of interest
- ; YSPAR - 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(YSTXT,YSDATE,YSPAR) ; ICD-10 Search
- N YSLVTXT
- ;parameters check
- S YSDATE=+$G(YSDATE)
- S YSDATE=$P(YSDATE,".",1)
- I YSDATE'?7N Q -1
- S YSTXT=$G(YSTXT)
- Q:'$L(YSTXT) -1
- N YSNUMB
- S YSNUMB=$$FREQ^LEXU(YSTXT)
- I YSNUMB>$$MAX^LEXU(30) D I $$QUESTION("N",YSPARAM("WISH CONTINUE"))'=1 Q -4
- . W ! D FORMWRIT(YSPAR("EXCEEDS MESSAGE1")_YSTXT_YSPAR("EXCEEDS MESSAGE2")_YSNUMB_YSPAR("EXCEEDS MESSAGE3")_YSTXT_""".",0)
- . D FORMWRIT("",2) W !
- ;new and set variables
- N DIROUT,DUOUT,DTOUT,YSEXIT,YSICDNT
- N YSRETV,YSXX,YSLEVEL
- S YSRETV=""
- S YSEXIT=0
- S YSLEVEL=1,YSLVTXT(YSLEVEL)=YSTXT ;level 1 stores the original search string
- ; main loop
- F Q:YSEXIT>0 D
- .K YSICDY
- .;W !,"Level #: ",YSLEVEL,", search string: ",YSLVTXT(YSLEVEL)
- .;get the search string from the current level and call LEX API
- .S YSICDY=$$DIAGSRCH^LEX10CS(YSLVTXT(YSLEVEL),.YSICDY,YSDATE,30)
- .S:$O(YSICDY(" "),-1)>0 YSICDY=+YSICDY
- .; Nothing found
- .I +YSICDY'>0 S YSEXIT=1 S YSXX=-1 Q
- .; display the list of items and ask the user to select the item from the list
- .S YSXX=$$SEL^YSLXDG2(.YSICDY,8)
- .; if ^ was entered
- .; if this is on the top level then quit
- .I YSXX=-2,YSLEVEL'>1 S YSRETV=-1 S YSEXIT=1 Q
- .; if lower level then go one level up
- .I YSXX=-2,YSLEVEL>1 S:YSLEVEL>1 YSLEVEL=YSLEVEL-1 Q
- .; If timeout, or not selected, or ^^ then quit
- .I YSXX=-1 S YSRETV=-1 S YSEXIT=1 Q
- .; if Code Found and Selected by the user save selection in YSRETV and quit
- .I $P(YSXX,";")'="99:CAT" S YSRETV=YSXX S YSEXIT=1 Q
- .; If Category Found and Selected by the user:
- .; go to the next inner level
- .; change level number
- .S YSLEVEL=YSLEVEL+1
- .; set the new level with the new search string
- .; and repeat
- .S YSLVTXT(YSLEVEL)=$P($P($G(YSXX),"^"),";",2)
- Q YSRETV
- ;----------
- ;ICD-9 lookup (FileMan lookup)
- ;Supported ICR 5773 (FileMan lookup for files #80 nad #80.1)
- ;Supported ICR 5699 ($$ICDDATA^ICDXCODE)
- ;input parameters :
- ; YSSRCH - search string
- ; YSICDT - date of interest
- ; YSOUT - local array to return detailed info (passed as a reference)
- ;returns ICD-9 code selected by the user:
- ; IEN file #80;ICD code value^description
- ; or
- ; "" if not found
- ; -1 if exit : ^ or ^^
- ; -2 if continue search
- ;the array YSOUT returns details if the return value >0, here is an example:
- ; YSOUT="6065^814.14"
- ; YSOUT(0)=814.14
- ; YSOUT(0,0)=814.14
- ; YSOUT(0,1)="6065^814.14^^FX PISIFORM-OPEN^^8^^1^^1^^^0^^^^2781001^^1^1"
- ; YSOUT(0,2)="OPEN FRACTURE OF PISIFORM BONE OF WRIST"
- ;Note: this API is not silent because the ICD lookup is not silent
- ICD9(YSSRCH,YSICDT,YSOUT) ;
- N KEY,X,Y,DIC,YSCDS
- ;KEY must be newed as ICD lookup code doesn't kill it
- S DIC="^ICD9(",DIC(0)="EQXZ"
- S YSCDS="ICD9"
- ;note: you must use Y for the 2nd parameter of $$ICDDATA^ICDXCODE
- S DIC("S")="I $P($$ICDDATA^ICDXCODE(YSCDS,Y,YSICDT),U,10)=1"
- ; both X and Y should be set to the search string
- S (X,Y)=YSSRCH
- D ^DIC
- M YSOUT=Y
- I $G(Y) Q $S(Y=-1:-1,1:+Y_";"_$P(Y,U,2)_U_$G(Y(0,2)))
- Q X
- ;
- ;---------
- ; Clean up environment and quit
- EXIT ;
- K %,DIC,DIR,DIROUT,DIRUT,DTOUT,DUOUT,X,Y
- Q
- ;
- ;-----------
- ; Look-up help for ICD10s.
- INPHLP ; Help text controller for ICD-10
- I X["???" D QM3 Q
- I X["??" D QM2 Q
- I X["?" D QM1 Q
- Q
- QM ; Diagnosis help text
- QM1 ; simple help text for 1 question mark
- W !,"Enter code or ""text"" for more information.",!
- Q
- QM2 ; enhanced help text for 2 question marks
- 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 associated"
- W !,"with the code.",!
- W !," or",!
- W !,"Enter a ""partial code"". Include the decimal when a search criterion includes"
- W !,"3 characters or more for code searches.",!
- Q
- QM3 ; further explanation of format when there are multiple returns, displayed for 3 question marks.
- 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 !,"14 matches found",!
- W !,"M91. - Juvenile osteochondrosis of hip and pelvis (19)",!
- W !,"This indicates that 14 unique matches or matching groups have been found and"
- W !,"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"
- W !," ""family"" that are possible selections.",!
- Q
- ;
- MIN2 ; Minimum length of 2 characters message
- W $C(7)," ??",!
- W !,"Please enter at least the first two characters of the ICD-10 code or "
- W !,"code description to start the search.",!
- Q
- ;
- INPHLP2 ; Look-up help for ICD9s
- 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
- ;--------
- ;prompt the user for a date of interest
- ;input parameters :
- ; YSPRMT - prompt
- ;returns YYYMMDD
- ; or -1 if invalid date
- ; or -2 if time out
- ; or -3 if ^
- ASKDATE(YSPRMT) ;
- N %DT,DIROUT,DUOUT,DTOUT
- S %DT="AEX",%DT("A")=$G(YSPRMT,"Enter a date: ")
- D ^%DT
- Q:Y<0 -1
- Q:$D(DTOUT) -2
- Q:X="^" -3
- Q (+Y)
- ;--------
- ;ask YES/NO questions
- ;input parameters :
- ; YSDFLT- 0/null- not default, 1- yes, 2 -no
- ; YSPROM - prompt string
- ;returns
- ; 2 - no,
- ; 1 -yes,
- ; 0 - no answer
- QUESTION(YSDFLT,YSPROM) ;
- W:$L($G(YSPROM)) !,YSPROM
- S %=$G(YSDFLT,2)
- D YN^DICN
- Q:%Y["^" -3
- I %=2!(%=1) Q %
- Q -2
- ;
- ;------------
- ;get search string
- ;input parameters :
- ; YSPRMT prompt text
- ; YSHLP1 "?" help text
- ; YSHLP2 "??" help text
- ; YSDFLT- default response
- ;returns piece1 ^ piece 2
- ; piece1:
- ; 0 if normal input
- ; or -1 if invalid data
- ; or -2 if time out
- ; or -3 if ^
- ; piece2: string entered by the user
- SRCHSTR(YSPRMT,YSHLP1,YSHLP2,YSDFLT) ;
- SRCHST2 N DIR
- S DIR("A")=YSPRMT
- S DIR("?")=YSHLP1
- S DIR("??")=YSHLP2
- I $L($G(YSDFLT)) S DIR("B")=YSDFLT
- S DIR(0)="FAO^0:245"
- D ^DIR
- Q:$D(DTOUT) -2
- Q:$D(DUOUT) -3
- Q:Y["^" -3
- I $L(Y)=1 D MIN2 G SRCHST2
- Q:Y="" -1
- Q 0_U_Y
- ;
- ;----------
- ;Determines and returns ACTIVE coding system for DIAGNOSES based on date of interest
- ;input parameters :
- ; YSICDD - 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 (suppported ICR 5780)
- ; 30 if ICD-10-CM is active system
- ; 1 if ICD-9-CM is active system
- ICDSYSDG(YSICDD) ;
- N YSIMPDT
- S YSICDD=$S(YSICDD<0!($L($P(YSICDD,".",1))'=7):DT,1:+$G(YSICDD))
- S YSIMPDT=$$IMPDATE^LEXU("10D")
- Q $S(YSICDD'<YSIMPDT:30,1:1)
- ;
- ;set parameters
- ;edit these hardcoded strings that areused for prompts, messages and so on to adjust
- ;them to your applicaion's needs
- ;input parameters
- ; YSPAR - local array to sets and store string constants for your messages and prompts
- SETPARAM(YSPAR) ;
- S YSPAR("ASKDATE")="Date of interest? "
- S YSPAR("SEARCH_PROMPT")="Enter ICD-10 DIAGNOSIS: " ; assume ICD-10
- S YSPAR("HELP ?")="^D INPHLP^YSLXDG"
- S YSPAR("HELP ??")="^D INPHLP^YSLXDG"
- S YSPAR("NO DATA FOUND")=" No data found"
- S YSPAR("EXITING")=" Exiting"
- S YSPAR("TRY LATER")=" Try again later"
- S YSPAR("NO DATA SELECTED")=" No data selected"
- S YSPAR("TRY ANOTHER")="Try another"
- S YSPAR("WISH CONTINUE")="Do you wish to continue (Y/N)"
- S YSPAR("EXCEEDS MESSAGE1")="Searching for """
- S YSPAR("EXCEEDS MESSAGE2")=""" requires inspecting "
- S YSPAR("EXCEEDS MESSAGE3")=" records to determine if they match the search criteria. This could take quite some time. Suggest refining the search by further specifying """
- Q
- ;
- ;
- ;a wrapper for ^DIWP
- ;accumulates a text and then writes it to the device
- ;input parameters :
- ; X - text
- ; YSMODE:
- ; 0 - start
- ; 1 - accumulate
- ; 2 - write
- ;example:
- ;D FORMWRIT^ZZLXDG("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^ZZLXDG("some more text ",1)
- ;D FORMWRIT^ZZLXDG("",2)
- FORMWRIT(X,YSMODE) ;
- N YSLI1
- ;if "start" mode
- I YSMODE=0 K ^UTILITY($J,"W")
- S DIWL=1,DIWR=79
- I $L(X)>0 D ^DIWP
- ;if "write" mode
- I YSMODE=2 D
- . S YSLI1=0 F S YSLI1=$O(^UTILITY($J,"W",1,YSLI1)) Q:+YSLI1=0 W !,$G(^UTILITY($J,"W",1,YSLI1,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
- ;press any key
- PRESSKEY ;
- R !!,"Press any key to continue.",YSKEY:DTIME
- Q
- ;display code info
- CODEINFO(YSXX2) ; Write Output
- N YSKEY,YSICDSTR
- S YSICDSTR="ICD"_$S(YSCSYS="30":"10",1:"9")
- N YSTXT,YSI S YSTXT(1)=$P($P(YSXX2,";",2),U,2)
- D PR^YSLXDG2(.YSTXT,48)
- W !," ",YSICDSTR," Diagnosis code:",?31,$P($P(YSXX2,";",2),U,1)
- W !," ",YSICDSTR," Diagnosis description:",?31,YSTXT(1)
- S YSI=1 F S YSI=$O(YSTXT(YSI)) Q:+YSI'>0 W !,?31,$G(YSTXT(YSI))
- Q
- ;
- --- Routine Detail --- with STRUCTURED ROUTINE LISTING ---[H[J[2J[HYSLXDG 15155 printed Mar 13, 2025@21:19:28 Page 2
- YSLXDG ; ALB/RBD - ICD-10 DIAGNOSIS CODE LOOK UP FOR MENTAL HEALTH ;10 May 2013 11:17 AM
- +1 ;;5.01;MENTAL HEALTH;**107**;Dec 30, 1994;Build 23
- +2 ;
- +3 ;based on ^ZZLXDG which is the standard Diagnosis Search Protocol
- +4 ;beginning routine.
- +5 ;
- +6 QUIT
- +7 ;
- EN ;
- +1 ;set standards variables, you might not need this if it
- DO INITVARS
- +2 ; was already done in your application
- +3 ; to manage loop
- NEW YSQUIT
- +4 ;to store the selected code information
- KILL YSRETV
- +5 ; to set your application specific prompts and messages
- NEW YSPARAM
- +6 ;coding system "ICD9" or ICD10"
- NEW YSCSYS
- +7 ;to return all available information about the selected code
- NEW YSOUT
- +8 ;settings:
- +9 ;edit the SETPARAM subroutine below to set your
- DO SETPARAM(.YSPARAM)
- +10 ; application specific prompts
- +11 IF YSDT'>0
- SET YSRETV=-1
- QUIT
- +12 ;starting main loop
- +13 SET YSQUIT=0
- FOR
- if YSQUIT=1
- QUIT
- Begin DoDot:1
- +14 SET YSRETV=0
- SET YSOUT=""
- +15 ;reprompt a few lines down
- WRITE !!
- +16 ;prompt for the date of interest (date should be available for MH)
- +17 IF YSDT'>0
- SET YSRETV=-1
- SET YSQUIT=1
- QUIT
- +18 ;S YSDT=$$ASKDATE(YSPARAM("ASKDATE"))
- +19 ;prompt for "try again" with "No" as default if ^ or null entered
- +20 ;for the date or if timed out
- +21 IF YSDT'>0
- if $$QUESTION(2,YSPARAM("TRY ANOTHER"))'=1
- SET YSQUIT=1
- QUIT
- +22 ;determine coding system based on the date of interest
- +23 ;If coding system not ICD-10 or greater, then Quit (let MH code
- +24 ; handle it as before for now)
- +25 SET YSCSYS=$$ICDSYSDG(YSDT)
- IF YSCSYS=1
- SET YSRETV=-1
- SET YSQUIT=1
- QUIT
- +26 ;set default response for your prompt
- +27 SET YSDFLT=""
- +28 ;run either ICD9 or ICD10 prompt/search/select logic
- +29 ;ICD9 (1 is a pointer to the ICD-9 diagnosis system entry in the
- +30 ;new file #80.4)
- +31 IF YSCSYS=1
- SET YSRETV=$$DIAG9(YSDT,YSDFLT,.YSOUT,.YSPARAM)
- IF YSRETV=-2
- if $$QUESTION(1,YSPARAM("TRY ANOTHER"))'=1
- SET YSQUIT=1
- QUIT
- +32 ;ICD10 (30 is a pointer to the ICD-10 diagnosis system entry in the new file #80.4)
- +33 IF YSCSYS=30
- SET YSRETV=$$DIAG10(YSDT,YSDFLT,.YSPARAM)
- +34 IF $PIECE(YSRETV,U,2)="LIST CHOICE"
- SET YSRETV=$PIECE(YSRETV,U,1)
- SET YSQUIT=1
- QUIT
- +35 ;display information about the code selected
- +36 IF YSRETV>0
- WRITE !,"SELECTED: "
- DO CODEINFO(YSRETV)
- SET YSQUIT=1
- QUIT
- +37 ;if no data found
- +38 IF YSRETV=""
- WRITE !!,YSPARAM("NO DATA FOUND")
- if $$QUESTION(1,YSPARAM("TRY ANOTHER"))'=1
- SET YSQUIT=1
- SET YSRETV=-1
- QUIT
- +39 ;in ICD10 if the user answered NO for the question "Do you wish to continue(Y/N)?"
- +40 IF YSRETV=-4
- if $$QUESTION(1,YSPARAM("TRY ANOTHER"))'=1
- SET YSQUIT=1
- QUIT
- +41 ;no data or was aborted
- +42 IF YSRETV=-2
- if $$QUESTION(1,YSPARAM("TRY ANOTHER"))'=1
- SET YSQUIT=1
- QUIT
- +43 ;if exit due to ^ in the ICD Diagnosis code prompt
- +44 IF YSRETV=-3
- if $$QUESTION(2,YSPARAM("TRY ANOTHER"))'=1
- SET YSQUIT=1
- QUIT
- +45 ;if no data found
- +46 IF YSRETV=-1
- if $$QUESTION(2,YSPARAM("TRY ANOTHER"))'=1
- SET YSQUIT=1
- QUIT
- +47 ; if continue search
- End DoDot:1
- +48 QUIT
- +49 ;
- +50 ;//---------
- +51 ;The entry point for ICD-10 diagnosis search functionality
- +52 ;can be called from applications directly
- +53 ;input parameters :
- +54 ; YSDT - date of interest
- +55 ; YSDFLT - default values for the search string (can be a code by default)
- +56 ; YSOUT - local array to return results (passed as a reference)
- +57 ; YSPARAM - parameters/string constants (see SETPARAM for details)
- +58 ;returns ICD-10 code selected by the user:
- +59 ; IEN file #80;ICD code value^description
- +60 ; results
- +61 ; or -1 if invalid data(press enter)
- +62 ; "" if not found
- +63 ; or -2 if time out
- +64 ; or -3 if ^ or ^^
- +65 ; or -4 in ICD10 if the user answered NO for the question "Do you wish to continue(Y/N)?"
- +66 ;
- DIAG10(YSDT,YSDFLT,YSPARAM) ;
- +1 NEW YSINP
- +2 SET YSINP=$$SRCHSTR(YSPARAM("SEARCH_PROMPT"),YSPARAM("HELP ?"),YSPARAM("HELP ??"),YSDFLT)
- +3 IF YSINP<0
- QUIT +YSINP
- +4 IF $PIECE(YSINP,U,2)?.N
- QUIT $PIECE(YSINP,U,2)_U_"LIST CHOICE"
- +5 QUIT $$LEXICD10($PIECE(YSINP,U,2),YSDT,.YSPARAM)
- +6 ;
- +7 ;//---------
- +8 ;The entry point for ICD-9 FileMan type (^DIC) diagnosis search functionality
- +9 ;can be called from applications directly
- +10 ;input parameters :
- +11 ; YSDT - date of interest
- +12 ; YSDFLT - default values for the search string (can be a code by default)
- +13 ; YSOUT - local array to return results(passed as a reference)
- +14 ; YSPARAM - parameters/string constants (see SETPARAM for details)
- +15 ;returns ICD-9 code selected by the user:
- +16 ; IEN file #80;ICD code value^description
- +17 ; -2 no data or was aborted
- +18 ; -1 if timeout
- DIAG9(YSDT,YSDFLT,YSOUT,YSPARAM) ;
- +1 NEW YSINP,YSRETV
- +2 SET YSINP=$$SRCHSTR(YSPARAM("SEARCH_PROMPT"),YSPARAM("HELP ?"),YSPARAM("HELP ??"),YSDFLT)
- +3 ;enter
- IF YSINP=-1
- QUIT -1
- +4 ;^ or ^^
- IF YSINP=-3
- QUIT -1
- +5 ;timeout or not found
- IF YSINP=-2
- QUIT -2
- +6 IF YSINP=-1!(YSINP=-3)
- QUIT -2
- +7 IF YSINP<0
- QUIT +YSINP
- +8 SET YSRETV=$$ICD9($PIECE(YSINP,U,2),YSDT,.YSOUT)
- +9 IF YSRETV=-1
- QUIT -2
- +10 QUIT YSRETV
- +11 ;
- +12 ;--------------
- +13 ;The entry point for ICD-10 diagnosis search functionality
- +14 ;can be called from applications directly
- +15 ; Supported ICR 5681 ($$DIAGSRCH^LEX10CS)
- +16 ;input parameters :
- +17 ; YSTXT - search string
- +18 ; YSDATE - date of interest
- +19 ; YSPAR - array with text messages and other string constants
- +20 ;returns ICD-10 code selected by the user:
- +21 ; IEN file #80;ICD code value^description
- +22 ; or
- +23 ; "" if not found
- +24 ; -1 if exit : ^ or ^^
- +25 ; -2 if continue searching
- +26 ;
- LEXICD10(YSTXT,YSDATE,YSPAR) ; ICD-10 Search
- +1 NEW YSLVTXT
- +2 ;parameters check
- +3 SET YSDATE=+$GET(YSDATE)
- +4 SET YSDATE=$PIECE(YSDATE,".",1)
- +5 IF YSDATE'?7N
- QUIT -1
- +6 SET YSTXT=$GET(YSTXT)
- +7 if '$LENGTH(YSTXT)
- QUIT -1
- +8 NEW YSNUMB
- +9 SET YSNUMB=$$FREQ^LEXU(YSTXT)
- +10 IF YSNUMB>$$MAX^LEXU(30)
- Begin DoDot:1
- +11 WRITE !
- DO FORMWRIT(YSPAR("EXCEEDS MESSAGE1")_YSTXT_YSPAR("EXCEEDS MESSAGE2")_YSNUMB_YSPAR("EXCEEDS MESSAGE3")_YSTXT_""".",0)
- +12 DO FORMWRIT("",2)
- WRITE !
- End DoDot:1
- IF $$QUESTION("N",YSPARAM("WISH CONTINUE"))'=1
- QUIT -4
- +13 ;new and set variables
- +14 NEW DIROUT,DUOUT,DTOUT,YSEXIT,YSICDNT
- +15 NEW YSRETV,YSXX,YSLEVEL
- +16 SET YSRETV=""
- +17 SET YSEXIT=0
- +18 ;level 1 stores the original search string
- SET YSLEVEL=1
- SET YSLVTXT(YSLEVEL)=YSTXT
- +19 ; main loop
- +20 FOR
- if YSEXIT>0
- QUIT
- Begin DoDot:1
- +21 KILL YSICDY
- +22 ;W !,"Level #: ",YSLEVEL,", search string: ",YSLVTXT(YSLEVEL)
- +23 ;get the search string from the current level and call LEX API
- +24 SET YSICDY=$$DIAGSRCH^LEX10CS(YSLVTXT(YSLEVEL),.YSICDY,YSDATE,30)
- +25 if $ORDER(YSICDY(" "),-1)>0
- SET YSICDY=+YSICDY
- +26 ; Nothing found
- +27 IF +YSICDY'>0
- SET YSEXIT=1
- SET YSXX=-1
- QUIT
- +28 ; display the list of items and ask the user to select the item from the list
- +29 SET YSXX=$$SEL^YSLXDG2(.YSICDY,8)
- +30 ; if ^ was entered
- +31 ; if this is on the top level then quit
- +32 IF YSXX=-2
- IF YSLEVEL'>1
- SET YSRETV=-1
- SET YSEXIT=1
- QUIT
- +33 ; if lower level then go one level up
- +34 IF YSXX=-2
- IF YSLEVEL>1
- if YSLEVEL>1
- SET YSLEVEL=YSLEVEL-1
- QUIT
- +35 ; If timeout, or not selected, or ^^ then quit
- +36 IF YSXX=-1
- SET YSRETV=-1
- SET YSEXIT=1
- QUIT
- +37 ; if Code Found and Selected by the user save selection in YSRETV and quit
- +38 IF $PIECE(YSXX,";")'="99:CAT"
- SET YSRETV=YSXX
- SET YSEXIT=1
- QUIT
- +39 ; If Category Found and Selected by the user:
- +40 ; go to the next inner level
- +41 ; change level number
- +42 SET YSLEVEL=YSLEVEL+1
- +43 ; set the new level with the new search string
- +44 ; and repeat
- +45 SET YSLVTXT(YSLEVEL)=$PIECE($PIECE($GET(YSXX),"^"),";",2)
- End DoDot:1
- +46 QUIT YSRETV
- +47 ;----------
- +48 ;ICD-9 lookup (FileMan lookup)
- +49 ;Supported ICR 5773 (FileMan lookup for files #80 nad #80.1)
- +50 ;Supported ICR 5699 ($$ICDDATA^ICDXCODE)
- +51 ;input parameters :
- +52 ; YSSRCH - search string
- +53 ; YSICDT - date of interest
- +54 ; YSOUT - local array to return detailed info (passed as a reference)
- +55 ;returns ICD-9 code selected by the user:
- +56 ; IEN file #80;ICD code value^description
- +57 ; or
- +58 ; "" if not found
- +59 ; -1 if exit : ^ or ^^
- +60 ; -2 if continue search
- +61 ;the array YSOUT returns details if the return value >0, here is an example:
- +62 ; YSOUT="6065^814.14"
- +63 ; YSOUT(0)=814.14
- +64 ; YSOUT(0,0)=814.14
- +65 ; YSOUT(0,1)="6065^814.14^^FX PISIFORM-OPEN^^8^^1^^1^^^0^^^^2781001^^1^1"
- +66 ; YSOUT(0,2)="OPEN FRACTURE OF PISIFORM BONE OF WRIST"
- +67 ;Note: this API is not silent because the ICD lookup is not silent
- ICD9(YSSRCH,YSICDT,YSOUT) ;
- +1 NEW KEY,X,Y,DIC,YSCDS
- +2 ;KEY must be newed as ICD lookup code doesn't kill it
- +3 SET DIC="^ICD9("
- SET DIC(0)="EQXZ"
- +4 SET YSCDS="ICD9"
- +5 ;note: you must use Y for the 2nd parameter of $$ICDDATA^ICDXCODE
- +6 SET DIC("S")="I $P($$ICDDATA^ICDXCODE(YSCDS,Y,YSICDT),U,10)=1"
- +7 ; both X and Y should be set to the search string
- +8 SET (X,Y)=YSSRCH
- +9 DO ^DIC
- +10 MERGE YSOUT=Y
- +11 IF $GET(Y)
- QUIT $SELECT(Y=-1:-1,1:+Y_";"_$PIECE(Y,U,2)_U_$GET(Y(0,2)))
- +12 QUIT X
- +13 ;
- +14 ;---------
- +15 ; 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 ICD10s.
- INPHLP ; Help text controller for ICD-10
- +1 IF X["???"
- DO QM3
- QUIT
- +2 IF X["??"
- DO QM2
- QUIT
- +3 IF X["?"
- DO QM1
- QUIT
- +4 QUIT
- QM ; Diagnosis help text
- QM1 ; simple help text for 1 question mark
- +1 WRITE !,"Enter code or ""text"" for more information.",!
- +2 QUIT
- QM2 ; enhanced help text for 2 question marks
- +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 associated"
- +4 WRITE !,"with the code.",!
- +5 WRITE !," or",!
- +6 WRITE !,"Enter a ""partial code"". Include the decimal when a search criterion includes"
- +7 WRITE !,"3 characters or more for code searches.",!
- +8 QUIT
- QM3 ; further explanation of format when there are multiple returns, displayed for 3 question marks.
- +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 !,"14 matches found",!
- +8 WRITE !,"M91. - Juvenile osteochondrosis of hip and pelvis (19)",!
- +9 WRITE !,"This indicates that 14 unique matches or matching groups have been found and"
- +10 WRITE !,"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"
- +14 WRITE !," ""family"" that are possible selections.",!
- +15 QUIT
- +16 ;
- MIN2 ; Minimum length of 2 characters message
- +1 WRITE $CHAR(7)," ??",!
- +2 WRITE !,"Please enter at least the first two characters of the ICD-10 code or "
- +3 WRITE !,"code description to start the search.",!
- +4 QUIT
- +5 ;
- INPHLP2 ; Look-up help for ICD9s
- +1 WRITE !," Enter a ""free text"" term. Best results occur using one to "
- +2 WRITE !," three full or partial words without a suffix"
- +3 if $GET(X)'["??"
- WRITE "."
- +4 if $GET(X)["??"
- WRITE " (i.e., ""DIABETES"","
- +5 if $GET(X)["??"
- WRITE !," ""DIAB MELL"",""DIAB MELL INSUL"")"
- +6 WRITE !," or "
- +7 WRITE !," Enter a classification code (ICD/CPT etc) to find the single "
- +8 WRITE !," term associated with the code."
- +9 if $GET(X)["??"
- WRITE " Example, a lookup of code 239.0 "
- +10 if $GET(X)["??"
- WRITE !," returns one and only one term, that is the preferred "
- +11 if $GET(X)["??"
- WRITE !," term for the code 239.0, ""Neoplasm of unspecified nature "
- +12 if $GET(X)["??"
- WRITE !," of digestive system"""
- +13 WRITE !," or "
- +14 WRITE !," Enter a classification code (ICD/CPT etc) followed by a plus"
- +15 WRITE !," sign (+) to retrieve all terms associated with the code."
- +16 if $GET(X)["??"
- WRITE " Example,"
- +17 if $GET(X)["??"
- WRITE !," a lookup of 239.0+ returns all terms that are linked to the "
- +18 if $GET(X)["??"
- WRITE !," code 239.0."
- +19 QUIT
- +20 ;--------
- +21 ;prompt the user for a date of interest
- +22 ;input parameters :
- +23 ; YSPRMT - prompt
- +24 ;returns YYYMMDD
- +25 ; or -1 if invalid date
- +26 ; or -2 if time out
- +27 ; or -3 if ^
- ASKDATE(YSPRMT) ;
- +1 NEW %DT,DIROUT,DUOUT,DTOUT
- +2 SET %DT="AEX"
- SET %DT("A")=$GET(YSPRMT,"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 ; YSDFLT- 0/null- not default, 1- yes, 2 -no
- +12 ; YSPROM - prompt string
- +13 ;returns
- +14 ; 2 - no,
- +15 ; 1 -yes,
- +16 ; 0 - no answer
- QUESTION(YSDFLT,YSPROM) ;
- +1 if $LENGTH($GET(YSPROM))
- WRITE !,YSPROM
- +2 SET %=$GET(YSDFLT,2)
- +3 DO YN^DICN
- +4 if %Y["^"
- QUIT -3
- +5 IF %=2!(%=1)
- QUIT %
- +6 QUIT -2
- +7 ;
- +8 ;------------
- +9 ;get search string
- +10 ;input parameters :
- +11 ; YSPRMT prompt text
- +12 ; YSHLP1 "?" help text
- +13 ; YSHLP2 "??" help text
- +14 ; YSDFLT- default response
- +15 ;returns piece1 ^ piece 2
- +16 ; piece1:
- +17 ; 0 if normal input
- +18 ; or -1 if invalid data
- +19 ; or -2 if time out
- +20 ; or -3 if ^
- +21 ; piece2: string entered by the user
- SRCHSTR(YSPRMT,YSHLP1,YSHLP2,YSDFLT) ;
- SRCHST2 NEW DIR
- +1 SET DIR("A")=YSPRMT
- +2 SET DIR("?")=YSHLP1
- +3 SET DIR("??")=YSHLP2
- +4 IF $LENGTH($GET(YSDFLT))
- SET DIR("B")=YSDFLT
- +5 SET DIR(0)="FAO^0:245"
- +6 DO ^DIR
- +7 if $DATA(DTOUT)
- QUIT -2
- +8 if $DATA(DUOUT)
- QUIT -3
- +9 if Y["^"
- QUIT -3
- +10 IF $LENGTH(Y)=1
- DO MIN2
- GOTO SRCHST2
- +11 if Y=""
- QUIT -1
- +12 QUIT 0_U_Y
- +13 ;
- +14 ;----------
- +15 ;Determines and returns ACTIVE coding system for DIAGNOSES based on date of interest
- +16 ;input parameters :
- +17 ; YSICDD - date of interest
- +18 ; if date of interest is null, today's date will be assumed
- +19 ;returns coding system
- +20 ; as a pointer to the ICD CODING SYSTEM file #80.4 (suppported ICR 5780)
- +21 ; 30 if ICD-10-CM is active system
- +22 ; 1 if ICD-9-CM is active system
- ICDSYSDG(YSICDD) ;
- +1 NEW YSIMPDT
- +2 SET YSICDD=$SELECT(YSICDD<0!($LENGTH($PIECE(YSICDD,".",1))'=7):DT,1:+$GET(YSICDD))
- +3 SET YSIMPDT=$$IMPDATE^LEXU("10D")
- +4 QUIT $SELECT(YSICDD'<YSIMPDT:30,1:1)
- +5 ;
- +6 ;set parameters
- +7 ;edit these hardcoded strings that areused for prompts, messages and so on to adjust
- +8 ;them to your applicaion's needs
- +9 ;input parameters
- +10 ; YSPAR - local array to sets and store string constants for your messages and prompts
- SETPARAM(YSPAR) ;
- +1 SET YSPAR("ASKDATE")="Date of interest? "
- +2 ; assume ICD-10
- SET YSPAR("SEARCH_PROMPT")="Enter ICD-10 DIAGNOSIS: "
- +3 SET YSPAR("HELP ?")="^D INPHLP^YSLXDG"
- +4 SET YSPAR("HELP ??")="^D INPHLP^YSLXDG"
- +5 SET YSPAR("NO DATA FOUND")=" No data found"
- +6 SET YSPAR("EXITING")=" Exiting"
- +7 SET YSPAR("TRY LATER")=" Try again later"
- +8 SET YSPAR("NO DATA SELECTED")=" No data selected"
- +9 SET YSPAR("TRY ANOTHER")="Try another"
- +10 SET YSPAR("WISH CONTINUE")="Do you wish to continue (Y/N)"
- +11 SET YSPAR("EXCEEDS MESSAGE1")="Searching for """
- +12 SET YSPAR("EXCEEDS MESSAGE2")=""" requires inspecting "
- +13 SET YSPAR("EXCEEDS MESSAGE3")=" records to determine if they match the search criteria. This could take quite some time. Suggest refining the search by further specifying """
- +14 QUIT
- +15 ;
- +16 ;
- +17 ;a wrapper for ^DIWP
- +18 ;accumulates a text and then writes it to the device
- +19 ;input parameters :
- +20 ; X - text
- +21 ; YSMODE:
- +22 ; 0 - start
- +23 ; 1 - accumulate
- +24 ; 2 - write
- +25 ;example:
- +26 ;D FORMWRIT^ZZLXDG("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)
- +27 ;D FORMWRIT^ZZLXDG("some more text ",1)
- +28 ;D FORMWRIT^ZZLXDG("",2)
- FORMWRIT(X,YSMODE) ;
- +1 NEW YSLI1
- +2 ;if "start" mode
- +3 IF YSMODE=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 YSMODE=2
- Begin DoDot:1
- +8 SET YSLI1=0
- FOR
- SET YSLI1=$ORDER(^UTILITY($JOB,"W",1,YSLI1))
- if +YSLI1=0
- QUIT
- WRITE !,$GET(^UTILITY($JOB,"W",1,YSLI1,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 ;press any key
- PRESSKEY ;
- +1 READ !!,"Press any key to continue.",YSKEY:DTIME
- +2 QUIT
- +3 ;display code info
- CODEINFO(YSXX2) ; Write Output
- +1 NEW YSKEY,YSICDSTR
- +2 SET YSICDSTR="ICD"_$SELECT(YSCSYS="30":"10",1:"9")
- +3 NEW YSTXT,YSI
- SET YSTXT(1)=$PIECE($PIECE(YSXX2,";",2),U,2)
- +4 DO PR^YSLXDG2(.YSTXT,48)
- +5 WRITE !," ",YSICDSTR," Diagnosis code:",?31,$PIECE($PIECE(YSXX2,";",2),U,1)
- +6 WRITE !," ",YSICDSTR," Diagnosis description:",?31,YSTXT(1)
- +7 SET YSI=1
- FOR
- SET YSI=$ORDER(YSTXT(YSI))
- if +YSI'>0
- QUIT
- WRITE !,?31,$GET(YSTXT(YSI))
- +8 QUIT
- +9 ;