Dynamiska tabeller i Qlik Sense

Dynamiska tabeller är tabeller där man låter användaren styra vilka kolumner som ska vara synliga. Anledningen kan vara att tabellen är stor eller att man vill erbjuda användaren en hög flexibilitet och enkel self-service.



Det finns flera lösningar på hur man kan skapa dynamiska tabeller, men en av de enklaste är att låta användaren göra urval i ett eller flera fält som styr vilka kolumner som syns. Styrfälten är inte kopplade till den övriga datamodellen och kommer därför inte att reducera data vid urval.


Skapa helt enkelt en inline-tabell i scriptet som innehåller de rader vi vill styra tabellen på. En inline-tabell är data skapat direkt i scriptet utan att man har en extern datakälla.



I detta fallet kommer vi ha ett antal dimensioner (rad 1-7) och tre uttryck (rad 8-10) att välja på som användare. Om man väljer t.ex. Country, CategoryName och Quantity (ett uttryck för summa av kvantitet) kommer just de tre kolumnerna visas.


I exemplet med de tre kolumnerna ovan ska man även tänka på att uttrycket Quantity kommer att aggregera underliggande rader till respektive Country-CategoryName-nivå. Dvs det blir bara en rad för en viss kombination av Country och CategoryName och i Quantity kommer all kvantitet för underliggande order summeras upp.


I datamodellen kan vi se att vi dels har den normala datamodellen med data som vi vill visa i grafer & tabeller - i detta fall försäljningsdata. Vi har också en separat tabell som vi valt att döpa till FieldSelections som inte är kopplad till den övriga modellen. Eftersom den inte är kopplad kommer urval i de ingående fälten inte påverka data i den normala datamodellen.


För att dölja och visa kolumner i tabellen ska vi använda funktionen "Show column if". Den låter oss skriva ett uttryck som kommer att beräknas som sant eller falskt. Om uttrycket blir sant kommer kolumnen att visas och annars kommer den att döljas.


Uttrycket kommer i princip att bestå av att räkna hur många gånger ett fälts namn finns med i en sammansatt sträng av alla möjliga värden i urvalsfältet. Säg att användaren väljer Country, CategoryName och Quantity - då blir den sammansatta strängen CountryCategoryNameQuantity. Genom att se om t.ex. Quantity finns med i strängen (ja!) kan vi avgöra om kolumnen ska visas. ProductName finns inte med i strängen och ska heller inte visas.


Dock behöver vi vara försiktiga! Tänk om vi också har en kolumn Name - då kommer Name finnas med i den sammansatta strängen, men inte för att man valt kolumnen Name utan för att man valt CategoryName (där Name är en del). För att undvika detta sätter vi ett skiljetecken mellan fälten - t.ex. |Country|CategoryName|Quantity| och vi letar efter |Name| - som nu inte finns träff på.


Slutligen ska vi också använda ett ID-nummer för respektive fält istället för namnen. Orsaken till detta är att risken finns att någon senare önskar att döpa om beskrivningen av ett fält och då skulle vi även behöva uppdatera koden. Så vi använder första kolumnen i vår urvalstabell (se ovan): Country = 2, CategoryName = 5 och Quantity = 9. Detta ger oss den sammansatta strängen |2|5|9|. Ordningen spelar egentligen ingen roll eftersom vi kommer att söka efter delsträngar.


För att sätt samman de möjliga värdena använder vi aggregeringsfunktionen concat(). Den tar två parametrar: 1. Fältet med värden som ska sättas samman 2. Vilket skiljetecken som ska användas. Funktionen kommer att ge oss strängen 2|5|9 (tre möjliga värden med pipe-tecken som avskiljare). Till detta får vi själva lägga pipe-tecken först och sist så att vi får |2|5|9|. Det är viktigt eftersom vi kommer att söka efter t.ex. |9|.


'|' & concat(SelFieldNo,'|') & '|'


För att göra kontrollen om ett visst värde finns med lägger vi till en kontroll (exempelvis 5 för att leta efter CategoryName):


substringcount('|' & concat(SelFieldNo,'|') & '|','|5|')=1


Detta uttryck ska vi använda på alla kolumner i vår tabell (och ändra siffran 5 till det som motsvarar kolumnen). För att minska koden vi behöver skriva varje gång ska vi skapa en variabelfunktion (en variabel som kan ta in en eller flera parametrar). Vi byter då ut själva siffran vi söker efter till $1 - den första parameterns värde. Om vi exempelvis skapar en variabel som heter vSelFieldShow och sätter dess värde till substringcount('|' & concat(SelFieldNo,'|') & '|','|$1|')=1 så kan vi senare anropa variabelfunktionen med $(vSelFieldShow(3)).



På varje fälts "Show column if" i tabellen lägger vi $(vSelFieldShow(3)) där siffran bytes mot respektive SelFieldNo (1-10) i tabellen ovan.



För urvalen lägger vi ut fältet SelField som en vanlig filter pane / urvalsbox. Sortera boxen så med ett uttryck SelFieldNo. Då hamnar fälten i samma ordning som i vår tabell. Om man vill kan man också lägga till en tredje kolumn för sorteringsordning i styrtabellen. Då kan man ändra ordningen utan att ändra det numeriska värdet i den första kolumnen. En ändring på det numeriska värdet i första kolumnen skulle kräva att man ändrar i koden med.




Om vi som användare nu väljer Country, CategoryName och Quantity får vi följande tabell:



Användaren kan byta ordning på kolumnerna som vanligt genom att dra och släppa dem i tabellen. Dessutom kan användaren skapa bokmärken för vanliga kombinationer av fält för att snabbt kunna återgå till dessa.


 

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