¿De qué archivo viene esta fila?
Manual paso a paso
Las capturas muestran Q-Expert en inglés; la interfaz en español llegará pronto.
01La pregunta de negocio
Finanzas concilia cada mes contra su propio archivo. Cada fila de ventas debe decir de qué archivo viene, y el equipo quiere el número de filas leídas escrito en el log de recarga.
02Antes de empezar
- Descomprime el paquete del episodio. Necesitas los tres archivos
data/Sales_2025_0N.csvystart.qep, el proyecto tal como lo dejó el episodio 1. - En Q-Expert, importa
start.qep(Import .qep en la barra superior). Trae el Source Path, los formatos y las variables del episodio 1, así sigues exactamente donde quedaste. - La conexión de carpeta QXDistributors de Qlik y su carpeta
Transform/_QVSson las mismas del episodio 1. - ¿Quieres ver los archivos por dentro antes de empezar? Q-Explorator, la herramienta de escritorio del equipo de Q-Fábrica, abre archivos CSV, Excel, Parquet y QVD para que veas su contenido y su calidad antes de modelar.
03Paso a paso
-
1
Quita la carga con comodín
El RAW con comodín
tmp_SalesRawlee los tres archivos como una sola tabla y olvida de qué archivo viene cada fila. Bórralo con la × del nodo. El episodio vuelve a construir la misma tabla, ahora con un loop.
Figura 2.1 — Quita la carga con comodín -
2
Agrega una tabla vacía donde juntar
Agrega un nodo INLINE desde la barra de herramientas y llámalo
tmp_SalesRaw. En su grilla, dale una columna,Dummy, sin filas, y marca la opción de solo estructura: el script escribeWHERE 1=0. Cada vuelta del loop le agrega un mes a esta tabla.
Figura 2.2 — Agrega una tabla vacía donde juntar -
3
Agrega el loop sobre la lista de archivos
Agrega un nodo LOOP después de la tabla inline. Tipo de loop
FOR EACH … IN FileList(), variablevFile, ruta de FileList$(vPathRaw)Sales_*.csv: la misma variable de carpeta del episodio 1.
Figura 2.3 — Agrega el loop sobre la lista de archivos -
4
Dentro del loop, lee un archivo y agrégalo
Haz clic en Enter loop body y luego:
- Arrastra
Sales_2025_01.csvde la Library al canvas del cuerpo para tomar sus 11 columnas. - En la pestaña Config, marca Source by variable y escribe
$(vFile). - Pon CONCATENATE INTO en
tmp_SalesRaw.

Figura 2.4 — Dentro del loop, lee un archivo y agrégalo - Arrastra
-
5
Guarda el nombre del archivo en cada fila
En la pestaña Expressions, abre el Expression Builder y agrega
FileName()comoSourceFile. Cada fila lleva ahora el nombre del archivo del que se leyó.
Figura 2.5 — Guarda el nombre del archivo en cada fila -
6
Limpia y cuenta
Haz clic en Exit loop. Después del loop agrega:
- Un nodo DROP para el campo
Dummydetmp_SalesRaw. - Un nodo LET/SET con
LET vSalesRawRows = NoOfRows('tmp_SalesRaw'). - Un nodo TRACE con
Sales rows read from the monthly files: $(vSalesRawRows).

Figura 2.6 — Limpia y cuenta - Un nodo DROP para el campo
-
7
Genera el script
Haz clic en Generate Syntax y abre
Flow_1:FOR EACH vFile IN FileList(…), el LOAD conCONCATENATEyFileName() AS SourceFile,NEXT vFile, y luego elDROP FIELDy elTRACE.
Figura 2.7 — Genera el script
04Revisa tu resultado
- El canvas principal tiene la inline
tmp_SalesRaw, el Loop (1 nodo en su cuerpo), un Drop, un Let/Set y un Trace. - Ejecuta el script en Qlik:
tmp_SalesRawtiene 330 filas y 12 campos, ySourceFiletiene 3 valores, uno por mes. El log de recarga diceSales rows read from the monthly files: 330. - Q-Expert divide el script en dos:
_Main, la única parte que pegas en Qlik, yFlow_1.qvs, un archivo que_Mainlee conMUST_INCLUDE. Ambos deben coincidir con los de abajo, salvo la fecha del encabezado y una línea// Q-Expert · Ref …con tu propia referencia.
_Main
Se pega en QlikEste es el único script que pegas en Qlik Sense: abre el Editor de carga de datos de la app, reemplaza su contenido por este y recarga. Cada línea $(MUST_INCLUDE=…) lee en su lugar uno de los archivos de abajo, así el resto del modelo nunca entra al editor.
Ver script · 43 líneas
/*---------------------------------------------------------------------------------------- Description [MAIN]: ------------------------------------------------------------------------------------- Author: The Q-Fábrica team - Date: [2026-11-02] ------------------------------------------------------------------------------------- Changes ------------------------------------------------------------------------------------- Author Date Detail ------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------- Copyright © Q-Expert Distributors. Q-Expert Qlik Developer Framework. www.qfabrica.com ----------------------------------------------------------------------------------------*/ SET ThousandSep=','; SET DecimalSep='.'; SET MoneyThousandSep=','; SET MoneyDecimalSep='.'; SET MoneyFormat='$ #,##0.00;-$ #,##0.00'; SET TimeFormat='hh:mm:ss'; SET DateFormat='YYYY-MM-DD'; SET TimestampFormat='YYYY-MM-DD hh:mm:ss'; SET MonthNames='Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec'; SET LongMonthNames='January;February;March;April;May;June;July;August;September;October;November;December'; SET DayNames='Mon;Tue;Wed;Thu;Fri;Sat;Sun'; SET LongDayNames='Monday;Tuesday;Wednesday;Thursday;Friday;Saturday;Sunday'; SET FirstWeekDay=0; SET BrokenWeeks=1; SET ReferenceDay=4; SET FirstMonthOfYear=1; LET vExecutionDate = Timestamp(Now(), 'YYYY-MM-DD hh:mm:ss'); SET vTxfPath = 'lib://QXDistributors/Transform/'; SET vPathRaw = 'lib://QXDistributors/'; SET vEnvironment = 'PROD'; // PROD, QA or DEV SET vBaseCurrency = 'COP'; // Currency every amount is converted to SET vPathModel = 'lib://QXDistributors/Model/'; // The model QVDs the apps load $(MUST_INCLUDE=$(vTxfPath)_QVS/Flow_1.qvs);
Flow_1.qvs
Archivo · lo lee MUST_INCLUDENo se pega: se guarda como archivo. En la pestaña Flow_1 de Generate Syntax, Export descarga Flow_1.qvs (Deploy escribe todas las pestañas en una carpeta de una vez). Ponlo en lib://QXDistributors/Transform/_QVS/Flow_1.qvs, la carpeta Transform/_QVS dentro de tu carpeta QXDistributors. Si el archivo no está, la recarga se detiene con un error: para eso existe MUST_INCLUDE.
Ver script · 53 líneas
/*---------------------------------------------------------------------------------------- Description [Flow_1]: ------------------------------------------------------------------------------------- Author: The Q-Fábrica team - Date: [2026-11-02] ------------------------------------------------------------------------------------- Changes ------------------------------------------------------------------------------------- Author Date Detail ------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------- Copyright © Q-Expert Distributors. Q-Expert Qlik Developer Framework. www.qfabrica.com ----------------------------------------------------------------------------------------*/ // ------------------------------------------------------------------------------------------------- // Empty table with 1 column (WHERE 1=0), schema only. [tmp_SalesRaw]: LOAD * INLINE [ "Dummy" ] WHERE 1=0; // ------------------------------------------------------------------------------------------------- // Loop FOR EACH … IN FileList() over $(vFile). FOR EACH vFile IN FileList('$(vPathRaw)Sales_*.csv') // ------------------------------------------------------------------------------------------------- // Raw load from $(vFile), concatenated into [tmp_SalesRaw]. CONCATENATE ([tmp_SalesRaw]) LOAD SaleID, SaleDate, CustomerID, ProductID, SalespersonID, BranchID, Quantity, UnitPrice, DiscountPct, Currency, Channel, FileName() AS SourceFile FROM [$(vFile)] (txt, utf8, delimiter is ',', embedded labels, msq); NEXT vFile; DROP FIELD Dummy FROM [tmp_SalesRaw]; LET vSalesRawRows = NoOfRows('tmp_SalesRaw'); TRACE Sales rows read from the monthly files: $(vSalesRawRows);
05Por qué se hace así
- Una semilla explícita.
CONCATENATE (tmp_SalesRaw)necesita que la tabla exista antes de la primera vuelta. La tabla inline vacía es esa tabla; su campoDummysolo existe para que la tabla exista y se elimina justo después del loop. vFile, noi. Las variables de un loop dicen qué guardan. Dentro de seis meses,$(vFile)se sigue explicando solo.- Contar en el log. Un
TRACEcon el número de filas convierte el log de recarga en un control rápido: si falta el archivo de un mes, el número baja antes de que alguien abra una app. - La ruta sigue en una variable. La lista de archivos lee
$(vPathRaw), la misma variable del episodio 1, así que mover los archivos sigue siendo un cambio de una línea.
06Lo que sigue
Episodio 3: los datos maestros llegan sucios.
Antes de modelar
Q-Explorator es la herramienta de escritorio del equipo de Q-Fábrica para explorar archivos QVD, CSV, Excel y Parquet, y para convertir archivos CSV, TXT y Excel en QVD. Abre en ella los archivos de cada episodio para ver primero su contenido y su calidad.
Conoce Q-Explorator