Skip to main content
Woohoo! Qlik Community has won “Best in Class Community” in the 2024 Khoros Kudos awards!
Announcements
Nov. 20th, Qlik Insider - Lakehouses: Driving the Future of Data & AI - PICK A SESSION
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Carga Incremental clave compuesta

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

1 Solution

Accepted Solutions
Anonymous
Not applicable
Author

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

View solution in original post

4 Replies
Anonymous
Not applicable
Author

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

Not applicable
Author

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

Anonymous
Not applicable
Author

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

Not applicable
Author

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.

101102103
20130201
20130201
201302022013020220130202

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.