1 | LEXSRC2 ; ISL/KER/FJF Classification Code Source Util ; 01/01/2004
|
---|
2 | ;;2.0;LEXICON UTILITY;**25,28**;Sep 23, 1996
|
---|
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)
|
---|