1 | C0PLOAD ; VEN/SMH - File Loading Utilties ; 5/8/12 4:53pm
|
---|
2 | ;;1.0;C0P;;Apr 25, 2012;Build 103
|
---|
3 | ; (C) Sam Habiel 2012
|
---|
4 | ;
|
---|
5 | ;Copyright 2012 Sam Habiel. Licensed under the terms of the GNU
|
---|
6 | ;General Public License See attached copy of the License.
|
---|
7 | ;
|
---|
8 | ;This program is free software; you can redistribute it and/or modify
|
---|
9 | ;it under the terms of the GNU General Public License as published by
|
---|
10 | ;the Free Software Foundation; either version 2 of the License, or
|
---|
11 | ;(at your option) any later version.
|
---|
12 | ;
|
---|
13 | ;This program is distributed in the hope that it will be useful,
|
---|
14 | ;but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
15 | ;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
16 | ;GNU General Public License for more details.
|
---|
17 | ;
|
---|
18 | ;You should have received a copy of the GNU General Public License along
|
---|
19 | ;with this program; if not, write to the Free Software Foundation, Inc.,
|
---|
20 | ;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
---|
21 | ; The routine contains utilities for Reading Files from
|
---|
22 | ; RxNorm and FDB into Fileman files
|
---|
23 | ;
|
---|
24 | ; This is a pretty pretty alpha version. Right now it just has FDB.
|
---|
25 | ;
|
---|
26 | ; These files definitions will be existing already. They should
|
---|
27 | ; be installed as part of the KIDS build containing this routine.
|
---|
28 | ;
|
---|
29 | ; The import templates will be also part of KIDS. They should
|
---|
30 | ; already exist by the time you run this routine.
|
---|
31 | ;
|
---|
32 | ; The drug file is produced by importing a table called 'tblCompositeDrugs'
|
---|
33 | ; provided in an access database from NewCrop accessed using parameter
|
---|
34 | ; '1' for desiredData from this webservice:
|
---|
35 | ; http://preproduction.newcropaccounts.com/V7/WebServices/Update1.asmx?op=GetMostRecentDownloadUrl
|
---|
36 | ;
|
---|
37 | ; The webservice provides a URL to a zip file; when unzipped, it produces an
|
---|
38 | ; access database with tables for allergies, drugs, pharamcies, healthplans, and
|
---|
39 | ; diagnoses.
|
---|
40 | ;
|
---|
41 | ; The following command (from mdb-tools) was used to extract this into an RRF
|
---|
42 | ; format (i.e. '|' delimited).|
|
---|
43 | ;
|
---|
44 | ; mdb-sql -HFp -d'|' -i selecttblCompositeDrug.sql NCFull-200910.mdb > Drug.rrf
|
---|
45 | ;
|
---|
46 | ; The SQL was necessary to skip a word-processing field which I couldn't import
|
---|
47 | ; into fileman using the fileman import tool (this is simply a technical
|
---|
48 | ; restriction; if I hand wrote my import I could have used a word processing
|
---|
49 | ; field and used WP^DIE to file it.) That's field's name is 'etc'.
|
---|
50 |
|
---|
51 | ; The SQL statement is as follows: SELECT MEDID, GCN_SEQNO, MED_NAME_ID,
|
---|
52 | ; MED_NAME, MED_ROUTED_MED_ID_DESC, MED_ROUTED_DF_MED_ID_DESC, MED_MEDID_DESC,
|
---|
53 | ; MED_STATUS_CD, MED_ROUTE_ID, ROUTED_MED_ID, ROUTED_DOSAGE_FORM_MED_ID,
|
---|
54 | ; MED_STRENGTH, MED_STRENGTH_UOM, MED_ROUTE_ABBR, MED_ROUTE_DESC,
|
---|
55 | ; MED_DOSAGE_FORM_ABBR, MED_DOSAGE_FORM_DESC, GenericDrugName,
|
---|
56 | ; DosageFormOverride, MED_REF_DEA_CD, MED_REF_DEA_CD_DESC,
|
---|
57 | ; MED_REF_MULTI_SOURCE_CD, MED_REF_MULTI_SOURCE_CD_DESC,
|
---|
58 | ; MED_REF_GEN_DRUG_NAME_CD, MED_REF_GEN_DRUG_NAME_CD_DESC,
|
---|
59 | ; MED_REF_FED_LEGEND_IND, MED_REF_FED_LEGEND_IND_DESC, GENERIC_MEDID,
|
---|
60 | ; MED_NAME_TYPE_CD, GENERIC_MED_REF_GEN_DRUG_NAME_CD, MED_NAME_SOURCE_CD,
|
---|
61 | ; DrugInfo, GenericDrugNameOverride, FormularyDrugID, Manufacturer, Status,
|
---|
62 | ; TouchDate, DrugTypeID FROM tblCompositeDrug
|
---|
63 | ;
|
---|
64 | ; The allergies file is produced by importing the tblCompositeAllergy file
|
---|
65 | ;
|
---|
66 | ; Here's the mdb command to extract the file.
|
---|
67 | ; mdb-export -HQ -d "|" NCFull-201203.mdb tblCompositeAllergy > tblCompositeAllergy.rrf
|
---|
68 | ;
|
---|
69 | ; There is no SQL here.
|
---|
70 | ;
|
---|
71 | ; Once you have both files, you can adjust the routine to where the files are
|
---|
72 | ; and then import them by calling the PEPs below.
|
---|
73 | ;
|
---|
74 | ; Update: I wrote a bash script to automate this: it's called:
|
---|
75 | ; drug_data_extract.sh
|
---|
76 | ;
|
---|
77 | FDBIMP ; FDB Drug File Import; PEP. Interactive (for now).
|
---|
78 | ;
|
---|
79 | ;
|
---|
80 | N FILEPATH
|
---|
81 | R "Enter RRF FDB Drug File with Full Path: ",FILEPATH:60,!
|
---|
82 | I '$L(FILEPATH) QUIT
|
---|
83 | ;
|
---|
84 | ; NB: The following will only work on Unix
|
---|
85 | N PATH,FILE
|
---|
86 | N PIECES S PIECES=$L(FILEPATH,"/")
|
---|
87 | S PATH=$P(FILEPATH,"/",1,PIECES-1)
|
---|
88 | S FILE=$P(FILEPATH,"/",PIECES)
|
---|
89 | ;
|
---|
90 | ; Kill off the existing file
|
---|
91 | N %1 S %1=^C0P("FDB",0) ; save zero node
|
---|
92 | S $P(%1,"^",3,4)="" ; zero last record numbers
|
---|
93 | K ^C0P("FDB") ; kill file
|
---|
94 | S ^C0P("FDB",0)=%1 ; restore zero node
|
---|
95 | ;
|
---|
96 | ; Import File from text extract (Please I want an ODBC driver!)
|
---|
97 | ;
|
---|
98 | D CLEAN^DILF
|
---|
99 | N CONTROL
|
---|
100 | S CONTROL("FLAGS")="E" ; External Values...
|
---|
101 | S CONTROL("MSGS")="" ; go as normal in ^TMP("DIERR",$J)
|
---|
102 | S CONTROL("MAXERR")="100" ; abort if you can't file a hundred records
|
---|
103 | ; S CONTROL("IOP")="HOME" ; Send to home device ; smh - don't pass; API no like for HOME output
|
---|
104 | S CONTROL("QTIME")="" ; Don't Queue
|
---|
105 | N SOURCE
|
---|
106 | S SOURCE("FILE")=FILE ; File Name
|
---|
107 | S SOURCE("PATH")=PATH ; Directory
|
---|
108 | N FORMAT
|
---|
109 | S FORMAT("FDELIM")="|" ; Delimiter
|
---|
110 | S FORMAT("FIXED")="" ; Fixed Width?
|
---|
111 | S FORMAT("QUOTED")="" ; Are strings quoted?
|
---|
112 | ;
|
---|
113 | D FILE^DDMP(1130590010,"[C0P FDB TBLCOMPOSITEDRUG]",.CONTROL,.SOURCE,.FORMAT)
|
---|
114 | QUIT
|
---|
115 | ;
|
---|
116 | FDBAIMP ; FDB Allergies Import; PEP. Interactive (for now)
|
---|
117 | ;
|
---|
118 | ;
|
---|
119 | N FILEPATH
|
---|
120 | R "Enter RRF FDB Allergy File with Full Path: ",FILEPATH:60,!
|
---|
121 | I '$L(FILEPATH) QUIT
|
---|
122 | ;
|
---|
123 | ; NB: The following will only work on Unix
|
---|
124 | N PATH,FILE
|
---|
125 | N PIECES S PIECES=$L(FILEPATH,"/")
|
---|
126 | S PATH=$P(FILEPATH,"/",1,PIECES-1)
|
---|
127 | S FILE=$P(FILEPATH,"/",PIECES)
|
---|
128 | ;
|
---|
129 | ; Kill off the existing file
|
---|
130 | N %1 S %1=^C0PALGY(0) ; save zero node
|
---|
131 | S $P(%1,"^",3,4)="" ; zero last record numbers
|
---|
132 | K ^C0PALGY ; kill file
|
---|
133 | S ^C0PALGY(0)=%1 ; restore zero node
|
---|
134 | ;
|
---|
135 | ; Import file from text extract
|
---|
136 | D CLEAN^DILF
|
---|
137 | N CONTROL
|
---|
138 | S CONTROL("FLAGS")="E" ; External Values...
|
---|
139 | S CONTROL("MSGS")="" ; go as normal in ^TMP("DIERR",$J)
|
---|
140 | S CONTROL("MAXERR")="100" ; abort if you can't file a hundred records
|
---|
141 | ; S CONTROL("IOP")="HOME" ; Send to home device ; smh - don't pass; API no like for HOME output
|
---|
142 | S CONTROL("QTIME")="" ; Don't Queue
|
---|
143 | N SOURCE
|
---|
144 | S SOURCE("FILE")=FILE ; File Name
|
---|
145 | S SOURCE("PATH")=PATH ; Directory
|
---|
146 | N FORMAT
|
---|
147 | S FORMAT("FDELIM")="|" ; Delimiter
|
---|
148 | S FORMAT("FIXED")="" ; Fixed Width?
|
---|
149 | S FORMAT("QUOTED")="" ; Are strings quoted?
|
---|
150 | ;
|
---|
151 | D FILE^DDMP(113059005,"[C0P FDB TBLCOMPOSITEALLERGY]",.CONTROL,.SOURCE,.FORMAT)
|
---|
152 | QUIT
|
---|
153 | RXNIMP ; Import RxNorm Concepts File; Modded from C0CRXNRD
|
---|
154 | N FILEPATH
|
---|
155 | R "Enter RRF RxNorm Conepts File with Full Path: ",FILEPATH:60,!
|
---|
156 | I '$L(FILEPATH) QUIT
|
---|
157 | ;
|
---|
158 | ; NB: The following will only work on Unix
|
---|
159 | N PATH,FILE
|
---|
160 | N PIECES S PIECES=$L(FILEPATH,"/")
|
---|
161 | S PATH=$P(FILEPATH,"/",1,PIECES-1)
|
---|
162 | S FILE=$P(FILEPATH,"/",PIECES)
|
---|
163 | ;
|
---|
164 | N LINES S LINES=$$GETLINES(PATH,FILE)
|
---|
165 | D OPEN^%ZISH("FILE",PATH,FILE,"R")
|
---|
166 | ;
|
---|
167 | IF POP D EN^DDIOL("Error reading file..., Please check...") G EX
|
---|
168 | ;
|
---|
169 | N %1 S %1=^C0P("RXN",0)
|
---|
170 | S $P(%1,"^",3,4)=""
|
---|
171 | K ^C0P("RXN")
|
---|
172 | S ^C0P("RXN",0)=%1
|
---|
173 | ;
|
---|
174 | N C0CCOUNT
|
---|
175 | F C0CCOUNT=1:1 D Q:$$STATUS^%ZISH
|
---|
176 | . U IO
|
---|
177 | . N LINE R LINE:1
|
---|
178 | . IF $$STATUS^%ZISH QUIT
|
---|
179 | . I '(C0CCOUNT#1000) U $P W C0CCOUNT," of ",LINES," read ",! U IO ; update every 1000
|
---|
180 | . N RXCUI,RXAUI,SAB,TTY,CODE,STR ; Fileman fields numbers below
|
---|
181 | . S RXCUI=$P(LINE,"|",1) ; .01
|
---|
182 | . S RXAUI=$P(LINE,"|",8) ; 1
|
---|
183 | . S SAB=$P(LINE,"|",12) ; 2
|
---|
184 | . ;
|
---|
185 | . ; Following lines not applicable here:
|
---|
186 | . ; If the source is a restricted source, decide what to do based on what's asked.
|
---|
187 | . ; N SRCIEN S SRCIEN=$$FIND1^DIC(176.003,"","QX",SAB,"B") ; SrcIEN in RXNORM SOURCES file
|
---|
188 | . ; N RESTRIC S RESTRIC=$$GET1^DIQ(176.003,SRCIEN,14,"I") ; 14 is restriction field; values 0-4
|
---|
189 | . ; If RESTRIC is zero, then it's unrestricted. Everything else is restricted.
|
---|
190 | . ; If user didn't ask to include restricted sources, and the source is restricted, then quit
|
---|
191 | . ; I 'INCRES,RESTRIC QUIT
|
---|
192 | . ;
|
---|
193 | . S TTY=$P(LINE,"|",13) ; 3
|
---|
194 | . S CODE=$P(LINE,"|",14) ; 4
|
---|
195 | . S STR=$P(LINE,"|",15) ; 5
|
---|
196 | . ; Remove embedded "^"
|
---|
197 | . S STR=$TR(STR,"^")
|
---|
198 | . ; Convert STR into an array of 80 characters on each line
|
---|
199 | . N STRLINE S STRLINE=$L(STR)\80+1
|
---|
200 | . ; In each line, chop 80 characters off, reset STR to be the rest
|
---|
201 | . N J F J=1:1:STRLINE S STR(J)=$E(STR,1,80) S STR=$E(STR,81,$L(STR))
|
---|
202 | . ; Now, construct the FDA array
|
---|
203 | . N RXNFDA
|
---|
204 | . S RXNFDA(1130590011.001,"+1,",.01)=RXCUI
|
---|
205 | . S RXNFDA(1130590011.001,"+1,",1)=RXAUI
|
---|
206 | . S RXNFDA(1130590011.001,"+1,",2)=SAB
|
---|
207 | . S RXNFDA(1130590011.001,"+1,",3)=TTY
|
---|
208 | . S RXNFDA(1130590011.001,"+1,",4)=CODE
|
---|
209 | . N RXNIEN S RXNIEN(1)=C0CCOUNT
|
---|
210 | . D UPDATE^DIE("","RXNFDA","RXNIEN")
|
---|
211 | . I $D(^TMP("DIERR",$J)) D EN^DDIOL("ERROR") G EX
|
---|
212 | . ; Now, file WP field STR
|
---|
213 | . D WP^DIE(1130590011.001,C0CCOUNT_",",5,,$NA(STR))
|
---|
214 | EX D CLOSE^%ZISH("FILE")
|
---|
215 | QUIT
|
---|
216 | GETLINES(PATH,FILENAME) ; Get number of lines in a file
|
---|
217 | D OPEN^%ZISH("FILE",PATH,FILENAME,"R")
|
---|
218 | U IO
|
---|
219 | N I
|
---|
220 | F I=1:1 R LINE:1 Q:$$STATUS^%ZISH
|
---|
221 | D CLOSE^%ZISH("FILE")
|
---|
222 | Q I-1
|
---|