Semantiska länkar
Normalt gör man val genom att klicka på de fältvärden man är intresserad av. Det går emellertid också att göra val indirekt genom semantiska länkar. Semantiska länkar påminner om fältvärden, men med den skillnaden att de beskriver relationerna mellan objekt snarare än själva objekten. De visas som en lista av knappar.
När man klickar på en semantisk länk görs ett val i ett annat fält.
Regler för semantiska tabeller
Semantiska länkar skapas genom att tabeller som innehåller relationer mellan objekten läses in.
- Tabellen måste innehålla exakt tre eller fyra kolumner.
- En semantisk tabell måste innehålla antingen relationer mellan fältvärden i olika fält eller mellan fältvärden i samma fält. En blandning av dessa två godtas inte.
- LOAD- eller SELECT-satsen som läser in en semantisk tabell måste föregås av prefixet semantic som visar att det inte rör sig om en logisk tabell.
Vanligtvis används fyra kolumner, varav den första ska innehålla fältvärdena som står i relation till något annat fältvärde, den tredje de relaterade fältvärdena. Den andra kolumnen ska innehålla namnen på relationerna och den fjärde namnen på de omvända relationerna.
Om man använder tre kolumner, kan de omvända relationerna inte få egna namn. Namnen som ges i den andra kolumnen kommer att användas för både relation och omvänd relation. Namnen föregås eller följs då av en pil.
Om det rör sig om relationer mellan fältvärden i samma fält, måste den första och den tredje kolumnen ha samma namn. Även den andra och den fjärde kolumnens namn, d.v.s. relationstypen, måste överensstämma. Om relationerna däremot finns mellan fältvärden i olika fält, måste alla kolumnerna ha olika namn.
Extrahera en semantisk tabell ur data
Den semantiska tabellen måste inte alltid existera som en tabell utanför QlikView. Det är ofta smidigare att extrahera den ur den befintliga tabellen genom en separat LOAD-sats.
I exempeldokumentet presidents för QlikView kan skriptet för att generera länkarna Predecessor och Successor se ut på följande sätt:
Directory presidents;
LOAD * from presdnts.csv (ansi, txt, delimiter
is ',', embedded labels);
Semantic LOAD
No -1 as No,
'Successor' as Relation,
No,
'Predecessor' as Relation
from presdnts.csv (ansi, txt, delimiter is ',',
embedded labels) where No > 1;
Den andra LOAD-satsen resulterar i en tabell som den i bilden till höger, som laddas som semantisk tabell. where-satsen används för att utelämna den första posten, som annars skulle länka den första presidenten till president nummer 0 (som inte finns).
Observera också att den andra LOAD-satsen innehåller två fält med namnet No och två fält med namnet Relation. En sådan LOAD-sats skulle orsaka ett skriptexekveringsfel om den användes för att ladda en logisk tabell, eftersom laddningsproceduren för en logisk tabell kräver att alla fält har olika namn. En SELECT-sats av samma typ skulle inte heller bli godkänd, eftersom de flesta ODBC-drivrutiner också kräver att alla fält har olika namn. Om tabellen över presidenterna fanns i en databas, skulle man därför använda följande struktur:
Connect to DataBase;
SELECT * from presdnts;
Alias No2 as No, Relation2 as Relation;
Semantic SELECT
No -1 as No,
'Successor' as Relation,
No as No2,
'Predecessor' as Relation2
from presdnts where No > 1;
Tabellen med presidenterna är bara ett enkelt exempel på hur man kan använda semantiska länkar. Semantiska länkar kan t.ex. användas inom släktforskning, med länkar som kusin, syskon, mormor etc. Semantiska länkar kan också användas för människor inom företag, där chef, rapporterar till, sekreterare etc kan bli länkar. Exempel: superior, reports to, secretary etc.
Använda de relaterade fältvärdena som relationsnamn
Ibland är det mer deskriptivt att använda det relaterade fältvärdet som namn på relationen. I exemplet med presidenterna vill man kanske ha alla föregångare i en kolumn och alla efterträdare i en annan.
Följande skript behövs för att skapa dessa länkar:
LOAD
No as DuplicateOfNo,
FirstName & ' ' & LastName as Name,
*
from presdnts.csv;
Semantic LOAD
No -1 as No,
FirstName & ' ' & LastName as Successor,
No as DuplicateOfNo,
'Dummy1'
from presdnts.csv where No > 1;
Semantic LOAD
No +1 as No,
FirstName &' ' & LastName as Predecessor,
No as DuplicateOfNo,
'Dummy2'
from presdnts.csv;
När man klickar på en semantisk länk, görs ett val i den tredje kolumnens fält, DuplicateOfNo, som i den semantiska tabellen alltid motsvarar numret på den president vars namn visas på den semantiska länken.
Kanske framstår det inte genast tydligt att de omvända relationerna i ovan visade konstruktion är nästintill värdelösa. De skulle visa namnet på en president. Om man klickade på detta namn, skulle föregångaren/efterträdaren till den visade presidenten väljas. De omvända relationerna kallas därför Dummy1 och Dummy2 och endast den första relationen (kolumn två) används.
Eftersom vi inte vill att dummy-relationerna ska visas i listboxar, måste vi behandla den andra och den fjärde kolumnen som olika typer av relationer. Det betyder att kolumn ett och kolumn tre måste ha olika fältnamn. Detta är orsaken till att det finns två kolumner som innehåller presidentnummer, No och DuplicateOfNo.
Två olika semantic-satser är nödvändiga då vi vill ha två olika listboxar med relationer.
Detta exempel kan också göras med hjälp av semantiska trekolumnstabeller, men listboxarna som innehåller de omvända relationerna skulle då med största sannolikhet förbrylla användaren.