[613] | 1 | LEXSRC2 ; ISL/KER/FJF Classification Code Source Util ; 01/01/2004
|
---|
| 2 | ;;2.0;LEXICON UTILITY;**25,28**;Sep 23, 1996;Build 1
|
---|
| 3 | ;
|
---|
| 4 | ; External References
|
---|
| 5 | ; DBIA 3992 $$STATCHK^ICDAPIU
|
---|
| 6 | ; DBIA 1997 $$STATCHK^ICPTAPIU
|
---|
| 7 | ; DBIA 10103 $$DT^XLFDT
|
---|
| 8 | ;
|
---|
| 9 | Q
|
---|
| 10 | CPT(LEXC,LEXVDT) ; Return Pointer to Active CPT
|
---|
| 11 | ;
|
---|
| 12 | ; Input CPT Code
|
---|
| 13 | ; Output IEN file 81 of Active Codes only
|
---|
| 14 | S LEXC=$G(LEXC) Q:'$L(LEXC) "" S LEXVDT=$G(LEXVDT) S:+LEXVDT'>0 LEXVDT=$$DT^XLFDT
|
---|
| 15 | S LEXC=$$STATCHK^ICPTAPIU(LEXC,LEXVDT) Q:+LEXC'>0 "" S LEXC=$P(LEXC,"^",2) Q:+LEXC'>0 ""
|
---|
| 16 | Q +LEXC
|
---|
| 17 | ;
|
---|
| 18 | ICD(LEXC,LEXVDT) ; Return Pointer to Active ICD/ICP
|
---|
| 19 | ;
|
---|
| 20 | ; Input ICD9 or ICD0 Code
|
---|
| 21 | ; Output IEN file 80 or 80.1 of Active Codes only
|
---|
| 22 | S LEXC=$G(LEXC) Q:'$L(LEXC) "" S LEXVDT=$G(LEXVDT) S:+LEXVDT'>0 LEXVDT=$$DT^XLFDT
|
---|
| 23 | S LEXC=$$STATCHK^ICDAPIU(LEXC,LEXVDT) Q:+LEXC'>0 "" S LEXC=$P(LEXC,"^",2) Q:+LEXC'>0 ""
|
---|
| 24 | Q +LEXC
|
---|
| 25 | ;
|
---|
| 26 | STATCHK(CODE,CDT,LEX) ; Check Status of a Code
|
---|
| 27 | ;
|
---|
| 28 | ; Input:
|
---|
| 29 | ; CODE - Any Code (ICD/CPT/DSM etc)
|
---|
| 30 | ; CDT - Date to screen against (default = today)
|
---|
| 31 | ; LEX - Output Array, passed by reference
|
---|
| 32 | ;
|
---|
| 33 | ; Output:
|
---|
| 34 | ;
|
---|
| 35 | ; 2-Piece String containing the code's status
|
---|
| 36 | ; and the IEN if the code exists, else -1.
|
---|
| 37 | ; The following are possible outputs:
|
---|
| 38 | ; 1 ^ IEN Active Code
|
---|
| 39 | ; 0 ^ IEN Inactive Code
|
---|
| 40 | ; 0 ^ -1 Code not Found
|
---|
| 41 | ;
|
---|
| 42 | ; ASTM Triplet in array LEX passed by reference (optional)
|
---|
| 43 | ;
|
---|
| 44 | ; LEX(0) = <ien 757.02> ^ <code>
|
---|
| 45 | ; 2-Piece String containing the IEN of
|
---|
| 46 | ; the code and the code
|
---|
| 47 | ;
|
---|
| 48 | ; LEX(1) = <ien 757.01> ^ <expression>
|
---|
| 49 | ; 2-Piece String containing the IEN of
|
---|
| 50 | ; the code's expression and the expression
|
---|
| 51 | ;
|
---|
| 52 | ; LEX(2) = <ien 757.03> ^ <abbr> ^ <nomen> ^ <name>
|
---|
| 53 | ; 4-Piece String containing the IEN of
|
---|
| 54 | ; the code's classification system, the
|
---|
| 55 | ; source abbreviation, Nomenclature and
|
---|
| 56 | ; the name of the classification system
|
---|
| 57 | ;
|
---|
| 58 | ; This API requires the ACT Cross-Reference
|
---|
| 59 | ; ^LEX(757.02,"ACT",<code>,<status>,<date>,<ien>)
|
---|
| 60 | ;
|
---|
| 61 | ;
|
---|
| 62 | N LEXC,LEXAIEN,LEXIEN,LEXDT,X,PREVACT,PREVINA,MOSTREC,STATUS
|
---|
| 63 | S LEXC=$G(CODE) I '$L(LEXC) S (LEX,X)="0^-1" D UPD Q X
|
---|
| 64 | S LEXDT=$P($G(CDT),".",1),LEXDT=$S(+LEXDT>0:LEXDT,1:$$DT^XLFDT)
|
---|
| 65 | ;
|
---|
| 66 | ; Find preceding date for active codes
|
---|
| 67 | S PREVACT=+$O(^LEX(757.02,"ACT",LEXC_" ",3,LEXDT+.00001),-1)
|
---|
| 68 | S LEXAIEN=0 S:+PREVACT>0 LEXAIEN=+$O(^LEX(757.02,"ACT",LEXC_" ",3,+PREVACT," "),-1)
|
---|
| 69 | ;
|
---|
| 70 | ; Find preceding date for inactive codes
|
---|
| 71 | S PREVINA=+$O(^LEX(757.02,"ACT",LEXC_" ",2,LEXDT+.00001),-1)
|
---|
| 72 | S:+LEXAIEN>0&(+$O(^LEX(757.02,"ACT",LEXC_" ",2,PREVINA," "),-1)'=LEXAIEN) PREVINA=0
|
---|
| 73 | ;
|
---|
| 74 | ; Check that both are not zero
|
---|
| 75 | I PREVACT=0,PREVINA=0 S (LEX,X)="0^-1" D UPD Q X
|
---|
| 76 | ;
|
---|
| 77 | ; Find the most recent of the two dates and matching status
|
---|
| 78 | S MOSTREC=$S(PREVACT>PREVINA:PREVACT,1:PREVINA)
|
---|
| 79 | S STATUS=$S(PREVACT>PREVINA:1,1:0)
|
---|
| 80 | ;
|
---|
| 81 | ; Now cope with difficulties arising from boundary conditions
|
---|
| 82 | I $$BOUND D
|
---|
| 83 | .S STATUS='STATUS
|
---|
| 84 | .S MOSTREC=$O(^LEX(757.02,"ACT",LEXC_" ",STATUS+2,LEXDT),-1)
|
---|
| 85 | ;
|
---|
| 86 | ; Get code IEN
|
---|
| 87 | S LEXIEN=$O(^LEX(757.02,"ACT",LEXC_" ",STATUS+2,MOSTREC,""))
|
---|
| 88 | ;
|
---|
| 89 | ; Quit with valid status and code IEN
|
---|
| 90 | S (LEX,X)=STATUS_"^"_LEXIEN D UPD
|
---|
| 91 | Q X
|
---|
| 92 | ;
|
---|
| 93 | BOUND() ; Do we have a boundary?
|
---|
| 94 | ; Check if we have an entry for the next day of the complementary
|
---|
| 95 | ; status, if so then we need to obtain the status for the
|
---|
| 96 | ; preceding day
|
---|
| 97 | I $D(^LEX(757.02,"ACT",LEXC_" ",2+'STATUS,$$DPLUS1(MOSTREC))) Q 1
|
---|
| 98 | Q 0
|
---|
| 99 | ;
|
---|
| 100 | DPLUS1(DATE) ; Add a day to the date
|
---|
| 101 | ;
|
---|
| 102 | Q $$HTFM^XLFDT($$FMTH^XLFDT(DATE)+1)
|
---|
| 103 | ;
|
---|
| 104 | UPD ; Update Array
|
---|
| 105 | N LEXI,LEXC,LEXN,LEXE,LEXS S LEXI=+($P($G(X),"^",2)) Q:+LEXI'>0
|
---|
| 106 | S LEXN=$G(^LEX(757.02,+LEXI,0)),LEXE=+LEXN,LEXC=$P(LEXN,"^",2)
|
---|
| 107 | S LEXS=+($P(LEXN,"^",3)),LEX(0)=+LEXI_"^"_LEXC
|
---|
| 108 | S LEX(1)=LEXE_"^"_$P($G(^LEX(757.01,+LEXE,0)),"^",1)
|
---|
| 109 | S LEX(2)=LEXS_"^"_$P($G(^LEX(757.03,+LEXS,0)),"^",1,3)
|
---|
| 110 | Q
|
---|
| 111 | PI(X) ; Preferred IEN for code X
|
---|
| 112 | N LEXE,LEXLA,LEXA,LEXS,LEXC,LEXP,LEXPF,LEXF,LEXI,LEXC,LEXFL
|
---|
| 113 | S LEXC=$G(X) Q:'$L(LEXC) "" S (LEXP,LEXF,LEXI)=0,LEXPF(0)=LEXC
|
---|
| 114 | F S LEXI=$O(^LEX(757.02,"CODE",(LEXC_" "),LEXI)) Q:+LEXI=0!(LEXP>0) D
|
---|
| 115 | . S:+LEXF'>0 LEXF=LEXI S LEXFL=$S(+($P($G(^LEX(757.02,+LEXI,0)),"^",5))>0:1,1:0)
|
---|
| 116 | . S LEXE=0,LEXLA="" F S LEXE=$O(^LEX(757.02,+LEXI,4,LEXE)) Q:+LEXE=0 D
|
---|
| 117 | . . S LEXS=$P($G(^LEX(757.02,+LEXI,4,LEXE,0)),"^",2) Q:+LEXS'>0
|
---|
| 118 | . . S LEXA=$P($G(^LEX(757.02,+LEXI,4,LEXE,0)),"^",1)
|
---|
| 119 | . . S:+LEXA>+LEXLA LEXLA=+LEXA
|
---|
| 120 | . S:+LEXLA>0 LEXPF(LEXFL,LEXLA,LEXI)=""
|
---|
| 121 | S X="" I $D(LEXPF(1)) S X=$O(LEXPF(1," "),-1),X=$O(LEXPF(1,+X," "),-1)
|
---|
| 122 | I '$D(LEXPF(1)),$D(LEXPF(0)) S X=$O(LEXPF(0," "),-1),X=$O(LEXPF(0,+X," "),-1)
|
---|
| 123 | Q X
|
---|
| 124 | ;
|
---|
| 125 | HIST(CODE,ARY) ; Activation History
|
---|
| 126 | ;
|
---|
| 127 | ; Input:
|
---|
| 128 | ; CODE - Code - REQUIRED
|
---|
| 129 | ; .ARY - Array, passed by Reference
|
---|
| 130 | ;
|
---|
| 131 | ; Output:
|
---|
| 132 | ; ARY(0) = Number of Activation History Entries
|
---|
| 133 | ; ARY(<date>) = status where: 1 is Active
|
---|
| 134 | ; ARY("IEN") = <ien>
|
---|
| 135 | ;
|
---|
| 136 | N LEXC,LEXI,LEXN,LEXD,LEXF,LEXO S LEXC=$G(CODE) Q:'$L(LEXC) -1
|
---|
| 137 | S LEXI=$$PI(LEXC),ARY("IEN")=LEXI,LEXO=""
|
---|
| 138 | M LEXO=^LEX(757.02,+LEXI,4) K LEXO("B")
|
---|
| 139 | S ARY(0)=+($P($G(LEXO(0)),U,4))
|
---|
| 140 | S:+ARY(0)=0 ARY(0)=-1 K:ARY(0)=-1 ARY("IEN")
|
---|
| 141 | S (LEXI,LEXC)=0 F S LEXI=$O(LEXO(LEXI)) Q:+LEXI=0 D
|
---|
| 142 | . S LEXD=$P($G(LEXO(LEXI,0)),U,1) Q:+LEXD=0
|
---|
| 143 | . S LEXF=$P($G(LEXO(LEXI,0)),U,2) Q:'$L(LEXF)
|
---|
| 144 | . S LEXC=LEXC+1,ARY(0)=LEXC,ARY(LEXD)=LEXF
|
---|
| 145 | Q ARY(0)
|
---|