domingo, 18 de noviembre de 2018

► Cargas incrementales

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_;


// 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
     // 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
          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
     ...................... //Lista de campos
    
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