Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Saludos,
Tengo una tabla en una bdd que tiene una clave compuesta, se forma por local, numero de documento y tipo de documento. Ahora realizo una carga incremental cada día por fecha, pero ciertos días falta la información de algun local por lo que debo hacer la carga desde un aplicativo solo de ese local, ahora mi script luce asi:
SET
vQVD_File = C:\QlikView\QVD\Tabla.qvd;
Temp_Tabla:
NoConcatenate
LOAD
*
From
$(vQVD_File) (qvd);
Max_Fecha:
NoConcatenate
Load
fech_docum resident Temp_Tabla
order
by fech_docum DESC;
LET
vUltFecha = Peek('fech_docum', 0);
LET
vUltFecha = chr(39)&Left(vUltFecha, 10)&chr(39);
Tabla:
Load
codi_local,
codi_docum,
nume_docum
fech_docum,
...;
SELECT
codi_local,
codi_docum,
nume_docum
fech_docum,
...from...
where
fech_docum > $(vUltFecha)
;
CONCATENATE (Temp_Tabla) LOAD * RESIDENT Tabla;
drop table Tabla;
store * from Temp_Tabla into C:\QLIKVIEW\QVD\CargaDaypart.qvd;
ENDIF
drop table Temp_tabla;
drop table Max_Fecha;
Y el de carga de local es similar excepto porque incluye la condición Codi_local in ( $(vCodi_local))
Mi pregunta es como puedo hacer para que la carga incremental sea por local,codigo y numero de documento de una forma optima o automática, sin necesidad de que tenga que hacer el load al qvd de: local, tipo de documento y numero de documento. Es posible?
Lo qué estoy haciendo esta correcto o se puede optimizar?
Gracias por sus respuestas,
Santiago
En mi opinión creo que lo mas optimo es utilizar el campo fecha, ya que es un filtro que puedes hacer directamente en la Sentencia Sql que envias a la base de datos, mientras que si utilizas not exists debes traerte todo de la base de datos y luego hacer el condicional. Lo que implica traer de la Base de datos lo que ya tienes en tu archivo local, igual te dejo un script de como seria con not exists.
SET
vQVD_File = C:\QlikView\QVD\Tabla.qvd;
Temp_Tabla:
NoConcatenate
LOAD
*
From
$(vQVD_File) (qvd);
concatenate(Temp_Tabla) // Esto evita que tengas que cargar as abajo la tabla para concatenarla
Load
codi_local_tmp as codi_local,
codi_docum_tmp as codi_docum,
nume_docum_tmp as nume_docum,
fech_docum,
...
where not exists(codi_local, codi_local_tmp) and not exists(codi_docum, codi_docum_tmp) and not exists(cume_docum, nume_docum_tmp);
SELECT
codi_local as codi_local_tmp,
codi_docum as codi_docum_tmp,
nume_docum as nume_docum_tmp,
fech_docum,
...from...
;
//CONCATENATE (Temp_Tabla) LOAD * RESIDENT Tabla;
//drop table Tabla;
store * from Temp_Tabla into C:\QLIKVIEW\QVD\CargaDaypart.qvd;
drop table Temp_tabla;
Espero te sirva, si tienes problemas o no fui claro con el script me dices y te ayudo un poco más
Hola Santiago,
cuando he trabado con Recargas incrementales, siempre se debe cargar el archivo local para poder adicionar la nueva información.
Lo que si puedes mejorar es el calculo de la fechaMaxima
Max_Fecha:
NoConcatenate
Load
Max(fech_docum) as FechaMaxima
resident Temp_Tabla;
LET
vUltFecha = Peek('fech_docum', 0);
Ya que como lo tienes estas cargando todas las fechas y luego cargas la última fecha, con la opción que te doy solo estarias cargando un dato.
Espero te sriva
Gracias por tu observación Diego, y si en verdad ese cambio mejorará mucho el tiempo de respuesta del script ya que son millones de registros.
Entiendo que necesito cargar el QVD para hacer la concatenación de la data nueva, ademas tengo claro que si quiero hacer un incremental sin necesidad de fecha, debo verificar que no exista Codi_local, Codi_docum, Nume_docum, y ahi es donde no estoy seguro de que tan optimo sea el proceso y de como hacerlo.
He visto que usan la condicion where notexist( ) pero tendría que hacer la carga total desde la base de datos y esta condicion concatena los datos nuevos?
O debo enviar el conjunto de datos para que haga la evaluación mi bdd y me devuelva los datos nuevos? y en el script solo concateno?
Creo que eso no sería para nada rápido.
Por ejemplo:
Tengo 35 locales, con 4 tipos diferentes de documentos y extraigo un Numero de documento máximo por cada uno, eso haría que se tenga que hacer 140 veces la evaluación por los millones de registros.
La verdad no tengo claro como extraer la información nueva de mi bdd a partir de la que ya tengo en mi QVD cuando no funciona un Clave > $(vClave).
Lo que se me acaba de ocurrir es usar el CDC de SQL Server y cargar de allí. Pero aun sigo sin comprender que sería lo más optimo para este caso. Si me lo puedes aclarar un poco más te lo agradecería mucho.
Saludos.
Santiago
En mi opinión creo que lo mas optimo es utilizar el campo fecha, ya que es un filtro que puedes hacer directamente en la Sentencia Sql que envias a la base de datos, mientras que si utilizas not exists debes traerte todo de la base de datos y luego hacer el condicional. Lo que implica traer de la Base de datos lo que ya tienes en tu archivo local, igual te dejo un script de como seria con not exists.
SET
vQVD_File = C:\QlikView\QVD\Tabla.qvd;
Temp_Tabla:
NoConcatenate
LOAD
*
From
$(vQVD_File) (qvd);
concatenate(Temp_Tabla) // Esto evita que tengas que cargar as abajo la tabla para concatenarla
Load
codi_local_tmp as codi_local,
codi_docum_tmp as codi_docum,
nume_docum_tmp as nume_docum,
fech_docum,
...
where not exists(codi_local, codi_local_tmp) and not exists(codi_docum, codi_docum_tmp) and not exists(cume_docum, nume_docum_tmp);
SELECT
codi_local as codi_local_tmp,
codi_docum as codi_docum_tmp,
nume_docum as nume_docum_tmp,
fech_docum,
...from...
;
//CONCATENATE (Temp_Tabla) LOAD * RESIDENT Tabla;
//drop table Tabla;
store * from Temp_Tabla into C:\QLIKVIEW\QVD\CargaDaypart.qvd;
drop table Temp_tabla;
Espero te sirva, si tienes problemas o no fui claro con el script me dices y te ayudo un poco más
Gracias otra vez por tu ayuda Diego. Me doy cuenta que lo optimo sería hacerlo por fecha, pero el problema es que mi data no carga completa por fecha dentro del SQL Server, sino más bien en partes por cada local.
Lo que entiendo es que si tengo este ejemplo en el dia 02 para el local 102 sera pasada por alto la información del dia 01 aun cuando ya este en la base de datos.
101 | 102 | 103 |
20130201 | 20130201 | |
20130202 | 20130202 | 20130202 |
De ahi que creo que la salida para hacerlo por fecha sea el CDC que incluye una fecha de modificación independiente de la de mi documento, aunque tendré que considerar el mantenimiento extra para la bdd que esto requiere, de todas formas probaré con tu script a ver que tan rápido me va y la forma en que lo estoy manejando ahora para tratar de encontrar la solución óptima.
Muchas Gracias por tu tiempo y ayuda.
Santiago.