For each

I lite mer avancerade appar har man nytta av script-funktionen for each. Funktionen loopar över något, t.ex. filer i en mapp, och repeterar kod. Det gör att man slipper skriva om samma kod fler gånger.



Funktion

Scriptfunktionen som man använder är FOR EACH som sedan ska avslutas med NEXT. Funktionen kommer att för varje värde i en lista av värden sätta en variabel till det aktuella värdet i listan. Variabeln kan sedan användas för att styra koden.


FOR EACH <Variabelnamn> IN <Lista>
// Gör något
NEXT

Filer i en mapp

Ett vanligt förekommande fall är att man vill läsa in samtliga filer i en mapp - t.ex. årsfiler med budget. Strukturen på filerna (namn på ark, kolumner etc) bör vara samma för enkelhetens skull.


Följande kod läser in alla Excel-filer i mappen D:\Import\Budget som i namnet börjar med ordet "Budget". I varje loop i funktionen kommer variabeln vFile innehålla sökväg och namn till en av de filer som matchar namnkriteriet. Om det finns tre Excel-filer i mappen vars namn börjar med Budget så kommer tre iterationer att utföras. Alla filerna läses in och tack vare autoconcatenate (data som kommer in har samma kolumner) slås alla filer ihop till en tabell Budget.


FOR EACH vFile in FileList('D:\Import\Budget\Budget*.xlsx')

	Budget:
	LOAD Produktgrupp, 
	     ÅrMånad, 
	     Budget
	FROM [$(vFile)] (ooxml, embedded labels, table is Sheet1);

NEXT

Man kan också bygga vidare på detta om man vill söka i undermappar, men det sparar vi till ett kommande blogginlägg.


Värden i ett fält

Ett annat vanligt fall är att man vill titta på värden i ett fält och iterera för varje unikt värde. Detta kan enkelt göras med funktionen fieldvaluelist() som returnerar en unik lista.


Tänk att vi har ett fält År som innehåller värden för de år vi vill läsa in budget från samma filer som ovan. Vi kan då loopa över värdena i År-fältet och läsa in respektive budgetfil. I varje iteration får vYear värdet av en av de unika värdena i År-fältet.


FOR EACH vYear in FieldValueList('År')

	Budget:
	LOAD Produktgrupp, 
	     ÅrMånad, 
	     Budget
	FROM [D:\Import\Budget\Budget $(vYear).xlsx] 
	(ooxml, embedded labels, table is Sheet1);
	
NEXT

Listade värden

Ett annat alternativ är att själv ange en lista på värden. Detta kan exempelvis användas om vi vill läsa in tre olika bolags budgetar och slå ihop dessa.


FOR EACH vCompany in AAA,BBB,CCC
	Budget:
	LOAD
	     '$(vCompany)' as Company,
	     Produktgrupp, 
	     ÅrMånad, 
	     Budget
	FROM [D:\Import\Budget\Budget $(vCompany).xlsx]
	(ooxml, embedded labels, table is Sheet1);
NEXT


 

Skriven av: Morgan Kejerhag

Morgan Kejerhag har arbetat med beslutsstöd sedan 2005 och är en av Sveriges mest erfarna Qlik-konsulter. Under åren har Morgan arbetat med flertalet multinationella bolag där han lett arbetet i att bygga upp stora miljöer såväl som små kunder. LinkedIn Kontaktuppgifter