VistA-ePrescribing/p/C0PLOAD.m

223 lines
9.1 KiB
Mathematica

C0PLOAD ; VEN/SMH - File Loading Utilties ; 5/8/12 4:53pm
;;1.0;C0P;;Apr 25, 2012;Build 103
; (C) Sam Habiel 2012
;
;Copyright 2012 Sam Habiel. Licensed under the terms of the GNU
;General Public License See attached copy of the License.
;
;This program is free software; you can redistribute it and/or modify
;it under the terms of the GNU General Public License as published by
;the Free Software Foundation; either version 2 of the License, or
;(at your option) any later version.
;
;This program is distributed in the hope that it will be useful,
;but WITHOUT ANY WARRANTY; without even the implied warranty of
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;GNU General Public License for more details.
;
;You should have received a copy of the GNU General Public License along
;with this program; if not, write to the Free Software Foundation, Inc.,
;51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
; The routine contains utilities for Reading Files from
; RxNorm and FDB into Fileman files
;
; This is a pretty pretty alpha version. Right now it just has FDB.
;
; These files definitions will be existing already. They should
; be installed as part of the KIDS build containing this routine.
;
; The import templates will be also part of KIDS. They should
; already exist by the time you run this routine.
;
; The drug file is produced by importing a table called 'tblCompositeDrugs'
; provided in an access database from NewCrop accessed using parameter
; '1' for desiredData from this webservice:
; http://preproduction.newcropaccounts.com/V7/WebServices/Update1.asmx?op=GetMostRecentDownloadUrl
;
; The webservice provides a URL to a zip file; when unzipped, it produces an
; access database with tables for allergies, drugs, pharamcies, healthplans, and
; diagnoses.
;
; The following command (from mdb-tools) was used to extract this into an RRF
; format (i.e. '|' delimited).|
;
; mdb-sql -HFp -d'|' -i selecttblCompositeDrug.sql NCFull-200910.mdb > Drug.rrf
;
; The SQL was necessary to skip a word-processing field which I couldn't import
; into fileman using the fileman import tool (this is simply a technical
; restriction; if I hand wrote my import I could have used a word processing
; field and used WP^DIE to file it.) That's field's name is 'etc'.
; The SQL statement is as follows: SELECT MEDID, GCN_SEQNO, MED_NAME_ID,
; MED_NAME, MED_ROUTED_MED_ID_DESC, MED_ROUTED_DF_MED_ID_DESC, MED_MEDID_DESC,
; MED_STATUS_CD, MED_ROUTE_ID, ROUTED_MED_ID, ROUTED_DOSAGE_FORM_MED_ID,
; MED_STRENGTH, MED_STRENGTH_UOM, MED_ROUTE_ABBR, MED_ROUTE_DESC,
; MED_DOSAGE_FORM_ABBR, MED_DOSAGE_FORM_DESC, GenericDrugName,
; DosageFormOverride, MED_REF_DEA_CD, MED_REF_DEA_CD_DESC,
; MED_REF_MULTI_SOURCE_CD, MED_REF_MULTI_SOURCE_CD_DESC,
; MED_REF_GEN_DRUG_NAME_CD, MED_REF_GEN_DRUG_NAME_CD_DESC,
; MED_REF_FED_LEGEND_IND, MED_REF_FED_LEGEND_IND_DESC, GENERIC_MEDID,
; MED_NAME_TYPE_CD, GENERIC_MED_REF_GEN_DRUG_NAME_CD, MED_NAME_SOURCE_CD,
; DrugInfo, GenericDrugNameOverride, FormularyDrugID, Manufacturer, Status,
; TouchDate, DrugTypeID FROM tblCompositeDrug
;
; The allergies file is produced by importing the tblCompositeAllergy file
;
; Here's the mdb command to extract the file.
; mdb-export -HQ -d "|" NCFull-201203.mdb tblCompositeAllergy > tblCompositeAllergy.rrf
;
; There is no SQL here.
;
; Once you have both files, you can adjust the routine to where the files are
; and then import them by calling the PEPs below.
;
; Update: I wrote a bash script to automate this: it's called:
; drug_data_extract.sh
;
FDBIMP ; FDB Drug File Import; PEP. Interactive (for now).
;
;
N FILEPATH
R "Enter RRF FDB Drug File with Full Path: ",FILEPATH:60,!
I '$L(FILEPATH) QUIT
;
; NB: The following will only work on Unix
N PATH,FILE
N PIECES S PIECES=$L(FILEPATH,"/")
S PATH=$P(FILEPATH,"/",1,PIECES-1)
S FILE=$P(FILEPATH,"/",PIECES)
;
; Kill off the existing file
N %1 S %1=^C0P("FDB",0) ; save zero node
S $P(%1,"^",3,4)="" ; zero last record numbers
K ^C0P("FDB") ; kill file
S ^C0P("FDB",0)=%1 ; restore zero node
;
; Import File from text extract (Please I want an ODBC driver!)
;
D CLEAN^DILF
N CONTROL
S CONTROL("FLAGS")="E" ; External Values...
S CONTROL("MSGS")="" ; go as normal in ^TMP("DIERR",$J)
S CONTROL("MAXERR")="100" ; abort if you can't file a hundred records
; S CONTROL("IOP")="HOME" ; Send to home device ; smh - don't pass; API no like for HOME output
S CONTROL("QTIME")="" ; Don't Queue
N SOURCE
S SOURCE("FILE")=FILE ; File Name
S SOURCE("PATH")=PATH ; Directory
N FORMAT
S FORMAT("FDELIM")="|" ; Delimiter
S FORMAT("FIXED")="" ; Fixed Width?
S FORMAT("QUOTED")="" ; Are strings quoted?
;
D FILE^DDMP(1130590010,"[C0P FDB TBLCOMPOSITEDRUG]",.CONTROL,.SOURCE,.FORMAT)
QUIT
;
FDBAIMP ; FDB Allergies Import; PEP. Interactive (for now)
;
;
N FILEPATH
R "Enter RRF FDB Allergy File with Full Path: ",FILEPATH:60,!
I '$L(FILEPATH) QUIT
;
; NB: The following will only work on Unix
N PATH,FILE
N PIECES S PIECES=$L(FILEPATH,"/")
S PATH=$P(FILEPATH,"/",1,PIECES-1)
S FILE=$P(FILEPATH,"/",PIECES)
;
; Kill off the existing file
N %1 S %1=^C0PALGY(0) ; save zero node
S $P(%1,"^",3,4)="" ; zero last record numbers
K ^C0PALGY ; kill file
S ^C0PALGY(0)=%1 ; restore zero node
;
; Import file from text extract
D CLEAN^DILF
N CONTROL
S CONTROL("FLAGS")="E" ; External Values...
S CONTROL("MSGS")="" ; go as normal in ^TMP("DIERR",$J)
S CONTROL("MAXERR")="100" ; abort if you can't file a hundred records
; S CONTROL("IOP")="HOME" ; Send to home device ; smh - don't pass; API no like for HOME output
S CONTROL("QTIME")="" ; Don't Queue
N SOURCE
S SOURCE("FILE")=FILE ; File Name
S SOURCE("PATH")=PATH ; Directory
N FORMAT
S FORMAT("FDELIM")="|" ; Delimiter
S FORMAT("FIXED")="" ; Fixed Width?
S FORMAT("QUOTED")="" ; Are strings quoted?
;
D FILE^DDMP(113059005,"[C0P FDB TBLCOMPOSITEALLERGY]",.CONTROL,.SOURCE,.FORMAT)
QUIT
RXNIMP ; Import RxNorm Concepts File; Modded from C0CRXNRD
N FILEPATH
R "Enter RRF RxNorm Conepts File with Full Path: ",FILEPATH:60,!
I '$L(FILEPATH) QUIT
;
; NB: The following will only work on Unix
N PATH,FILE
N PIECES S PIECES=$L(FILEPATH,"/")
S PATH=$P(FILEPATH,"/",1,PIECES-1)
S FILE=$P(FILEPATH,"/",PIECES)
;
N LINES S LINES=$$GETLINES(PATH,FILE)
D OPEN^%ZISH("FILE",PATH,FILE,"R")
;
IF POP D EN^DDIOL("Error reading file..., Please check...") G EX
;
N %1 S %1=^C0P("RXN",0)
S $P(%1,"^",3,4)=""
K ^C0P("RXN")
S ^C0P("RXN",0)=%1
;
N C0CCOUNT
F C0CCOUNT=1:1 D Q:$$STATUS^%ZISH
. U IO
. N LINE R LINE:1
. IF $$STATUS^%ZISH QUIT
. I '(C0CCOUNT#1000) U $P W C0CCOUNT," of ",LINES," read ",! U IO ; update every 1000
. N RXCUI,RXAUI,SAB,TTY,CODE,STR ; Fileman fields numbers below
. S RXCUI=$P(LINE,"|",1) ; .01
. S RXAUI=$P(LINE,"|",8) ; 1
. S SAB=$P(LINE,"|",12) ; 2
. ;
. ; Following lines not applicable here:
. ; If the source is a restricted source, decide what to do based on what's asked.
. ; N SRCIEN S SRCIEN=$$FIND1^DIC(176.003,"","QX",SAB,"B") ; SrcIEN in RXNORM SOURCES file
. ; N RESTRIC S RESTRIC=$$GET1^DIQ(176.003,SRCIEN,14,"I") ; 14 is restriction field; values 0-4
. ; If RESTRIC is zero, then it's unrestricted. Everything else is restricted.
. ; If user didn't ask to include restricted sources, and the source is restricted, then quit
. ; I 'INCRES,RESTRIC QUIT
. ;
. S TTY=$P(LINE,"|",13) ; 3
. S CODE=$P(LINE,"|",14) ; 4
. S STR=$P(LINE,"|",15) ; 5
. ; Remove embedded "^"
. S STR=$TR(STR,"^")
. ; Convert STR into an array of 80 characters on each line
. N STRLINE S STRLINE=$L(STR)\80+1
. ; In each line, chop 80 characters off, reset STR to be the rest
. N J F J=1:1:STRLINE S STR(J)=$E(STR,1,80) S STR=$E(STR,81,$L(STR))
. ; Now, construct the FDA array
. N RXNFDA
. S RXNFDA(1130590011.001,"+1,",.01)=RXCUI
. S RXNFDA(1130590011.001,"+1,",1)=RXAUI
. S RXNFDA(1130590011.001,"+1,",2)=SAB
. S RXNFDA(1130590011.001,"+1,",3)=TTY
. S RXNFDA(1130590011.001,"+1,",4)=CODE
. N RXNIEN S RXNIEN(1)=C0CCOUNT
. D UPDATE^DIE("","RXNFDA","RXNIEN")
. I $D(^TMP("DIERR",$J)) D EN^DDIOL("ERROR") G EX
. ; Now, file WP field STR
. D WP^DIE(1130590011.001,C0CCOUNT_",",5,,$NA(STR))
EX D CLOSE^%ZISH("FILE")
QUIT
GETLINES(PATH,FILENAME) ; Get number of lines in a file
D OPEN^%ZISH("FILE",PATH,FILENAME,"R")
U IO
N I
F I=1:1 R LINE:1 Q:$$STATUS^%ZISH
D CLOSE^%ZISH("FILE")
Q I-1