La estrategia consiste en
leer todos los ficheros de datos de un directorio y guardarlos en un QVD
histórico
A partir de ese momento,
cuando se vuelva a leer el directorio, primero se leerá el QVD Histórico, se
obtendrá la última fecha que contiene y se leerán todos los ficheros de datos
creados a partir de esa fecha, volviéndose a almacenar todo en el QVD
histórico.
En cada recarga se verifica
si el QVD histórico existe. Si no existe se leen TODOS los ficheros de datos y
se crea el QVD. Si ya existe, sólo se leen los nuevos ficheros y se actualiza
el QVD.
En el siguiente ejemplo se
toma el año aunque se podría tomar la fecha completa. Además se toma un año
mínimo que es 1995.
La estructura es:
// ruta ficheros entrada del HISTORICO (.dat)
SET urlDAT = ..\DATOS\*.dat;
// ruta ficheros QVD con
históricos intermedios (.qvd)
SET urlQVD = ..\QVD\Intermedios\Historico_;
SET urlQVD = ..\QVD\Intermedios\Historico_;
// ruta ficheros fichero HISTORICO definitivo (HISTORICO.qvd)
SET nom_QVDhistorico = ..\QVD\Historico.qvd;
// 1.- Se comprueba si existe el
fichero histórico
// Si existe se toma el año mayor
y se establece que la recarga es incremental
IF not IsNull(FileSize('$(nom_QVDhistorico)')) THEN
HISTORICO:
LOAD *
FROM [$(nom_QVDhistorico)] (qvd);
AÑO:
LOAD RANGEMAX(MAX(Año ),1995) as MaxAño
RESIDENT HISTORICO;
let vAñoMaxim = FieldValue('MaxAño',1);
let vTipoRecarga = 'Incremental';
DROP TABLE AÑO;
ELSE // Si no existe se carga todo de nuevo
let vTipoRecarga = 'Completa';
let vAñoMaxim = 1995;
END IF
SET CtrlAñoNewFile=0; //Será 0 si no hay ficheros nuevos. Si los hay será 1
FOR each File in filelist(urlDAT)
AñoFile = num(mid(File,len(File)-len('XXXX.dat')+1,len('XXXX'))); //Del nombre del fichero sacamos el año
// Si el año del fichero que acabamos de leer es mayor que el del histórico, entonces es un fichero nuevo.
IF AñoFile > $(vAñoMaxim) THEN
SET CtrlAñoNewFile=1; //Al menos hay un fichero nuevo
// Cargamos un fichero de un año en la tabla temporal
HISTORICO_TMP:
LOAD
...................... //Lista de campos
FROM [$(File)] (txt, utf8, embedded labels, delimiter is '\t', msq);
// Guardamos la tabla temporal en un fichero QVD en la ruta de Historicos intermedios con el nombre Historico_Año.qvd
nom_urlQVD = urlQVD & mid(File,len(File)-len('XXXX.dat')+1,len('XXXX')) & '.qvd';
STORE * FROM HISTORICO_TMP INTO [$(nom_urlQVD)];
// Borramos la tabla temporal
DROP TABLE HISTORICO_TMP;
END IF
// Siguiente fichero de entrada
NEXT File;
IF CtrlAñoNewFile=1 THEN //Si hubo ficheros nuevos seguimos con carga incremental.
// ruta ficheros QVD del HISTORICO (.qvd)
SET urlQVD = ..\QVD\Intermedios\Historico_*.qvd;
//-----------------------------------------------------------------------
// GENERACIÓN FICHERO QVD HISTORICO
// Generamos la tabla HISTORICO con los ficheros QVD intermedios y guardamos tabla HISTORICO en el fichero QVD HISTORICO.qvd
let vTipoRecarga = 'Completa';
let vAñoMaxim = 1995;
END IF
SET CtrlAñoNewFile=0; //Será 0 si no hay ficheros nuevos. Si los hay será 1
FOR each File in filelist(urlDAT)
AñoFile = num(mid(File,len(File)-len('XXXX.dat')+1,len('XXXX'))); //Del nombre del fichero sacamos el año
// Si el año del fichero que acabamos de leer es mayor que el del histórico, entonces es un fichero nuevo.
IF AñoFile > $(vAñoMaxim) THEN
SET CtrlAñoNewFile=1; //Al menos hay un fichero nuevo
// Cargamos un fichero de un año en la tabla temporal
HISTORICO_TMP:
LOAD
...................... //Lista de campos
FROM [$(File)] (txt, utf8, embedded labels, delimiter is '\t', msq);
// Guardamos la tabla temporal en un fichero QVD en la ruta de Historicos intermedios con el nombre Historico_Año.qvd
nom_urlQVD = urlQVD & mid(File,len(File)-len('XXXX.dat')+1,len('XXXX')) & '.qvd';
STORE * FROM HISTORICO_TMP INTO [$(nom_urlQVD)];
// Borramos la tabla temporal
DROP TABLE HISTORICO_TMP;
END IF
// Siguiente fichero de entrada
NEXT File;
IF CtrlAñoNewFile=1 THEN //Si hubo ficheros nuevos seguimos con carga incremental.
// ruta ficheros QVD del HISTORICO (.qvd)
SET urlQVD = ..\QVD\Intermedios\Historico_*.qvd;
//-----------------------------------------------------------------------
// GENERACIÓN FICHERO QVD HISTORICO
// Generamos la tabla HISTORICO con los ficheros QVD intermedios y guardamos tabla HISTORICO en el fichero QVD HISTORICO.qvd
// Si hubiera filas repetidas en los
distintos ficheros, este es el momento de limpiarlas.
//-----------------------------------------------------------------------
// ruta ficheros intermedios QVD del HISTORICO (.qvd)
SET urlQVD = ..\QVD\Intermedios\Historico_*.qvd;
// ruta ficheros final QVD del HISTORICO (HISTORICO.qvd)
SET nom_QVDhistorico = ..\QVD\Historico.qvd;
FOR each File in filelist(urlQVD)
AñoFile = num(mid(File,len(File)-len('XXXX.qvd')+1,len('XXXX'))); //Año del fichero
// Cargar tabla HISTORICO con los ficheros QVD intermedios
HISTORICO_TMP2:
LOAD
...................... //Lista de campos
//-----------------------------------------------------------------------
// ruta ficheros intermedios QVD del HISTORICO (.qvd)
SET urlQVD = ..\QVD\Intermedios\Historico_*.qvd;
// ruta ficheros final QVD del HISTORICO (HISTORICO.qvd)
SET nom_QVDhistorico = ..\QVD\Historico.qvd;
FOR each File in filelist(urlQVD)
AñoFile = num(mid(File,len(File)-len('XXXX.qvd')+1,len('XXXX'))); //Año del fichero
// Cargar tabla HISTORICO con los ficheros QVD intermedios
HISTORICO_TMP2:
LOAD
...................... //Lista de campos
FROM [$(File)] (qvd);
NEXT File;
// Tratamos tabla HISTORICO_TMP. Este es el momento de limpiar duplicados con DISTINCT, crear nuevos campos, manipularlos… etc.
HISTORICO_TMP:
LOAD
NEXT File;
// Tratamos tabla HISTORICO_TMP. Este es el momento de limpiar duplicados con DISTINCT, crear nuevos campos, manipularlos… etc.
HISTORICO_TMP:
LOAD
...................... //Lista de campos
resident HISTORICO_TMP2
order by ......;
left join
LOAD
......
resident ......;
......
resident HISTORICO_TMP2
order by ......;
left join
LOAD
......
resident ......;
......
DROP TABLE HISTORICO_TMP2;
//Control si la recarga era incremental o completa
//Si el fichero HISTORICO.qvd existe Estamos haciendo una carga incremental y en memoria tenemos la tabla HISTORICO
IF vTipoRecarga = 'Incremental' THEN
CONCATENATE (HISTORICO)
LOAD * RESIDENT HISTORICO_TMP;
DROP TABLE HISTORICO_TMP;
ELSE // Estamos haciendo una recarga completa y como no tenemos HISTORICO en memoria, hay que crearla a partir de HISTORICO_TMP
// Tratamos tabla HISTORICO
NOCONCATENATE
HISTORICO:
LOAD * RESIDENT HISTORICO_TMP;
DROP TABLE HISTORICO_TMP;
END IF
END IF //de CtrlAñoNewFile=1 que controlaba si había ficheros nuevos. Podía tratarse de una carga incremental o completa
No hay comentarios:
Publicar un comentario