Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: LEX10PL

LEX10PL.m

Go to the documentation of this file.
  1. LEX10PL ;ISL/KER - ICD-10 Procedure Lookup ;04/21/2014
  1. ;;2.0;LEXICON UTILITY;**80**;Sep 23, 1996;Build 10
  1. ;
  1. ; Global Variables
  1. ; ^%ZOSF("TEST" ICR 10096
  1. ; ^LEX(757.033 N/A
  1. ; ^XTMP( SACC 2.3.2.5.2
  1. ;
  1. ; External References
  1. ; HOME^%ZIS ICR 10086
  1. ; ENDR^%ZISS ICR 10088
  1. ; KILL^%ZISS ICR 10088
  1. ; ^DIM ICR 10016
  1. ; $$GET1^DIQ ICR 2056
  1. ; ^DIR ICR 10026
  1. ; $$ICDOP^ICDEX ICR 5747
  1. ; $$IMP^ICDEX ICR 5747
  1. ; $$DT^XLFDT ICR 10103
  1. ; $$FMADD^XLFDT ICR 10103
  1. ; $$UP^XLFSTR ICR 10104
  1. ;
  1. EN ; Main Entry Point
  1. ;
  1. ; Input
  1. ;
  1. ; None
  1. ;
  1. ; Output
  1. ;
  1. ; Y 2 Piece "^" delimited string
  1. ; 1 IEN to the Expression File 757.01
  1. ; 2 Expression Display Text
  1. ;
  1. ; Y("ICD") 2 Piece "^" delimited string
  1. ; 1 IEN ICD OPERATION/PROCEDURE File #80.1
  1. ; 2 ICD Code
  1. ;
  1. N LEXENV S LEXENV=$$ENV Q:+LEXENV'>0 N X,LEXDT,LEXIM
  1. N BOLD,DIR,DIRB,DIROUT,DIRUT,DTOUT,DUOUT,IOINHI,IOINORM,LEX
  1. N LEXA,LEXB,LEXC,LEXCHR,LEXCODE,LEXCOM,LEXDT,LEXE,LEXEFF
  1. N LEXENV,LEXERR,LEXFD,LEXI,LEXICD,LEXID,LEXIEN,LEXIM,LEXIN
  1. N LEXIT,LEXKEY,LEXL,LEXN,LEXNAM,LEXND,LEXNM,LEXNT,LEXO
  1. N LEXOFF,LEXOK,LEXPCDAT,LEXPSN,LEXR,LEXRTN,LEXS,LEXSBR
  1. N LEXSEC,LEXSIEN,LEXSTA,LEXT,LEXTAG,LEXTD,LEXTERM,LEXTOT
  1. N LEXTXT,LEXUP,LEXUSR,LEXV,LEXVAL,LEXVDT,LEXX,LEXY,NORM,X
  1. S LEXDT=$G(LEXVDT) S:LEXDT'?7N LEXDT=$$DT^XLFDT
  1. S LEXIM=$$IMP^ICDEX(30) S:LEXDT'>LEXIM LEXDT=LEXIM S X=$$SO
  1. K Y,LEXY D:$L(X)&(X'["^") BEG N LEXTEST
  1. Q
  1. BEG ; Begin Recursive Loop
  1. N DIROUT,DUOUT,DTOUT,LEXIT,LEXVDT,LEXTXT,LEXUP,LEXY,LEXX
  1. N LEXBEG,LEXEND,LEXELP,LEXSEC
  1. K Y S Y=-1,U="^",LEXTXT=$G(X) Q:'$L(LEXTXT)
  1. S LEXVDT=$G(LEXDT),LEXIT=0
  1. LOOK ; Lookup
  1. Q:+($G(LEXIT))>0 K LEXY
  1. S LEXY=$$PCSDIG^LEX10CS(LEXTXT,LEXDT),LEXTOT=$$FND
  1. S:$L(LEXTXT)>0 LEXUP=$E(LEXTXT,1,($L(LEXTXT)-1))
  1. I $L($O(LEXPCDAT("NEXLEV",""))) S LEXCHR=$$SEL^LEX10PLS(LEXTXT)
  1. S LEXCHR=$G(LEXCHR)
  1. ; Quit if
  1. ; Timed out or user enters "^^"
  1. I $D(DTOUT)!($D(DIROUT)) S LEXIT=1 K X Q
  1. ; Up one level (LEXUP) if user enters "^"
  1. ; Quit if already at top level and user enters "^"
  1. I $D(DUOUT),'$D(DIROUT),$D(DIRUT),$L($G(LEXTXT))=1 D Q
  1. . K X,LEXUP,LEXNT S LEXIT=1,(LEXCHR,LEXTXT,X)=""
  1. I $D(DUOUT),'$D(DIROUT),$D(DIRUT),$L($G(LEXUP)) D G:'LEXIT LOOK Q:LEXIT
  1. . K X S (X,LEXTXT)=LEXUP I '$L(X) S LEXIT=1 K X S LEXTXT=""
  1. . S:$L($G(LEXNT))>1 LEXNT=$E($G(LEXNT),1,($L($G(LEXNT))-1))
  1. I $D(DUOUT),'$D(DIROUT),$D(DIRUT),'$L($G(LEXUP)) S LEXIT=1 K X S LEXTXT="" Q
  1. I $D(DUOUT)&('$D(DIROUT)) K:'$D(LEXNT) X Q
  1. ; No Selection Made
  1. I '$D(DUOUT),LEXCHR="" S LEXIT=1
  1. ; Character Found and Selected
  1. I $L(LEXCHR),LEXCHR'["^",(LEXCHR?1N!(LEXCHR?1U)) D Q:+($G(Y))>0
  1. . K Y S LEXTXT=LEXTXT_LEXCHR Q:$L(LEXTXT)<7
  1. . N LEXSTA,LEXSIEN,LEXIEN,LEXCODE,LEXEFF,LEXTERM,LEXND,LEXICD
  1. . S LEXSTA=$$STATCHK^LEXSRC2(LEXTXT,$G(LEXDT),,31)
  1. . S LEXSIEN=$P(LEXSTA,"^",2)
  1. . S LEXEFF=$P(LEXSTA,"^",3)
  1. . S LEXSTA=$P(LEXSTA,"^",1)
  1. . S LEXND=$G(^LEX(757.02,+LEXSIEN,0))
  1. . S LEXCODE=$P(LEXND,"^",2),LEXIEN=+LEXND
  1. . S LEXTERM=$G(^LEX(757.01,+LEXIEN,0))
  1. . S LEXICD=+$$ICDOP^ICDEX(LEXCODE,,31),LEXIT=1
  1. . S Y=LEXIEN_"^"_LEXTERM,Y("ICD")=LEXICD_"^"_LEXCODE
  1. . D END(LEXCODE,LEXTERM)
  1. ; Category Found and Selected
  1. I $L(LEXCHR),LEXCHR'["^",(LEXCHR?1N!(LEXCHR?1U)) D G:+($G(LEXIT))'>0 LOOK
  1. . D NXT I $G(Y)="^" D
  1. . . Q:'$L(LEXTXT) S LEXTXT=$E(LEXTXT,1,($L(LEXTXT)-1)) Q:'$L(LEXTXT)
  1. . . F S LEXTXT=$E(LEXTXT,1,($L(LEXTXT)-1)) Q:$$TOT($E(LEXTXT,1,($L(LEXTXT)-1)),LEXDT)>0
  1. Q
  1. NXT ; Next
  1. Q:+($G(LEXIT))>0 N LEXNT,LEXND
  1. S LEXNT=$G(LEXTXT),LEXND=$G(LEXDT)
  1. N LEXTXT,LEXDT S LEXTXT=LEXNT,LEXDT=LEXND
  1. G LOOK
  1. Q
  1. TOT(X,Y) ; Total Possible
  1. N LEXPCDAT,LEXDT,LEXY S X=$G(X) Q:'$L(X) 0 S LEXDT=$G(Y)
  1. S LEXY=$$PCSDIG^LEX10CS(X,LEXDT),X=$$FND
  1. Q X
  1. ;
  1. SO(X) ; Enter a Code/Code Fragment
  1. N DIR,DIROUT,DIRUT,DTOUT,DUOUT,DIRB,LEXTD,Y,LEX,LEXCOM,LEXERR,LEXSBR
  1. S LEXTD=$G(LEXVDT) S:LEXTD'?7N LEXTD=$$DT^XLFDT
  1. S LEXCOM="Enter a Procedure Code/Code Fragment"
  1. S DIR(0)="FAO^1:30",DIR("A")=" "_LEXCOM_": "
  1. S (LEXSBR,DIRB)=$$RET("LEX10PL","SO",+($G(DUZ)),LEXCOM)
  1. S DIR("PRE")="S X=$$SOP^LEX10PL(X) W:X[""??"" "" ??"""
  1. S (DIR("?"),DIR("??"))="^D SOH^LEX10PL" D ^DIR
  1. I $D(DTOUT) W !!,?3,"Try later",! Q "^"
  1. I '$L(X)!('$L(Y)) W !!,?3,"No selection made",! Q "^"
  1. S:$D(DUOUT) X="^" S:$D(DIROUT) X="^^"
  1. I $G(X)["^" W !!,?3,"Selection aborted",! Q "^"
  1. S (LEX,X)=$G(Y) D:$L(LEX)&(LEX'["^") SAV("LEX10PL","SO",+($G(DUZ)),LEXCOM,LEX)
  1. Q X
  1. SOH ; Select a Code Help
  1. W:$L($G(LEXERR)) !," ",LEXERR,!
  1. W !," Enter either: "
  1. W !," Example"
  1. W !," ICD-10 Procedure code 04LE0CT"
  1. W !," Partial ICD-10 Procedure code 00C6",!
  1. W !," May not exceed 7 characters. Enter return or ""^"""
  1. W !," to exit."
  1. K LEXERR
  1. Q
  1. SOP(X) ; Code Pre-Processing
  1. N LEX,LEXO,LEXR,LEXB,LEXOK K LEXERR Q:'$L($G(X)) ""
  1. S (LEX,X)=$$UP^XLFSTR($G(X)) Q:'$L(LEX) "??"
  1. Q:LEX["?" "??" S:LEX["^^" (LEX,X)="^^",DUOUT=1,DIROUT=1
  1. S:LEX["^"&(LEX'["^^") (LEX,X)="^",DUOUT=1 Q:LEX["^" X Q:'$L(LEX) ""
  1. I LEX["." S LEXERR="Procedure codes do not have decimal places" Q "??"
  1. I $E(LEX,1)="Z" S LEXERR="First character must not contain ""Z""" Q "??"
  1. S (LEXC,LEXO,LEXR)=$E(LEX,1),LEXO=$C($A(LEXO)-1)_"~ ",LEXN=($O(^LEX(757.02,"APR",LEXO)))
  1. I (LEXR'?1U&(LEXR'?1N)) S LEXERR="First character must be uppercase or numeric" Q "??"
  1. I $E(LEXN,1,$L(LEXC))'=LEXC S LEXERR="First character """_$E(LEX,1)_""" is not valid" Q "??"
  1. I $L(LEX)'>1 S X=LEX Q X
  1. S (LEXC,LEXO)=$E(LEX,1,2),LEXR=$E(LEX,2),LEXO=$E(LEXO,1,($L(LEXO)-1))_$C($A($E(LEXO,$L(LEXO)))-1)_"~"
  1. S LEXN=($O(^LEX(757.02,"APR",LEXO)))
  1. I (LEXR'?1U&(LEXR'?1N)) S LEXERR="Second character must be uppercase or numeric" Q "??"
  1. I $L(LEX)>1 I $E(LEXN,1,$L(LEXC))'=LEXC S LEXERR="Second character """_LEXR_""" is not valid" Q "??"
  1. I $L(LEX)'>2 S X=LEX Q X
  1. S (LEXC,LEXO)=$E(LEX,1,3),LEXR=$E(LEX,3),LEXO=$E(LEXO,1,($L(LEXO)-1))_$C($A($E(LEXO,$L(LEXO)))-1)_"~"
  1. S LEXN=($O(^LEX(757.02,"APR",LEXO)))
  1. I (LEXR'?1U&(LEXR'?1N))!(LEXR="Z") S LEXERR="Third character must not contain ""Z""" Q "??"
  1. I (LEXR'?1U&(LEXR'?1N)) S LEXERR="Third character must be uppercase or numeric" Q "??"
  1. I $L(X)>1 I $E(LEXN,1,$L(LEXC))'=LEXC S LEXERR="Third character """_LEXR_""" is not valid" Q "??"
  1. I $L(LEX)'>3 S X=LEX Q X
  1. S (LEXC,LEXO)=$E(LEX,1,4),LEXR=$E(LEX,4),LEXO=$E(LEXO,1,($L(LEXO)-1))_$C($A($E(LEXO,$L(LEXO)))-1)_"~"
  1. S LEXN=($O(^LEX(757.02,"APR",LEXO)))
  1. I (LEXR'?1U&(LEXR'?1N)) S LEXERR="Fourth character must be uppercase or numeric" Q "??"
  1. I $L(X)>1 I $E(LEXN,1,$L(LEXC))'=LEXC S LEXERR="Fourth character """_LEXR_""" is not valid" Q "??"
  1. I $L(LEX)'>4 S X=LEX Q X
  1. S (LEXC,LEXO)=$E(LEX,1,5),LEXR=$E(LEX,5),LEXO=$E(LEXO,1,($L(LEXO)-1))_$C($A($E(LEXO,$L(LEXO)))-1)_"~"
  1. S LEXN=($O(^LEX(757.02,"APR",LEXO)))
  1. I (LEXR'?1U&(LEXR'?1N)) S LEXERR="Fifth character must be uppercase or numeric" Q "??"
  1. I $L(X)>1 I $E(LEXN,1,$L(LEXC))'=LEXC S LEXERR="Fifth character """_LEXR_""" is not valid" Q "??"
  1. I $L(LEX)'>5 S X=LEX Q X
  1. S (LEXC,LEXO)=$E(LEX,1,6),LEXR=$E(LEX,6),LEXO=$E(LEXO,1,($L(LEXO)-1))_$C($A($E(LEXO,$L(LEXO)))-1)_"~"
  1. S LEXN=($O(^LEX(757.02,"APR",LEXO)))
  1. I (LEXR'?1U&(LEXR'?1N)) S LEXERR="Sixth character must be uppercase or numeric" Q "??"
  1. I $L(X)>1 I $E(LEXN,1,$L(LEXC))'=LEXC S LEXERR="Sixth character """_LEXR_""" is not valid" Q "??"
  1. I $L(LEX)'>6 S X=LEX Q X
  1. S (LEXC,LEXO)=$E(LEX,1,7),LEXR=$E(LEX,7),LEXO=$E(LEXO,1,($L(LEXO)-1))_$C($A($E(LEXO,$L(LEXO)))-1)_"~"
  1. S LEXN=($O(^LEX(757.02,"APR",LEXO)))
  1. I (LEXR'?1U&(LEXR'?1N)) S LEXERR="Seventh character must be uppercase or numeric" Q "??"
  1. I $L(X)>1 I $E(LEXN,1,$L(LEXC))'=LEXC S LEXERR="Seventh character """_LEXR_""" is not valid" Q "??"
  1. S X=LEX
  1. Q X
  1. ;
  1. ; Miscellaneous
  1. SAV(X,Y,LEXN,LEXC,LEXV) ; Save Defaults
  1. N LEXRTN,LEXTAG,LEXUSR,LEXCOM,LEXVAL,LEXNM,LEXID,LEXTD,LEXFD,LEXKEY S LEXRTN=$G(X) Q:+($$ROK(LEXRTN))'>0 S LEXTAG=$G(Y) Q:+($$TAG((LEXTAG_"^"_LEXRTN)))'>0
  1. S LEXUSR=+($G(LEXN)),LEXVAL=$G(LEXV) Q:LEXUSR'>0 Q:'$L(LEXVAL) S LEXCOM=$G(LEXC) Q:'$L(LEXCOM) S LEXKEY=$E(LEXCOM,1,13) F Q:$L(LEXKEY)>12 S LEXKEY=LEXKEY_" "
  1. S LEXNM=$$GET1^DIQ(200,(LEXUSR_","),.01) Q:'$L(LEXNM) S LEXTD=$$DT^XLFDT,LEXFD=$$FMADD^XLFDT(LEXTD,30),LEXID=LEXRTN_" "_LEXUSR_" "_LEXKEY
  1. S ^XTMP(LEXID,0)=LEXFD_"^"_LEXTD_"^"_LEXCOM,^XTMP(LEXID,LEXTAG)=LEXVAL
  1. Q
  1. RET(X,Y,LEXN,LEXC) ; Retrieve Defaults
  1. N LEXRTN,LEXTAG,LEXUSR,LEXCOM,LEXNM,LEXID,LEXTD,LEXFD,LEXKEY S LEXRTN=$G(X) Q:+($$ROK(LEXRTN))'>0 ""
  1. S LEXTAG=$G(Y) Q:+($$TAG((LEXTAG_"^"_LEXRTN)))'>0 "" S LEXUSR=+($G(LEXN)) Q:LEXUSR'>0 ""
  1. S LEXCOM=$G(LEXC) Q:'$L(LEXCOM) "" S LEXKEY=$E(LEXCOM,1,13) F Q:$L(LEXKEY)>12 S LEXKEY=LEXKEY_" "
  1. S LEXNM=$$GET1^DIQ(200,(LEXUSR_","),.01) Q:'$L(LEXNM) "" S LEXTD=$$DT^XLFDT,LEXFD=$$FMADD^XLFDT(LEXTD,30),LEXID=LEXRTN_" "_LEXUSR_" "_LEXKEY
  1. S X=$G(^XTMP(LEXID,LEXTAG))
  1. Q X
  1. ROK(X) ; Routine OK
  1. S X=$G(X) Q:'$L(X) 0 Q:$L(X)>8 0 X ^%ZOSF("TEST") Q:$T 1 Q 0
  1. TAG(X) ; Sub-Routine OK
  1. N LEXT,LEXE,LEXL S X=$G(X) Q:'$L(X) 0 Q:X'["^" 0
  1. Q:'$L($P(X,"^",1)) 0 Q:$L($P(X,"^",1))>8 0 Q:$E($P(X,"^",1),1)'?1U 0
  1. Q:'$L($P(X,"^",2)) 0 Q:$L($P(X,"^",2))>8 0 Q:$E($P(X,"^",2),1)'?1U 0
  1. S LEXL=0,LEXT=X,(LEXE,X)="S LEXL=$L($T("_X_"))" D ^DIM X:$D(X) LEXE
  1. S X=$S(LEXL>0:1,1:0)
  1. Q X
  1. END(X,Y) ; End Search, display results
  1. N LEXCODE,LEXTERM,LEXC,LEXI,LEXS S LEXCODE=$G(X),LEXTERM(1)=$G(Y) Q:$L(LEXCODE)'=7 Q:'$L(LEXTERM(1))
  1. D PR^LEX10PLS(.LEXTERM,69),GCUR($G(LEXCODE),.LEXC)
  1. S LEXS="",$P(LEXS,"-",$L(LEXC))="-" S LEXC=$J(" ",1)_LEXC,LEXS=$J(" ",1)_LEXS
  1. W:$L($G(IOF)) @IOF S LEXI=0 F S LEXI=$O(LEXTERM(LEXI)) Q:+LEXI'>0 D
  1. . W !,?2,$G(LEXTERM(LEXI))
  1. W ! D ATTR W !,$G(BOLD),$G(LEXC),$G(NORM),!," ",$G(LEXS) D KATTR
  1. S LEXI=0 F S LEXI=$O(LEXC(LEXI)) Q:+LEXI'>0 W !," ",$G(LEXC(LEXI))
  1. W !!
  1. Q
  1. CUR(X) ; Current Array
  1. N LEXC,LEXS,LEXI K LEXC D GCUR($G(X),.LEXC) Q:'$D(LEXC) S LEXC=$TR(LEXC," ","") Q:'$L($G(LEXC)) Q:$O(LEXC(0))'>0
  1. N LEXS,LEXI S LEXS="",$P(LEXS,"-",$L(LEXC))="-" S LEXC=$J(" ",1)_LEXC,LEXS=$J(" ",1)_LEXS
  1. W:$L($G(IOF)) @IOF D ATTR W !,$G(BOLD),$G(LEXC),$G(NORM),!,$G(LEXS) D KATTR
  1. S LEXI=0 F S LEXI=$O(LEXC(LEXI)) Q:+LEXI'>0 W !,$G(LEXC(LEXI))
  1. Q
  1. GCUR(X,LEXA) ; Get Current Array
  1. K LEXA N LEXIN,LEXPSN,LEXOFF,LEXOK D ATTR
  1. S LEXIN=$TR($G(X)," ",""),LEXOFF=$L(LEXIN)+2 Q:'$L(LEXIN) Q:'$D(^LEX(757.033,"AFRAG",31,(LEXIN_" ")))
  1. S LEXOK=1,LEXA=$J(" ",1)_LEXIN F LEXPSN=1:1:$L(LEXIN) D
  1. . N LEXTXT,LEXSEC,LEXCHR,LEXNAM S LEXSEC=$E(LEXIN,1,LEXPSN),LEXCHR=$E(LEXIN,LEXPSN),LEXNAM=$$NAM(LEXSEC)
  1. . I '$L(LEXSEC)!('$L(LEXCHR))!('$L(LEXNAM)) S LEXOK=0 Q
  1. . S LEXTXT=$J(" ",LEXPSN)_$G(BOLD)_LEXCHR_$G(NORM)
  1. . S LEXTXT=LEXTXT_$J(" ",(LEXOFF-LEXPSN))_LEXNAM
  1. . S LEXA(LEXPSN)=LEXTXT
  1. D KATTR
  1. K:'LEXOK LEXA
  1. Q
  1. NAM(X) ; Descriptive Dane
  1. N LEXIN,LEXDT,LEXEFF,LEXIEN S LEXIN=$G(X) Q:'$L(LEXIN) "" Q:'$D(^LEX(757.033,"AFRAG",31,(LEXIN_" "))) ""
  1. S LEXDT=$G(LEXVDT) S:LEXDT'?7N LEXDT=$$IMP^ICDEX(31)
  1. S LEXEFF=$O(^LEX(757.033,"AFRAG",31,(LEXIN_" "),(LEXDT+.001)),-1) Q:LEXEFF'?7N ""
  1. S LEXIEN=$O(^LEX(757.033,"AFRAG",31,(LEXIN_" "),LEXEFF," "),-1) Q:+LEXIEN'>0 ""
  1. S X=$$SN(LEXIEN)
  1. Q X
  1. SN(X,EFF) ; Short Name
  1. N IEN,CDT,IMP,EFF,HIS S IEN=+($G(X)),CDT=$G(LEXVDT) S:$G(EFF)?7N CDT=$G(EFF)
  1. S IMP=$$IMP^ICDEX(31) S:CDT'?7N CDT=$$DT^XLFDT S:CDT'>IMP&(IMP?7N) CDT=IMP
  1. S EFF=$O(^LEX(757.033,+IEN,2,"B",(CDT+.001)),-1)
  1. S HIS=$O(^LEX(757.033,+IEN,2,"B",+EFF," "),-1)
  1. S X=$G(^LEX(757.033,+IEN,2,+HIS,1))
  1. Q X
  1. FND(X) ; Found
  1. N LEXI S X=0,LEXI="" F S LEXI=$O(LEXPCDAT("NEXLEV",LEXI)) Q:'$L(LEXI) S X=X+1
  1. Q X
  1. GETO(X) ; Get One
  1. S X=$O(LEXPCDAT("NEXLEV",""))
  1. Q X
  1. ATTR ; Screen Attributes
  1. N X,IOINHI,IOINORM S X="IOINHI;IOINORM" D ENDR^%ZISS S BOLD=$G(IOINHI),NORM=$G(IOINORM)
  1. Q
  1. KATTR ; Kill Screen Attributes
  1. D KILL^%ZISS K BOLD,NORM
  1. Q
  1. ENV(X) ; Check environment
  1. N LEX S DT=$$DT^XLFDT D HOME^%ZIS S U="^" I +($G(DUZ))=0 W !!,?5,"DUZ not defined" Q 0
  1. S LEX=$$GET1^DIQ(200,(DUZ_","),.01) I '$L(LEX) W !!,?5,"DUZ not valid" Q 0
  1. Q 1