Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Buenos días,
antes que nada quería agradecer que me hayáis permitido entrar al grupo de qlik en español.
Y ahora mi “problema” que es el siguiente, tengo varios Excels lo cuales guardan la información de los usuarios locales de diversos servidores, dichos Excel tienen nombres diferentes según quien sea el cliente, pero dentro de cada Excel la estructura es idéntica.
Resulta que a la hora de realizar la carga he conseguido que lea un directorio en el que se encuentran los diferentes ficheros de los clientes siendo capaz de distinguir entre los diferentes clientes por tanto esa parte en principio no me preocupa, sino que lo que realmente me falla es la carga de las diferentes hojas de los Excel, es decir, a la hora de cargar la primera hoja todo sale perfecto, pero cuando carga las siguientes actúa de forma rara añadiendo, creo yo, todos los datos que va cargando en la misma “tabla” del primer servidor incluidos los datos de los servidores del segundo cliente y añadiendo además tablas sintéticas.
Dejo el código que utilizo para la carga así como una evidencia de la carga de dicho código y un Excel con la estructura de los ficheros,
gracias de antemano por la respuesta,
Roger A. Reina Hdez
P.d.: Soy nuevo en el mundo de Qlikview, así que perdonad si no hablo con propiedad con respecto a ello.
Código:
SUB LoadAllExcelSheets(vFile)
ODBC CONNECT32 TO [Excel Files;DBQ=$(vFile)];
tables:
SQLtables;
DISCONNECT;
LET vSheetCount = NoOfRows('tables');
FOR i = 0 to $(vSheetCount) -1
// The replace function is used because the sheet names in my example files contain a period character.
// The odbc driver replaces these with the # character. These # characters need to be turned in periods again.
LET vSheetName = replace(purgeChar(purgeChar(peek('TABLE_NAME', $(i), 'tables'), chr(39)), chr(36)),'#','.');
LET vFichero = SubField('$(vFile)','\',6);
LOAD *, SubField('$(vSheetName)','_',2) as Servidor, SubField('$(vFichero)','_',1) as Cliente
FROM [$(vFile)] (ooxml, embedded labels,Header is 4 lines, table is [$(vSheetName)]);
NEXT i
DROP TABLE tables;
END SUB
/*--------------------------------------------------------------------------------------------------*/
SUB ScanFolder(Root)
FOR EACH FileExtension in 'xlsx'
FOR EACH FoundFile in filelist( Root & '\*' & FileExtension)
CALL LoadAllExcelSheets('$(FoundFile)');
NEXT FoundFile
NEXT FileExtension
FOR EACH SubDirectory in dirlist( Root & '\*' )
CALL ScanFolder(SubDirectory)
NEXT SubDirectory
END SUB
CALL ScanFolder('prueba') ;
Hola Roger,
Si todas tus hojas tienen las mismas columnas entonces QlikView las debe de estar concatenando de manera automática, esto es un comportamiento normal de QV. Pregunta: ¿Cuál era el comportamiento esperado del script, qué creara una tabla diferente por cada hoja del documento de Excel?
Saludos
Hola Roger:
Aquí tienes varios enlaces que te ayudarán a resolver tu problema
Re: Load Multiple sheets from one Excel files
Re: Load multiple sheets from one excel file.
Saludos
Joaquín
Como dijo Alejandro, es posible que te este concatenando las hojas si es que posen la misma estructura. Podrías tratar poniendo NoConcatenate antes de tu LOAD
LET vFichero = SubField('$(vFile)','\',6);
Qualify *;
NoConcatenate
LOAD *, SubField('$(vSheetName)','_',2) as Servidor, SubField('$(vFichero)','_',1)as Cliente
FROM [$(vFile)] (ooxml, embedded labels,Header is 4 lines, table is [$(vSheetName)]);
Unqualify *;
En todo caso manda un Screenshot de tu visor de Tablas. Y lo que deseas ver.
Prueba con este ejemplo, donde puedes leer todas las hojas excel de un directorio y todas las pestañas de cada hoja
Espero que te sirva
Hola Roger,
Cuando cargas tus datos estás haciendo lo que se llama autoconcatenar. Cuando dos tablas tienen los mismos campos, qlikview las autoconcatena.
Para romper este comportamiento se pone NOCONCATENATE antes de cargar la tabla, pero el problema es que puedes crear tablas sintéticas, que afectan al rendimiento.
Otra cosa que puedes hacer es dar nombres diferentes a las tablas y usar Qualify, te pongo un ejemplo:
QUALIFY *;
UNQUALIFY (Los campos que tengan que ser clave)
$(vSheetName):
LOAD *, SubField('$(vSheetName)','_',2) as Servidor, SubField('$(vFichero)','_',1) as Cliente
FROM [$(vFile)] (ooxml, embedded labels,Header is 4 lines, table is [$(vSheetName)]);
UNQUALIFY *;
Con esto consigues crear una tabla para cada hoja, pero uniendo solamente por los campos que indiques en el UNQUALIFY. Cuando termines haces un UNQUALIFY *.
Para más información de lo que hace Qualify y Unqualify: https://community.qlik.com/docs/DOC-7963
Saludos!