Skip to main content
Announcements
See why Qlik is a Leader in the 2024 Gartner® Magic Quadrant™ for Analytics & BI Platforms. Download Now
cancel
Showing results for 
Search instead for 
Did you mean: 
rodri_morales
Creator II
Creator II

Reemplazar filas en qvd

Buen día gente, tengo un problema con la carga de dato, les paso a explicar:

Tengo una aplicación que me carga unos archivos planos (son muchos ordenados en carpetas y la fecha la obtengo del nombre de la carpeta). En esta aplicación agregue una sentencia para controlar si el archivo plano tenia un error o no, y me guarda eso como un estado.

Como son muchos archivos planos, hago una carga incremental y solo voy cargando los que tengan fecha mayor a la ultima cargada. Hasta ahí todo perfecto.

El problema viene cuando hay un archivo viejo que tiene error, el usuario lo corrige, pero la carga incremental no vuelve a leerlo. Entonces decidí que el usuario pusiera en una carpeta todos los archivos planos que tenían error, pero que ya los corrigió.

Necesito leer todos esos archivos planos (seguir controlando si existe un error o no, pero por lo pronto son archivos viejos que tengo que leer) y reemplazar todas las filas de este archivo en el qvd que contiene toda la información.

No logró encontrar la vuelta para reemplazar filas en el qvd existente. Cualquier ayuda sirve.

1 Solution

Accepted Solutions
rubenmarin

Esa Clave sería el identificador único de cada fila, debería de estar en los datos, algún campo o combinación de campos que identifique a una única fila, así una vez cargados de los ficheros planos sabrías qué líneas de los qvds se han modificado y no las añadirías. Al final el resultado debería ser las filas modificadas (leídas de los ficheros planos) y las filas sin modificar (leídas de los qvds que ya estaban generados)

Datos:

LOAD Campo_o_Campos as Clave,

     ....

FROM ...;

Concatenate (Datos)

LOAD * From ...(qvd) where not exists('Clave', Campo_o_Campos);

View solution in original post

11 Replies
rubenmarin

Hola Rodrigo, creo que necesitarías una clave que sea el identificador único de cada fila, de esta forma primero podrías cargar los ficheros con errores y después concatenar los datos con los datos de los qvd excepto los que tenga una clave que ya se ha cargado antes. (Where not exists (Clave)).

rodri_morales
Creator II
Creator II
Author

Para concatenar de esa forma y usar "Where not exist(Clave)" tengo que usar alguna iteración?

Es decir, necesito guardar esa clave unica en una variable e ir controlando?

rubenmarin

Esa Clave sería el identificador único de cada fila, debería de estar en los datos, algún campo o combinación de campos que identifique a una única fila, así una vez cargados de los ficheros planos sabrías qué líneas de los qvds se han modificado y no las añadirías. Al final el resultado debería ser las filas modificadas (leídas de los ficheros planos) y las filas sin modificar (leídas de los qvds que ya estaban generados)

Datos:

LOAD Campo_o_Campos as Clave,

     ....

FROM ...;

Concatenate (Datos)

LOAD * From ...(qvd) where not exists('Clave', Campo_o_Campos);

rodri_morales
Creator II
Creator II
Author

Perfecto, entendí.

Había entendido el concepto, pero no sabia si haciendo load y concatenate ya bastaba, o era necesario guardar esa clave en una variable y hacer un ciclo para ir controlando fila por fila.

Pero por lo que veo no hace falta hacer un for o un while.

Muchas gracias Ruben!

rodri_morales
Creator II
Creator II
Author

Puede ser que si en el primer set de datos está vacío, falle la carga y no genere nada?

Porque mi primer tabla son los datos que tenían error y cargo nuevamente, y mi segunda tabla son los datos que ya tenia (donde voy a poner la cláusula "Where not exists(Codigo)", para que me traiga todos menos los que ya cargue antes).

Pero esto no me genera ninguna tabla.

rubenmarin

Es muy posible, si no ha cargada ningún registro no habrá creado la tabla y te dará un error al hacer el concatenate.

Puedes usar un IF comprobando el NoOfRows('Tabla1') para decidir si quieres hacer un concatenate o no, aunque si no ha cargado ninguna fila modificada se podría considerar que ha acabado de procesar el fichero, porque no tiene ninguna actualización y el qvd se va a quedar igual que estaba.

rodri_morales
Creator II
Creator II
Author

Es correcto, acabo de verificar eso. En realidad no encuentra el fichero, porque no hay nada en el primer lugar donde busca. Esto se debe a que es una carpeta que contiene los archivos que tienen error, y puede que no exista ningún archivo que contenga error algún día.

Entonces en primer lugar, deberia controlar si existe algun fichero en una ubicación, para que, en caso de que no exista, que siga con otro paso.

Se puede verificar si existe algún fichero en una ubicación?

rodri_morales
Creator II
Creator II
Author

Encontre la opción: LET vListqvdexists=isnull(QvdCreateTime('File.qvd'));

Estoy trabajando con esa variable para que funcione.

Muchas gracias por tu ayuda Ruben!

rubenmarin

Pero esa función parece solo para qvds y creo que quieres comprobar los ficheros planos, supongo que debería usar la función FileTime()

Yo suelo usar un bucle for each:

FOR Each vFichero in FileList(vRutaFicheros)

vRutaFicheros tendría un filtro con los ficheros que quieres recuperar:

'C.\Ficheros\*.xls' o 'C.\Ficheros\*.*'