Samexistens mellan QlikView och Qlik Sense med hjälp av Qlik Deployment Framework (QDF)

Vi på egbs consulting har under flera års tid varit förespråkare av det centraliserade ramverket, Qlik Deployment Framework, QDF. Vill du veta mer om varför du ska arbeta med Qlik Deployment Framework kan du läsa mer här. Vid den årliga globala Qlik konferensen Qonnections 2016 var vi på plats i Orlando och höll en session om hur du kan skapa samexistens mellan QlikView och Qlik Sense med hjälp av just Qlik Deployment Framework (QDF).

Den här bloggposten ger dig en kort resume om hur du kan åstadkomma detta.

Namnlös bild

 

I vårt exempel utgår vi från en standard struktur (QDF).

 

Det vi gjort tillägg i denna standard struktur är att vi skapat en ”exekveringskripts” mapp under 3.Include. Denna mapp har vi kallat 99.Application och avser att hålla alla skriptfiler som anses som slutapplikationsskript dvs L steget i en ETL struktur. I vårt exempel anser vi också att antingen QlikView eller Sense eller i kombination sköter och ombesörjer E och T stegen i ETL processen.

 

Vårt exempel skript ser ut så här.

 

CALL LoadContainerGlobalVariables('Example2','Import');
SET vL.ImportData = $(vG.ImportPath);
DummyData:LOAD 
Date,
Company,
Data_X,
Data_Y
FROM
[$(vL.ImportData)\Data.csv]
(txt, codepage is 1252, embedded labels, delimiter is ';', msq);
SET vL.Measure.X = 'sum(Data_X)';

 

Vi hämtar de globala importvariablerna för container Example2. Vi laddar data från en CSV fil (sparad i 8.Import). Vi avslutar skriptet med att skapa en lokal variabel för ett uttryck.

Det vi vill åstadkomma med att bryta ut exekveringskriptet för L steget är för att både QlikView och Qlik Sense ska kunna exekvera samma kod. Där får Qlik Deployment Framework en nyckel eftersom vi då kan arbeta med samma struktur som kommer fungera väl i båda produkterna. Vi kommer också döpa skriptfilen till vad QlikView Dokumentet (QVW) heter samt till den titel Qlik Sense applikationen kommer ha. I vårt exempel är detta Report XX vilket ger att skriptfilen döps till Report XX.qvs. I vårt exempel läser vi endast en CSV fil från container Example2:s import mapp (8.Import).

 

Nu har vi ett exekveringskript förberett. Nu behöer vi skapa en QVW och en QVF för att kunna köra detta i respektive produkt. Vi skapar därmed en QVW och döper den till Report XX.qvw samt skapar  en Sense app och sätter titeln till Report XX.

Initiera QDF i QlikView

Vi inleder med QlikView och initiering av QDF ramverket.

// First Base Variable Include ,Use relative path to 1.init.qvs
// Contains base searchpath in this container
LET vG.BasePath=;
// Basic search for 1.Init.qvs
$(Include=..\..\..\..\InitLink.qvs);
$(Include=..\..\..\InitLink.qvs);
$(Include=..\..\InitLink.qvs);
$(Include=..\InitLink.qvs);
EXIT SCRIPT WHEN'$(vG.BasePath)'= '';

Därefter ska vi exekvera vårt QVS skript. För att få detta dynamisk och återanvändbart (du kan självklart inkludera detta i ramverket för att kalla detta med hjälp av en SUB) gör vi på detta sätt. (Kom ihåg att vi döpte vårt QVS skript till det tilltänkta QVW filnamnet).

LET vL.DocName = SUBFIELD(DocumentName(), '.qvw',1);
$(Include=$(vG.IncludePath)\99.Application\$(vL.DocName).qvs);

Vi börjar med att ta ut dokumentets namn utan filändelsen. Sedan kallar vi helt enkelt på detta genom vår variabel vL.DocName. Du kan självklart anropa 99.Application mappen med hjälp av en variabel från ramverket men i detta exempel blir det tydligare genom att vi endast lägger på det på vår vG.IncludePath variabel.

Initiera QDF i Qlik Sense

För Qlik Sense skiljer initieringen av ramverket sig mot hur vi gjorde i QlikView. Vi börjar med att skapa en data connection till den container vi önskar samt en till vår delade mapp 99.Shared. Denna koppling döper vi till ”Shared” respektive ”Example2”. (Ramverket behöver denna åtkomst/sökväg för att generera upp variabler för det som är delat/gemensamt.) Vi väljer sedan att sätta vår ”hem container” till vår exempel container dvs Example2.

 

SET vG.HomeContainer='lib://Example2';
$(Include=$(vG.HomeContainer)\InitLink.qvs);

 

När vi sedan ska kalla på vårt exekveringskript görs detta på liknande sätt i Qlik Sense som i QlikView. Skillnaden är att vi istället för att använda dokumentets namn via DocumentName() behöver använda DocumentTitle(). Varför det? Jo för DocumentName() ger endast App ID. Därför behöver vi ha titeln och därmed behöver titeln vara det samma som skriptet är döpt till samt vad QlikView dokumentet är döpt till. I vårt fall blir det Report XX.

 

LET vL.DocName = DocumentTitle();
SET vL.IncludeScript = '$(vG.IncludePath)\99.Application\$(vL.DocName).qvs';
$(Include=$(vL.IncludeScript));

 

Single point of truth

Med hjälp av Qlik Deployment Framework har vi nu åstadkommit en central yta som båda produkterna kan konsumera information ifrån och därmed uppnågr vi samexistens (co-existance) och single-point-of-truth.

 

Om vi gör förändringar i vårt Report XX.qvs skript kommer vi uppleva förändringarna i båda produkterna. Därför är det också bra att använda variabler för t.ex. uttryck och beräkningar centralt i ramverket för att få en källa och en sanning. I QlikView använder vi tex vL.Measure.X som uttryck. I Qlik Sense kan vi skapa ett mått där vi använder denna variabel. Självklart kan du bygga ut detta för att även hantera kommentarer (metadata) samt rubrik/namn på ditt mått. Då kan du uppdatera denna variabel som sedan slår igenom i hela din miljö, både i QlikView och Qlik Sense. Självklart kanske även vissa measure variabler ska läggas i Shared för att kunna användas globalt och inte som i vårt exempel där variabeln är satt till en lokal.

 

Share on LinkedInTweet about this on TwitterShare on Google+Share on FacebookEmail this to someone

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *