If-satser i Qlik

If-satser i Qlik fungerar ungefär som i de flesta språk och plattformar - ett villkor provas och två olika utfall beroende på sant eller falskt kan returneras. Syntaxen både i script och uttryck ser ut så här:


if(villkor,värde-om-sant,värde-om-falskt)


If-satser är en mycket vanligt förekommande teknik för att styra logik vid datahantering. Överallt där vi behöver hantera något på två olika sätt beroende på någon logik hittar vi dessa. Många har också stött på if-satser i Excel där de fungerar på i princip samma sätt som i Qlik.


Den tredje parametern (värde-om-falskt) i if-satsen kan också utlämnas vid behov. Om villkoret skulle visa sig falskt kommer if-satsen då att svara med värdet null.


if(villkor,värde-om-sant) // Blir null om villkor är falskt

Värdena som ges som svar vid sant eller falskt villkor kan i sin tur vara beräknade funktioner. Dessa funktioner kan också vara If-satser som då "nestlas" och bygger vidare till större logiska funktioner:

if(villkor1,
  if(villkor2,
    Värde1,
    Värde2
  ),
  Värde3
)

I detta fall har vi tre möjliga utfall:

Värde1: Om villkor1=SANT och villkor2=SANT

Värde 2: Om villkor1=SANT och villkor2=FALSKT

Värde 3: Om villkor1=FALSKT (oberoende av värde på villkor2)


Detta kan byggas ut i det oändliga. Sättet att skriva if-satsen med radbrytningar och indentering/indrag enligt ovan är också vanligt förekommande. Att skriva koden tydligt gör det enklare att läsa koden och se om man skrivit något fel.


En svaghet med if-satser i layout-delen av Qlik är dock att både värdet för sant och falskt kommer att beräknas innan resultatet av if-satsen skapas. Detta gör att om utvecklaren har en if-sats med två svårberäknade alternativ kommer mer prestanda att användas. Desto större if-sats med komplex logik i olika grenar - desto mer prestandakrävande.


I vissa fall, när man många tester av ett värde och ska välja olika resultat, är det avsevärt mer praktiskt att skriva en pick(match())-funktion. Detta har vi skrivit om i ett eget inlägg tidigare på bloggen.


Sum(if)

Det är bra att fundera på var en if-sats används i koden. En placering som ska försöka undvikas är inom aggregeringsfunktioner (sum, count, avg, max, min etc) då detta påverkar prestandan. Tänk dig att du har 1,000,000 rader i ett beloppsfält och vill summera värdena om raden hör till en viss avdelning A. Du kan då skriva koden som:


sum(if(Avdelning='A',Belopp,0))

Logiskt fungerar funktionen, men för att göra beräkningen behöver Qlik gå igenom 1,000,000 rader och bedöma om Avdelning='A'. Säg att 5% av raderna har Avdelning='A', då har 950,000 rader analyserats i onödan.


Istället bör man använda sig av set-analys för att filtrera informationen. Set-analys kan liknas vid ett urval gjort av användaren som först appliceras på datamodellen innan beräkningen görs. Med vårt exempel skulle Qlik först välja ut de 50,000 aktuella raderna med en aktivitet och sedan summera Beloppet utan att behöva kontrollera Avdelning-fältet mer.


sum({<Avdelning={'A'}>} Belopp)

Syntaxen är lite krånglig, men man kan förstås slå upp den vid behov eller så om man skriver sådan kod ofta lägger man den på minnet. Set-analys är ett stort område som vi får återkomma till i fler inlägg.


Om du börjar skriva en if inuti en aggregeringsfunktion ska du starkt överväga om det verkligen behövs.


Hur är det med det omvända? Kan vi skriva

if(villkor,
  sum(...),
  sum(...)
)

Detta lider inte av samma problem med sum(if), men kom ihåg att båda värdena för sant eller falskt kommer att beräknas innan svaret ges. Även detta påverkar prestandan, men på ett annat sätt.


Skriven av: Morgan Kejerhag

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