Sunteți pe pagina 1din 60

Mihaela Muntean, Ana-Ramona Bologa

Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-


505-858-3

Modelul de date asociativ


Modelul asociativ este implementat de instrumentul BI Qlikview [se descarcă
versiunea Qlikview Personal Edition 11 de pe www.qlik.com] și are următoarele
caracteristici:
 utilizează o mare varietate de surse de date: baze de date (conexiune prin
ODBC/ OLEDB), fișiere (Excel, CSV, txt, XML, HTML, etc.) și Big data
(Qlikview Direct Discovery). Există de asemenea, diferiți conectori la
aplicațiile SAP, rețelele sociale cum ar Twitter/Facebook;
 utilizează tehnologia “in-memory”, adică stochează toate datele în RAM,
deci timp de răspuns mai mici;
 seturile de date sunt încărcate în RAM, utilizând un limbaj de script;
 datele sunt stocate în RAM la nivel de detaliu. Nu sunt necesare tabele
logice pentru agregate;
 agregarea datelor poate fi definită în scriptul de încărcare, sau realizată în
etapa de dezvoltare a interfeței aplicației;
 utilizează tehnologia AQL (associative query logic) pentru a deduce
asocierile dintre seturile de date. Aceste asocieri nu reflectă întotdeauna
asocierile de tip cheie externă din BDR;
 elimină necesitatea de a crea ierarhii, cuburi n-dimensionale;
 este adaptabil la modificările rapide ale cerințelor de business;
 utilizează algoritmi de compresie complecși (datele sunt comprimate la
10% din dimensiunea lor originală, atunci când sunt încărcate în
documentul QlikView). [Qlikview, 2010], [Qlikview, 2011a], [Qlikview,
2011b], [Redmond, 2013].
În timp ce schema stea/cubul n-dimensional utilizează ierarhii pentru a naviga
și explora datele, modelul asociativ permite utilizatorilor să aleagă ce “rută” doresc
(figura 3.45). Este un model persistent și foarte flexibil. Orice selecție făcută în
documentul Qlikview este automat aplicată pe întregul model de date (căutare
“asociativă”), se vor afișa toate datele corelate cu acea selecție.

Modelul asociativ Schema stea/cubul n-dimensional utilizează ierarhii

Figura 3.45. Modelul asociativ versus schema stea

1
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Extragerea, transformarea și încărcarea datelor sursă în modelul asociativ,


precum și crearea modelului asociativ ca structură și stocarea lui (inclusiv datele)
pe disc în fișiere intermediare (QVD) se realizează cu ajutorul unui limbaj de script
și a unui script. Datele sunt încărcate în model prin comenzi LOAD (pentru fișiere)
sau comenzi SELECT (pentru baze de date). Pentru fiecare comandă
LOAD/SELECT se va genera în modelul de date o tabelă logică (cu unele
excepții). Qlikview nu face diferența dintre tabelele logice generate cu
LOAD/SELECT. În modelul asociativ, există două reguli de bază pentru asocieri
și anume:
1. două sau mai multe tabele logice se vor asocia în mod implicit, dacă au cel
puțin un atribut comun. Denumirea atributului trebuie să fie identică în
toate tabelele logice (de exemplu, Nume și nume nu sunt identice);
2. dacă un atribut are exact aceeași valoare în mai multe tabele logice,
Qlikview va considera că rândurile ce conțin această valoare ar trebui
asociate.
De exemplu, avem trei tabele logice:
Tabela 1: Tabela 2: Tabela 3:
Nume Număr Număr Vârsta Nume ID
Ion 1 3 28 Dan ab
Dan 2 4 35 ion xy
Maria 5 2 42

Atributul Număr respectă prima regulă, tabelele 1 și 2 sunt asociate prin acest
câmp. Tabelele 1 și 3 sunt asociate prin atributul Nume. Atributul Număr are
valoare 2 în tabelele 1 și 2 ceea ce înseamnă că Dan este asociat cu vârsta 42.
Valoare 2 din tabela 1 este asociată cu valoare ab a câmpului ID din tabela 3, prin
valoarea Dan a câmpului Nume. Ion din tabela 1 totuși nu este asociat cu ion din
tabela 3. O asociere în modelul asociativ este identică cu o joncțiune SQL externă
completă [Qlikview, 2011a], [Qlikview, 2011b].

3.3.1. Încărcarea și asocierea a două sau mai multe


surse de date
În modelul asociativ se vor încărca informații despre clienți, produse, agenți și
vânzările realizate de diferiți agenți. Se vor utiliza următoarele surse de date:
 un fișier Excel exemplu.xlsx, foaia Vânzări cu următoarea structură:
VanzID (codul tranzacției), ArtID (codul produsului vândut), CodClient
(codul clientului), AgentID (codul agentului care a făcut tranzacția),
cantitatea vanduta și vânzarea (pret*cantitate), Data (data la care s-a făcut
tranzacția) (figura 3.46);

2
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.46. Fișierul exemplu.xlsx

 un fișier text Agenti.tab cu informații despre agenți: AgentID, NumeAgent,


Pozitie, Oras, JudetID) (figura 3.47.);
 un fișier Judete.csv cu informații despre județe: Judetid, Judet, Resedinta,
Regiune) (figura 3.48);

Figura 3.47. Fișierul Agenti.tab


3
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.48. Fișierul Judete.csv

 datele despre produse sunt extrase din tabela Articole (baza de date
Oracle). Structura tabelei Articole este prezentata în figura 3.49 și figura
3.50;

Figura 3.49. Tabela Articole din baza de date Oracle

4
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.50. Structura tabelei Articole

 datele despre clienți sunt extrase din tabela Clienti (baza de date Access).
Structura tabelei Clienti este prezentată în figura 3.51 și figura 3.52.

Figura 3.51. Tabela Clienti din baza de date Access


5
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Prima sursă de date care va fi încărcată este fișierul Excel. Se parcurg următorii
pași:
1. Se lansează instrumentul Qlikview. Se selectează din meniul File, opțiunea
New pentru a crea un document Qlikview. Nu se va utiliza opțiunea
Wizard pentru a crea un document. Se închide fereastra Getting Started
Wizard (butonul Cancel). Se va crea automat o pagină cu denumirea
Main;
2. Se selectează din meniu, opțiunea File/Edit script. Se deschide fereastra
Edit Script și se selectează din meniu, opțiunea Tab/Insert tab at cursor.
Se va crea un nou tab: surse de date Excel;
3. În fereastra Edit Script apar o serie de linii de cod (comenzi SET utilizate
pentru a inițializa o serie de variabile ale sistemului);
4. Se selectează tab-ul Data și se bifează caseta Relative paths (scriptul va
cunoaște locația, adică folderul și denumirea fișierului);
5. Click pe butonul Table files și se deschide fereastra Open Local files. Se
alege fișierul exemplu.xlsx. Se alege foaia Vânzări. Și apoi click pe butonul
Open;
6. Fișierul se deschide în fereastra File Wizard:type. Qlikview interpretează
fișierul ca fiind un fișier ce utilizează ca delimitator (,) și cu setul de
caractere ANSI. În fereastra File Wizard: type se fac următoarele setări:
tipul de fișier este Excel (xlsx), se alege foaia corespunzătoare (caseta
Tables: Vânzări), se includ etichetele coloanelor (Labels: embedded
Labels - dacă primul rând al fișierului conține denumirea câmpurilor)
(figura 3.53);

6
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.52. Structura tabelei Clienti

7. Click pe butonul Finish și se va crea automat scriptul pentru încărcarea


fișierului. Se utilizează comanda LOAD. Întrucât s-a selectat butonul
Relative Paths, comanda Directory este plasată înainte de LOAD. Se
poate șterge, deoarece nu este relevantă încă. Apoi se asignează un alias la
sursa încărcată și anume Vanzari. Dacă denumirea sursei conține caractere
speciale sau spații se utilizează [ ]:
Directory;
Vanzari:
LOAD ArtID, VanzID, CodClient, AgentID, cantitate, Vanzarea, Data
FROM exemplu.xlsx (ooxml, embedded labels, table is Vanzari);

Comanda LOAD este compusă din:


 denumirea câmpurilor care vor fi încărcate;
 clauza FROM care specifică locația sursei cu cale completă/relativă;
 atribut specific fiecărui tip de fișier sursă. De exemplu, pentru un fișier
Excel: (ooxml, embedded labels, table is Vanzari).
Se salvează scriptul (opțiunea File/Save entire document), apoi se execută scriptul
(opțiunea File/Reload). Datele vor fi încărcate în documentul QlikView.

7
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.53. Fereastra File Wizard: Type

A doua sursă de date este tabela Clienti (bază de date Access). Se parcurg
următorii pași:
1. Se selectează din meniu opțiunea File/Edit Script. Se poziționează mouse-
ul la sfârșitul scriptului anterior;
2. Se selectează din caseta Database: OLDB și apoi click pe butonul
Connect;
3. Se deschide fereastra de dialog Data Link Properties. Se selectează OLE
DB Provider for ODBC Drivers;
4. În pagina Connection, se selectează opțiunea Use connection string și
click pe butonul Build. Se deschide fereastra de dialog Select data source;
5. Se selectează tab-ul Machine Data Source. Se selectează MS Access
Database;
6. Se deschide fereastra de dialog Login, click pe butonul Database;
7. Se deschide fereastra de dialog Database. Se alege baza de date
Clienti.accdb (figura 3.54.).

8
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.54. Încărcarea tabelei Clienti

Se va genera următoarea linie de script:


OLEDB CONNECT TO [Provider=MSDASQL.1;Persist Security
Info=False;Extended Properties="DSN=MS Access
Database;DBQ=D:\qlikview\clienti.accdb;DefaultDir=D:\qlikview;DriverId=25;F
IL=MS Access;MaxBufferSize=2048;PageTimeout=5;UID=admin;"];

Următorul pas este de a selecta tabela și câmpurile. În fereastra Edit Script,


click pe butonul SELECT. Se deschide fereastra de dialog Create Select
Statement. (*) - înseamnă că sunt selectate toate câmpurile. Se selectează din
caseta Database tables, tabela Clienti. Apoi click pe atributele: Adresa, Client,
CUI și NumeClient. Se va genera următoarea linie de script:
SQL SELECT Adresa, Client, CUI, NumeClient FROM
`D:\qlikview\clienti.accdb`.Clienti;
Se salvează și apoi se execută scriptul (Reload). Cele două seturi de date se vor
asocia automat, dacă au un atribut comun. Se selectează din meniu, opțiunea
File/Table Viewer pentru a vizualiza modelul de date creat. Observăm că s-au
creat două tabele logice, dar nu sunt asociate (figura 3.55).

9
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.55. Tabele logice neasociate

Redenumirea atributelor
Uneori atributele pe care nu dorim să le asociem, au aceeași denumire, sau
atributele pe care dorim sa le asociem, nu au aceeași denumire. Pentru a asocia cele
doua tabele logice, se parcurg următorii pași:
1. Se selectează din meniu, opțiunea File/Edit script;
2. Pentru a asocia tabela logică Vanzari cu tabela logică Clienti, trebuie să
redenumim atributul Client din tabela logica Clienti. Pentru a redenumi un
atribut, se utilizează opțiunea AS în scriptul de încărcare. Se salvează și
apoi se execută scriptul (figura 3.56.). Scriptul modificat:
SQL SELECT Adresa, Client as CodClient, CUI, NumeClient
FROM `D:\qlikview\clienti.accdb`.Clienti;
3. Se salvează documentul Qlikview cu denumirea: exemplu.qwv.

Figura 3.56. Tabele logice asociate

Încărcarea unei fișier (.CSV). Se va încărca fișierul Judete.csv. Se parcurg


următorii pași:
1. Se selectează din meniu, opțiunea File/Edit Script;
2. Se poziționează mouse-ul la sfârșitul scriptului pentru încărcarea tabelei
Clienti. Se selectează caseta de validare Relative paths;
3. Click pe butonul Table Files și se alege fișierul Judete.csv. Și apoi, click
pe butonul Open;

10
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

4. În fereastra File Wizard: Type, se specifică tipul fișierului, setul de


caractere (de exemplu, Western european), dacă primul rând al fișierului
conține denumirea câmpurilor, tipul de delimitator (; , sau tab) și dacă se
pot utiliza sau nu ghilimelele. Se fac următoarele setari: Labels:
embedded labels, File Type=Delimited, delimiter:comma;
5. Click pe butonul Finish. Se va crea următorul script:
Judete:
LOAD Judet, Judetid, Resedinta, Regiune
FROM judete.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);

Se asociază alias-ul Judete pentru setul de date încărcat. Se poate seta caseta de
validare Save before Reload, din fereastra User Preferences (opțiunea
Settings/User preferences) și documentul se va salva automat înainte de
reîncărcarea datelor. Se execută scriptul. Modelul este prezentat în figura 3.57.

Figura 3.57. Încărcarea unui fișier (csv)

Încărcarea unui fișier text. Se va încărca fișierul Agenti.tab, un fișier text care
utilizează ca delimitator (tab). Fișierul nu conține etichete/denumirile atributelor.
Se parcurg următorii pași:
1. Se selectează din meniu, opțiunea File/Edit Script. Se poziționează
mouse-ul la sfârșitul scriptului pentru încărcarea fișierului Judete.csv;
2. Click pe butonul Table Files și se alege fișierul Agenti.tab. Apoi, click pe
butonul Open;
3. În fereastra File Wizard: Type, se fac următoarele setari: File
Type=Delimited, Delimiter: tab;
4. Se înlocuiește @1 cu AgentID, @2 cu NumeAgent, @3 cu Pozitie, @4 cu
Oras, @5 cu JudetID (figura 3.58).
5. Click pe butonul Finish. Se va crea următorul script:
Directory;

11
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Agenti:
LOAD @1 as AgentID, @2 as NumeAgent, @3 as Pozitie, @4 as Oras, @5 as
Judetid FROM agenti.tab (txt, codepage is 1252, no labels, delimiter is '\t', msq);

Se salvează și apoi se execută scriptul. Se deschide fereastra Table Viewer.


Observăm ca s-a creat tabela logică Agenti. De asemenea, au fost create automat și
asocierile (figura 3.59).

Figura 3.58. Încărcarea unui fișier text

Încărcarea datelor dintr-o bază de date Oracle. Pentru conectare la o bază de


date se utilizează OLEDB /ODBC. Se va utiliza o bază de date Oracle care conține
tabela Articole și se parcurg următorii pași:
1. Se va crea o conexiune ODBC la baza de date Oracle. Se alege opțiunea
Data sources (ODBC). Se deschide fereastra ODBC Data Source
Administrator;
2. Se selectează tab-ul USER DSN. Click pe butonul Add;
3. Se selectează Microsoft ODBC for Oracle și se completează: denumire
sursa de date, denumire serviciu (service name) și utilizator (figura 3.60);
4. Apoi, în documentul Qlikview, se selectează din meniu, opțiunea File/
Edit script. Se plasează cursorul la sfârșitul scriptului pentru încărcarea
fișierului Agenti.tab;

12
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

5. Se alege din caseta Database: ODBC și click pe butonul Connect pentru a


se stabili conexiunea la sursa de date (figura 3.61);

Figura 3.59. Modelul asociativ

Figura 3.60. Creare conexiune ODBC la baza de date Oracle

13
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Apare următoarea linie de script:


ODBC CONNECT TO [oracle; DBQ=ORCL ] (XUserId is
ZMFVTWFNILYKGWFMZB, XPassword is PRJXaGFNITMCWSRNBbYA);

Figura 3.61. Stabilirea conexiunii la baza de date Oracle

Figura 3.62. Generarea comenzii SELECT


14
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

6. Click pe butonul Select din fereastra Script Editor. Se deschide fereastra


Create Select statement. Se alege proprietarul, tabela și atributele (*
înseamnă toate atributele). Apoi, click pe butonul OK (figura 3.62). Apare
următoarea linie de script: SQL SELECT * FROM MIHAELA.ARTICOLE;
7. Se salvează și apoi, se execută scriptul. Modelul obținut este prezentat în
figura 3.63.

Figura 3.63. Încărcarea tabelei Articole

Se observă că tabela logică Articole nu este asociată cu tabela logică Vanzari.


Vom redenumi atributul ArtID din tabela logică Vanzari și asocierea se generează
automat (figura 3.64): LOAD ArtID as ARTID……………………………..

15
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.64. Crearea asocierii dintre tabela logică Vanzari și tabela logică Articole

Se poate utiliza și comanda Qualify prin care denumirea unui atribut este
precedată de denumirea tabelei logice corespunzătoare:
Qualify ArtID;
Vanzari:
LOAD ArtID, VanzID, CodClient, AgentID, cantitate, Vanzarea, Data
FROM exemplu.xlsx (ooxml, embedded labels, table is Vanzari);

Se observă că atributul ArtID apare de forma Vanzari.ArtID (figura 3.65).

Figura 3.65. Utilizarea comenzii Qualify

16
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

În unele cazuri este necesar de a redenumi o listă de atribute. Atunci putem


utiliza caractere speciale. De exemplu:
 Qualify AgentID, ArtID;- se aplică doar atributelor AgentID și ArtID;
 Qualify “*ID”;- se aplică tuturor atributelor al căror nume se termină cu
ID;
 Qualify *; - se aplica tuturor atributelor încărcate, după utilizarea comenzii
Qualify.
Se poate utiliza comanda Qualify și comanda Unqualify împreună:
Qualify *;
Unqualify Key_Field1, Key_Field2;
Este util atunci când dorim ca atributele cheie să nu fie afectate de comanda
Qualify.

Comanda LOAD INLINE poate fi folosită pentru a încărca un număr mic de


înregistrări. Este mai simplu de a le crea în script, decât de a le încărca dintr-un
fișier extern. Ultima sursă va fi încărcată cu comanda LOAD INLINE. Se parcurg
următorii pași:
1. Se selectează din meniu, opțiunea File/Edit Script;
2. Se selectează din meniul asociat editorului, opțiunea Insert/Load
Statement/Load Inline și se deschide fereastra Inline Data Wizard. Se
vor introduce datele conform figurii 3.66;

17
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.66. Încărcarea datelor cu ajutorul comenzii LOAD INLINE

Se va genera următorul script (se va utiliza un alias pentru setul de date


încărcat):
Categorii:
LOAD * INLINE [
CATEGORIEID, DenumireCategorie
1, Protectia muncii
2, Pneumatice
3, Auto
4, Constructii
5, Electrice
6, Chimice
7, Uleiuri
8, Truse
];

Se salvează și apoi se execută scriptul. Modelul asociativ final este prezentat în


figura 3.67. Se observă că structura modelului asociativ seamănă, în acest exemplu,
cu o schemă fulg de zăpadă. Tabela logică Vanzari ar fi tabela de fapte, iar tabelele
logice Clienti, Articole, Agenti ar fi tabele dimensionale.

18
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.67. Modelul asociativ final

Putem să utilizăm comanda LOAD INLINE și pentru a adăuga date în tabelele


logice existente în model. Să presupunem că dorim să adăugăm un client, fără să
modificăm sursele de date:
1. Se selectează din meniu, opțiunea File/Edit script;
2. Se poziționează cursorul în zona de încărcare a tabelei Clienti și se tastează
următoarea linie de script:
LOAD * INLINE [
CodClient, NumeClient, Adresa, CUI
646, Catering Service, Str Mihai Bravu 305, 2409292225];

Sau se selectează din meniul asociat editorului, opțiunea Insert/Load


Statement/Load Inline. Simbolul (*) este echivalent cu all fields. Se salvează și
apoi se execută scriptul. Datele puse între [ ], după INLINE sunt tratate ca o tabelă
logică care se va concatena automat cu tabela logică Clienti (au același set de
atribute). Se va crea apoi, o listă asociată atributului Numeclient și se observă că
apare clientul adăugat. Se salvează documentul: exemplu.qvw.

Rezultatul:

19
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

De asemenea, este posibil de a introduce în fereastra Inline Data Wizard, o


listă de valori ale unui atribut stocat deja în RAM (din meniul asociat ferestrei
Inline Data Wizard, se selectează opțiunea Tools/ Document Data). Se deschide
fereastra Import Document Data Wizard și se alege atributul dorit, precum și
valorile care vor fi importate (figura 3.68.).

Figura 3.68. Fereastra Import Document Data Wizard

3.3.2.Fereastra Table Viewer

20
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Pentru a vizualiza un model de date asociativ se utilizează din meniu, opțiunea


File/Table Viewer, sau combinație de taste CTRL+T. Se vizualizează tabelele
logice și asocierile dintre ele. Dacă mai multe tabele sunt asociate prin aceeași
cheie, se va indica cu un cerc mic albastru pe linia de conexiune. Dacă ne plimbam
cu mouse-ul peste header-ul unei tabele logice, se afișează denumirea tabelei,
numărul de rânduri, numărul de atribute și numărul de atribute cheie. Dacă un
comentariu este setat pentru tabela logică (utilizând comanda COMMENT
TABLE) se afișează și acest comentariu (figura 3.69).

Figura 3.69. Fereastra Table Viewer

Dacă ne plimbăm cu cursorul peste denumirea unui atribut, se afișează o serie


de informații utile și anume:
 Denumirea atributului, iar dacă este cheie, apare între paranteze [Key]. Pot
apare următoarele situaţii:
o [Perfect Key]- fiecare rând conține o valoare a cheii și toate aceste
valori sunt unice. În același timp, subset ratio este 100%. Qlikview
detectează automat dacă un atribut are valori unice și îl alege cheie
primară;
o [Primary Key] - toate valorile cheii sunt unice, dar subset ratio
<100%;
o [Key] - valorile cheii nu sunt unice.
 Information density indică procentul de tupluri nenule. De exemplu,
atributul CodClient din tabela logică Vanzari, are information
density=100% (figura 3.70);
21
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

 Subset ratio indică procentul de valori distincte ale unui atribut dintr-o
tabelă logică comparativ cu toate valorile distincte ale acelui atribut, din
întregul model de date. Este relevant numai pentru atributele cheie, întrucât
ele sunt prezente în multiple tabele. De exemplu, atributul CodClient, din
tabela logică Vanzari, conține doar 24% din valorile posibile ce există în
model (subset ratio=24% ), adică doar 24% din lista de clienți au făcut
tranzacții;
 Tags indică tag-urile aplicate atributului. Unele dintre aceste tag-uri sunt
generate automat (de exemplu, tag-ul care indică dacă atributul este cheie
sau tag-ul care indică tipul de dată). Alte tag-uri pot fi aplicate manual;
 Opțional orice comentariu atașat atributului.

Figura 3.70. Informații despre chei

Dacă se face click dreapta cu mouse-ul pe o tabelă logică și apoi se selectează


opțiunea Preview, se vor afișa primele 1000 de înregistrări (figura 3.71). Meniul
asociat ferestrei Table Viewer include următoarele opțiuni:
 Export Image - salvează o imagine a modelului de date (format
PNG/BMP);
 Export Structure - se poate exporta structura documentului QlikView. Se
vor crea trei fișiere text (.tab): un fișier cu informații despre tabelele logice
ale modelului, un fișier cu informații despre atribute și un fișier cu
informații despre mapările dintre atribute;
22
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

 Print - se poate tipări modelul de date sau copia în clipboard (copy Image);
 Auto-Layout - aranjează automat tabelele logice;
 Se poate seta dimensiunea de afișare a modelului (zoom). Implicit 100%;
 Se poate selecta Internal table View/Source Table View. Internal Table
view este setarea implicită și arată cum sunt stocate datele în QlikView.
Dacă există chei sintetice, sunt vizualizate. Setarea Source table View
arată cum citește QlikView datele, iar cheile sintetice nu sunt afișate.

Figura 3.71. Afișarea datelor dintr-o tabelă logică

3.3.3. Atașarea de imagini la un model de date


asociativ
Fișierul sursă Steme_regiuni.csv conține numai două coloane: o coloană cu
valorile câmpului Regiune care va fi cheie și o coloană cu denumirile fișierelor de
tip imagine (împreună cu locația):
Regiune,I
Moldova,D:\qlikView\StemaMoldova.png
Muntenia,D:\qlikView\StemaMuntenia.png
Maramures,D:\qlikView\StemaMaramures.png
Oltenia,D:\qlikView\StemaOltenia.jpg
Banat,D:\qlikView\StemaBanat.jpg

23
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Dobrogea,D:\qlikView\StemaDobrogea.jpg
Transilvania,D:\qlikView\StemaTransilvania.png
Crisana,D:\qlikView\StemaCrisana.png
Bucuresti,D:\qlikView\StemaBucuresti.jpg
Bucovina,D:\qlikView\StemaBucovina.jpg

Se parcurg următorii pași:


1. Se selectează din meniu, opțiunea File/Edit Script. Click pe butonul Table
Files. Se selectează fișierul Steme_Regiuni.csv și apoi click pe butonul
Open;
2. Se deschide fereastra File Wizard Type. Se fac următoarele setări:
Delimited: Comma, Lables: Embedded Labels. Se va genera următorul
script:
Directory;
StemeRegiuni:
INFO LOAD Regiune, I
FROM Steme_regiuni.csv
(txt, codepage is 1252, embedded labels, delimiter is ',', msq);

Se utilizează opțiunea INFO pentru a asocia imaginile cu valorile atributului


Regiune din tabela logică Judete. În unele cazuri se preferă ca aceste informații să
fie stocate în documentul Qlikview (.qvw) și se utilizează opțiunea BUNDLE
INFO. Se va crea apoi, o listă cu regiunile. Dacă se selectează una dintre regiuni
(de exemplu, Bucovina), un mic simbol (i) apare în colțul dreapta sus al listei, click
pe el și se deschide fișierul (png/jpg) asociat (figura 3.72).

24
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.72. Asocierea unei imagini la un atribut al modelului

3.3.4. Modificarea structurii surselor de date


Se consideră fișierul crostable.xls cu informații despre cantitățile vândute de
agenți în fiecare lună:

Agenti Ianuarie Februarie Martie Aprilie Mai Iunie


Ionescu Dan 160 336 545 152 437 100
Popescu Lucian 476 276 560 57 343 476
Predoiu Victor 251 591 555 195 341 399
Rus Matei 96 423 277 564 590 130

Dacă dorim să obținem total cantitate vândută pentru fiecare agent, trebuie să
creăm o expresie de tipul:
Sum (Ianuarie) + Sum(Februarie) + Sum(Martie) + Sum(Aprilie) + Sum(Mai) +
Sum(Iunie)
De aceea, se va modifica structura fișierului de forma:

25
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Agenti Luna Vanzari


Ionescu Dan Ianuarie 160
Ionescu Dan Februarie 336
Ionescu Dan Martie 545
Ionescu Dan Aprilie 152
Ionescu Dan Mai 437
Ionescu Dan Iunie 1
….. ….. ……

Cu această structură, se poate crea expresia sum(Vanzari). Se parcurg următorii


pași:
1. Se va crea un document Qlikview: Crosstable.qvw;
2. Se selectează din meniu, opțiunea File/Edit Script. Click pe butonul Table
Files și se alege fișierul crosstable.xls. Apoi click pe butonul Open;
3. Click pe butonul Next de 2 ori și ajungem în fereastra File
Wizard:Options;
4. Click pe butonul Crosstable și se deschide fereastra Crosstable Wizard
unde vom seta următorii parametrii (figura 3.73.):
 Qualifier fields - se specifică numărul de atribute care preced
atributele care vor fi transformate. În cazul nostru Qualifier field=1;
 Attribute field - denumirea atributului care va stoca valorile rezultate
din transformare (în cazul nostru Luna);
 Data Field - denumirea atributului care va stoca valorile
măsurii/indicatorului, rezultate din transformare (în cazul nostru
Vanzari);
5. Click pe butonul Finish.

26
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.73. Utilizarea opțiunii Crosstable Wizard

S-a generat următorul script:


Directory;
CrossTable(Luna, vanzari)
LOAD Agenti, Ianuarie, Februarie, Martie, Aprilie, Mai, Iunie
FROM crosstable.xls
(biff, embedded labels, table is [Foaie1$]);

Se salvează și se execută scriptul. Apoi se va crea un obiect de tip tabelă pentru


a afișa informațiile.

Rezultatul:

27
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

3.3.5.Utilizarea ierarhiilor
Modelul asociativ nu lucrează în mod implicit cu ierarhii, dar se pot crea și
utiliza, dacă dorim. Se consideră fișierul ierarhie.xls cu informații despre regiunile,
județele și orașele României, cu următoarea structură:

Parent_ID Parent Child_ID Child


0 România
0 România 1 Banat
0 România 2 Dobrogea
0 România 3 Muntenia
0 România 4 Moldova
0 România 5 Maramureș
0 România 6 Oltenia
0 România 7 Crișana
0 România 8 Transilvania
0 România 9 Bucovina
1 Banat 11 Caras Severin
2 Dobrogea 21 Constanta
2 Dobrogea 22 Tulcea
3 Muntenia 31 Ilfov
11 Caras Severin 111 Rezita

28
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

21 Constanța 211 Constanța


22 Tulcea 221 Medgidia
3 Muntenia 32 București
….. ……. ….. ……

Codurile pentru atributul Child_ID trebuie modificate, dacă dorim să avem


informații despre toate orașele din România. Observăm că ierarhia are 4 nivele
(România-Regiune-Județ-Oraș). Se parcurg următorii pași:
1. Se creează documentul ierarhie.qvw;
2. Se selectează din meniu, opțiunea File/Edit script;
3. Click pe butonul Table files și se alege fișierul ierarhie.xls. Click pe
butonul Open;
4. Se deschide fereastra File wizard: Type. Se fac setările corespunzătoare
pentru încărcarea unui fișier de tip Excel;
5. Click butonul Next de 2 ori pentru a ajunge la fereastra File Wizard:
option ;
6. Click pe butonul Hierarchy și se deschide fereastra Hierarchy
Parameters (figura 3.74). Se vor seta următorii parametrii, conform figurii
de mai jos:

29
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.74. Fereastra Hierarchy Parameters

 ID Field - stochează ID-urile corespunzătoare nodurilor copil;


 Parent ID Field - stochează ID nodului părinte;
 Name field - stochează denumirea nodului copil;
 Parent Name - un șir utilizat pentru a denumi un nou câmp care va fi
creat și va conține denumirile nodurilor părinte;
 Path Name - un șir utilizat pentru a denumi un nou câmp care va fi
creat și va conține lista de noduri de la rădăcină (top level) la nodul
corespunzător;
 Depth Name - denumirea unui nou câmp care va stoca numărul de
nivele pentru fiecare nod expandat. Parametrul Depth Name trebuie
adăugat manual la comanda Hierarchy generată de Wizard;
 Path Source - un atribut din sursa de date care conține valorile ce ar
trebui utilizate pentru a popula ierarhia (adică nivelele ierarhice);
 Path Delimiter - definește șirul care ar trebui utilizat pentru a separa
nivelele în ierarhie;
 Dacă câmpurile sursă au caractere speciale în denumire (de exemplu,
spații) Hierarchy Wizard nu le va include în script, deci trebuie să le
adăugam după ce scriptul a fost generat.
7. Click pe butonul OK și revenim în fereastra File Wizard și apoi click pe
butonul Finish. Se va genera următorul script:
HIERARCHY (Child_ID, Parent_ID, Child, ParentName, Child, Path, ' - ',
HierarchyLevel)
LOAD Parent_ID, Child_ID, Parent, Child
FROM ierarhie.xls (biff, embedded labels, table is [Foaie1$]);

Se salvează și apoi se execută scriptul. Se va crea apoi, un obiect de tip tabelă


(ordonare după HierarchyLevel).

Rezultatul:

30
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Tabela logică creată are un atribut pentru fiecare nivel ierarhic și o înregistrare
pentru fiecare nod. Au fost create noi câmpuri: Path, HierarchyLevel (figura 3.74).

Figura 3.74. Tabela logică creată


În cazurile în care un nod are mai mulți părinți, tabela va avea mai multe
înregistrări pentru acel nod. De asemenea, nodurile orfane vor fi excluse. O astfel
de structură poate fi utilizată cu o tabelă pivot, sau într-un grup ierarhic de
dimensiuni. Câmpurile create pot fi utilizate de asemenea, în liste pentru a face
selecții. De exemplu, se va crea o listă de tip arbore/ierarhie:
1. Din meniul principal, se selectează opțiunea Layout|New Sheet
Object|List box;
2. Se alege Titlu=Ierarhie;
3. Se selectează din lista Field, atributul Path;
4. În tab-ul General se marchează caseta de validare Show as Tree View și
se introduce (-) ca separator;
5. Click pe butonul OK.

31
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Rezultatul:

Se consideră următoarea sursă de date generic.xlsx care stochează valorile unor


atribute. Sunt diferite atribute pentru diferite obiecte, unele atribute se regăsesc la
mai multe obiecte:

Obiect Atribut Valoare


minge culoare galben
minge greutate 120g
minge diametru 8cm
moneda culoare aurie
moneda valoare $100
moneda diametru 2.5cm
Hochei Puc culoare negru
Hochei Puc diametru 7.62cm
Hochei Puc grosime 2.5cm
Hochei Puc greutate 165g

Se va poate utiliza clauza GENERIC care va converti această sursă într-o


tabelă logică specifică modelului de date asociativ. Se parcurg următorii pași:
1. Se creează un document Generic.qvw;
2. Se selectează din meniu, opțiunea File/Edit Script și se încarcă fișierul
Excel. Se va genera următorul script (se va adăuga clauza GENERIC):
Directory;
Generic LOAD Obiect, Atribut, Valoare
FROM generic.xlsx
(ooxml, embedded labels, table is Foaie1);

32
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Qlikview va transforma și procesa conținutul sursei astfel încât vom avea toate
atributele (culoare, greutate, diametru, grosime, etc.) stocate în tabele logice
separate și asociate cu obiectul corespunzător (figura 3.81). Fiecare tabelă logică va
avea un număr de rânduri, în funcție de numărul de obiecte care au același atribut.

Figura 3.81. Utilizarea opțiunii Generic

3.3.6. Fișiere QVD și QVX


Sunt tipuri de fișiere utilizate de QlikView pentru a stoca și citi datele într-un
format optimizat. Fișierul (QVD) are următoarele caracteristici:
 este un format specific Qlikview;
 modelul de date conține numai o singură tabelă logică;
 utilizează un algoritm special de compresie a datelor, ajungând la o rată de
compresie de 90%, în funcție de cardinalitatea atributelor din sursele de
date;
 citirea din aceste fișiere se face mult mai rapid (10-100 ori) decât
încărcarea dintr-o bază de date. Atunci când fișierul este citit, fără
aplicarea de transformări, Qlikview execută o încărcare optimizată (super-
fast-mode).
Dacă datele au fost exportate într-un fișier (QVD), nu mai este necesară
conexiunea la baza de date. Unul dintre principalele avantaje ale utilizării acestor
fișiere este că pot fi utilizate de mai multe aplicații Qlikview. Astfel, se reduce
încărcarea pe serverul de bază de date, se optimizează resursele Qlikview și timpul
de dezvoltare. Acest proces se numește QVD staging. Se utilizează comanda
STORE pentru a stoca modelul de date într-un fișier (QVD). De exemplu, vom
stoca tabela Articole într-un fișier articole.qvd:
store ARTICOLE into d:\qlikview\articole.qvd;
Se pot citi datele dintr-un fișier QVD:
33
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Articole:
LOAD ARTID, DESCRIERE, PRETUNITAR, COSTUNITAR, STOC,
CATEGORIEID
FROM articole.qvd (qvd);

Se pot utiliza fișiere (QVD) și pentru a stoca dimensiuni „conforme”. De


exemplu, se poate stoca dimensiunea Clienți într-un fișier QVD și se utilizează
acest fișier în orice aplicație care utilizează informații despre clienți. Astfel se
asigură consistența dintre aplicații.
Fișierele QVX (Qlikview data eXchange files) sunt utilizate pentru încărcarea
datelor din alte sisteme (de exemplu, aplicații SAP) în Qlikview. Principala
diferență față de (QVD) este că (QVX) este un format public și poate fi creat din
interfețe externe.

3.3.7.Realizarea joncțiunilor
Pentru a realiza joncțiuni se utilizează clauza JOIN a comenzii LOAD. Se
realizează o joncțiune de tip outer join (joncțiune externă completă) pe atributele
care au aceeași denumire. Se consideră următorul exemplu:
1. Se va crea un document Qlikview: Jonctiuni.qvw
2. Se selectează din meniu, opțiunea File/Edit Script și se va crea următorul
script:
Tari:
LOAD * INLINE [
Tara, Vanzari_realizate,Vanzari_Preconizate
USA, 1000,800
UK, 800,800
Germania, 900, 700
];

Join LOAD * INLINE [


Tara, Costuri
USA, 800
UK, 800
Italia, 1000
];

3. Se salvează și apoi se execută scriptul;


4. Se poate crea o caseta de tip tabelă (table box) în pagină, sau se selectează
opțiunea File/Table Viewer pentru a deschide fereastra Table Viewer. S-a
preferat crearea unei casete de tip tabelă pentru a vizualiza rezultatul
joncțiunii:
34
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Rezultatul:

Se pot crea următoarele tipuri de joncțiuni: INNER JOIN, OUTER JOIN


(joncțiune externă completă), LEFT JOIN și RIGHT JOIN:

INNER JOIN (joncțiune de egalitate)

Rezultatul:

LEFT JOIN (joncțiune externă stânga)

Rezultatul:

RIGHT JOIN (joncțiune externă dreapta)

Rezultatul:

35
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

3.3.8. Concatenarea surselor de date


Dacă două seturi de date au o structură identică, conțin exact aceleași atribute
(număr de atribute și denumiri), Qlikview le va concatena automat și le va trata ca
o singura tabelă logică (concatenare naturală/implicită). Ordinea în care atributele
sunt definite în scriptul de încărcare nu este relevantă pentru concatenarea naturală.
Se poate utiliza și clauza CONCATENATE pentru a concatena două seturi de
date:
1. Se selectează din meniu, opțiunea File/Edit Script. Se va crea un nou tab
Concatenare;
2. Se va crea următorul script (scripturile anterioare se vor comenta):
Tari:
LOAD * INLINE [
Tara, Vanzari_realizate,Vanzari_Preconizate
USA, 1000,800
UK, 800,800
Germania, 900, 700
];

concatenate LOAD * INLINE [


Tara, Costuri
USA, 800
UK, 800
Italia, 1000
];

3. Se salvează și se execută scriptul;


4. Se selectează din meniu, opțiunea File/Table Viewer sau se va crea o
casetă de tip tabelă, în pagina de lucru, pentru a afișa rezultatul
concatenării.

Rezultatul:

Rândurile din al doilea set de date au fost adăugate la primul set de date. Se
poate preciza între paranteze care este setul de date la care se face concatenarea.

36
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Când două seturi de date au aceleași atribute, se vor concatena automat. Se


consideră următorul script:
Tari1:
LOAD * INLINE [
Tara, Vanzari_realizate,Vanzari_Preconizate
USA, 1000,800
UK, 800,800
Germania, 900, 700
];

Tari2:
LOAD * INLINE [
Tara, Vanzari_realizate,Vanzari_Preconizate
Italia, 1000,800
Romania, 800,800
Spania, 900, 700
];

Rezultatul scriptului este un singur set de date:

În cazul în care dorim să evităm comportamentul implicit în cazul concatenării


naturale, se poate adăuga clauza NOCONCATENATE la comanda LOAD pentru
al doilea set de date. QlikView le tratează ca tabele logice diferite, în modelul de
date. De exemplu, se precizează în comanda LOAD pentru Tari2, clauza
NOCONCATENATE:

Tari1:
LOAD * INLINE [
Tara, Vanzari_realizate,Vanzari_Preconizate
USA, 1000,800
UK, 800,800
Germania, 900, 700
];

Tari2:
noconcatenate LOAD * INLINE [
37
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Tara, Vanzari_realizate,Vanzari_Preconizate
Italia, 1000,800
Romania, 800,800
Spania, 900, 700
];

Se va deschide File/Table Viewer și se observă că s-a creat o tabelă logică


$Syn1Table, precum și o cheie sintetică $Syn1 (figura 3.83).

Figura 3.83. Utilizarea opțiunii NONCONCATENATE

3.3.9. Dimensiune Timp în modelul asociativ


Timpul este foarte important în analiză, respectiv în aplicațiile BI. Am văzut în
paragrafele anterioare cum se creează dimensiunea Timp într-un model
dimensional. În cele ce urmează, vom prezenta modul cum se poate crea o tabelă
logică Timp, în modelul asociativ. Tabela logică Vânzări conține atributul Data. La
încărcarea ei în model, se vor ordona rândurile, după valorile atributului Data:
LOAD ArtID as ARTID, VanzID, CodClient, AgentID, cantitate, Vanzarea, Data
FROM exemplu.xlsx (ooxml, embedded labels, table is Vanzari) ORDER BY Data
ASC;

Pentru a crea o tabelă logică Timp se parcurg următorii pași:


1. Se deschide documentul Qlikview exemplu.qvw;
2. Se va crea un nou tab Timp, după tab-ul surse de date Excel;
3. Se stabilește valoarea minimă, respectiv valoarea maximă pentru atributul
Data. Se va utiliza funcția Peek() care va returna valoarea atributului Data

38
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

din prima înregistrare/ultima înregistrare. Aceste valori vor fi stocate în


două variabile: varMinDate și varMaxDate:
Let varMinDate = Num(Peek('Data',0,'Vanzari'));
Let varMaxDate = Num(Peek('Data',-1,'Vanzari'));
4. Se va crea o tabelă logică temporară TempTimp pentru care se vor genera
automat rânduri, utilizând comanda Autogenerate. Fiecare rând conține un
element de dată (figura 3.84);
TempTimp:
Load
date($(varMinDate) + rowno()-1) As TempData
Autogenerate
$(varMaxDate)-$(varMinDate) + 1;

Figura 3.84. Tabela logică TempTimp

4. Se va crea tabela logică Timp. Se vor încărca elementele de dată din tabela
temporară TempTimp și pentru fiecare element de dată se vor utiliza
diferite funcții calendaristice pentru a extrage o serie de informații utile,
cum ar fi: săptămâna, luna, anul corespunzător, denumirea zilei, prima zi
din săptămâna din care face parte elementul de dată, ultima zi din
săptămâna din care face parte elementul de dată, etc:

39
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Timp:
Load
TempData As Data,
Week(TempData) As Saptamana,
Month(TempData) As Luna,
Year(TempData) As An,
Week (TempData) & '-'& Year(TempData)as SaptamanasiAn,
WeekDay(TempData) as denumire_zi,
WeekStart(TempData, 0, 0) AS prima_zi_sapt,
WeekEnd(TempData, 0, 0) AS ultima_zi_sapt,
Weekyear(TempData) as anul_pt_sapt,
Month(TempData) & '-' &Year(TempData) AS LunasiAn,
MonthStart(TempData) as prima_zi_luna,
MonthEnd(TempData) as ultima_zi_luna,
'Trim' &Ceil(Month(TempData)/3) AS Trimestru,
QuarterStart(TempData) as prima_zi_trim,
QuarterEnd(TempData) as ultima_zi_trim,
YearEnd(TempData) as ultima_zi_an,
DayNumberOfYear(TempData) as numartotalzile
resident TempTimp
ORDER BY TempData ASC;
//se sterge tabela temporara
DROP TABLE TempTimp;

Se salvează, apoi se execută scriptul. În modelul de date s-a creat tabela logică
Timp asociată cu tabela logică Vanzari (figura 3.85.)

40
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.85. Tabela logică Timp

3.3.10. Utilizarea datelor existente în paginile Web


Se pot încărca în model, seturi de date existente în paginile Web. De exemplu,
putem prelua cursul valutar de pe site-ul BNR [http://www.bnr.ro/Cursul-de-
schimb-524.aspx]. Se pot descărca seturile de date și ca fișiere: csv, Excel, HTML,
XML (figura 3.86.)

41
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.86. Utilizarea unei pagini Web

Se parcurg următorii pași:


1. Se deschide Qlikview și se va crea un nou document : sursaWeb.qvw;
2. Se selectează din meniu, opțiunea File/Edit Script. Se deschide fereastra
Script editor. Click pe butonul Web Files pentru a genera scriptul de
încărcare. Se deschide fereastra File Wizard: Source și vom selecta
butonul Internet File, apoi vom tasta:
http://www.bnr.ro/Cursul-de-schimb-524.aspx (figura 3.87);
3. Click pe butonul Next;
4. Se deschide fereastra File Wizard: Type, în care apar datele. Observăm că
nu se încarcă corect, de exemplu în coloana 6.mar.2014 apar simbolurile
monedelor. Click pe butonul Next (figura 3.88);
5. Se deschide fereastra File Wizard: Transform. Click pe butonul Enable
Tranformation Step. Se va deschide fereastra File Wizard: Tranform
(figura 3.89, figura 3.90) ;
6. Se va modifica header-ul pentru coloana în care apar simbolurile și pentru
ultima coloană (tab-ul Column și butonul Label) (figura 3.91);
7. Apoi, selectăm butonul Rotate și butonul Transpose. Se vor inversa liniile
cu coloanele. Observăm că pe al doilea rând apar simbolurile. Le putem
șterge (figura 3.92).

42
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.87. Fereastra File Wizard: Source

Figura 3.88. Fereastra File Wizard: Type

43
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.89. Fereastra File Wizard: Transform-Enable Transformation Step

Figura 3.90. Fereastra File Wizard: Transform


44
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.91. Fereastra File Wizard: Transform, tab-ul Column

Figura 3.92. Fereastra File Wizard: Transform, tab-ul Rotate


45
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Selectăm tab-ul Garbage (figura 3.93) şi click pe butonul Conditional delete.


Se deschide fereastra Specify Row Condition. Selectăm condiţia Range, apoi
selectăm opţiunile From, To şi Select fără să modificăm setările. Se va activa
butonul Add. În fereastra de condiţii (figura 3.94) apare automat următoarea
expresie: RowCnd(Interval, Pos(Top, 1), Pos(Top, 1), Select(1, 0)). Click pe
butonul OK pentru a salva modificările, apoi pe butonul Finish pentru a genera
scriptul de încărcare.
Vom schimba și eticheta pentru prima coloană, în loc de simbol tastăm Data:
LOAD Data, AUD, BGN, CAD, CHF, CZK, DKK, EGP, EUR, GBP, HUF, JPY,
MDL, NOK, PLN, RUB, SEK, TRY, USD, ZAR, BRL, CNY, INR, KRW, MXN,
NZD, RSD, UAH, AED, XAU, XDR FROM [http://www.bnr.ro/Cursul-de-schimb-
524.aspx]
(html, codepage is 1252, embedded labels, table is @1, filters(
Top(2, 'simbol'), Top(7, '6 mar.2014'), Transpose(),
Remove(Row, RowCnd(Interval, Pos(Top, 1), Pos(Top, 1), Select(1, 0))),
Top(1, 'Data')
));

Figura 3.93. Fereastra File Wizard: Transform, tab-ul Garbage

46
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.94 Fereastra Specificy Row Condition

De asemenea, trebuie să modificăm setările regionale pentru data calendaristică,


pentru a corespunde cu formatul BNR:
SET ThousandSep='.';
SET DecimalSep=',';
SET MoneyThousandSep='.';
SET MoneyDecimalSep=',';
SET MoneyFormat='$#,##0.00;($#,##0.00)';
SET TimeFormat='hh:mm:ss';
SET DateFormat='DD MMM.YYYY';
SET TimestampFormat='DD/MM/YYYY hh:mm:ss[.fff]';
SET MonthNames='ian;feb;mar;apr;mai;iun;iul;aug;sep;oct;noi;dec';
SET DayNames='Lun;Mar;Mie;Joi;Vin;Sam;Dum';

Se salvează documentul sursaWeb.qvw și apoi se execută scriptul. Putem crea


un obiect de tip tabelă sau un grafic de tip linie pentru evoluția cursului valutar.

Rezultatul:

47
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

3.3.11. Chei sintetice, dependențe circulare, tabele de


legătură
Când două seturi de date au mai multe atribute comune, se creează automat o
cheie compusă numită cheie sintetică. Prezența cheilor sintetice în modelul de date,
poate afecta performanța aplicației (un timp de răspuns mai mare). De asemenea,
modelul devine mai dificil de înțeles. De aceea, cheile sintetice trebuie evitate.
În exemplu de mai jos, cele două seturi de date Vanzari.csv și Calendar.csv au
două atribute comune: trimestru și luna. Se creează o cheie formată din combinația
celor două atribute ($Syn1). În model, apare o nouă tabelă logică denumită $Syn 1
Table care stochează toate combinațiile de valori pentru cele două atribute care
formează cheia sintetică. Această tabelă logică asigură legătura dintre cele două
seturi de date. Fișierul Vanzari.csv are următoarea structură:
Trimestru,Luna,Prodid,Cantitate
1, 1, 1, 12
1, 2, 1, 10
1, 3, 1, 11
2, 4, 1, 15
1, 1, 2, 60
1, 2, 2, 90
3, 8, 1, 10
3, 9, 2, 20

Fișierul Calendar.csv are următoarea structură:


Luna,DenumireLuna,Trimestru
1,Ianuarie,1
2,Februarie,1
3,Martie,1
4,Aprilie,2
5,Mai,2
6,Iunie,2
7,Iulie,3
8,August,3
9,Septembrie,3
48
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

10,Octombrie,4
11,Noiembrie,4
12,Decembrie,4

Se parcurg următorii pași:


1. Se selectează din meniu, opțiunea File/Edit Script;
2. Click pe butonul Table files și se selectează fișierul vanzari.csv. Se
deschide fereastra File Wizard Type și se selectează în caseta Labels:
Embedded Labels;
3. Click pe butonul Finish. Se va genera următorul script:
Vanzari: Directory;
LOAD Trimestru, Luna, Prodid, Cantitate
FROM vanzari.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);

Se repetă pașii și pentru fișierul Calendar.csv. Se va genera următorul script:


Calendar:
LOAD Luna, DenumireLuna, Trimestru
FROM calendar.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);

Se salvează și se execută scriptul. Modelul creat este prezentat în figura 3.95.

Figura 3.95.Generarea cheilor sintetice

Pentru a șterge cheile sintetice există următoarele metode:


1. Se pot redenumi acele atribute care apar în cheia sintetică, dar care ar putea
să nu fie o parte a asocierii dintre cele două seturi de date;
2. Se pot șterge atributele comune dintr-un set de date (se șterg de fapt din
scriptul de încărcare);

49
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

3. Se poate crea o cheie compusă prin concatenarea tuturor atributelor


comune care reprezintă asocierea dintre cele două seturi de date. Apoi se
șterg atributele comune din scriptul de încărcare.
Pentru exemplu nostru, vom utiliza ultima metodă și vom crea o cheie compusă
formată din atributele comune Trimestru și Luna. Apoi vom șterge atributele
comune din setul de date Vanzari, dar le vom păstra în setul de date Calendar.
Scriptul se va modifica astfel:
Vanzari:
LOAD Trimestru&'|'&Luna as TrimLuna, Prodid, Cantitate
FROM vanzari.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
Calendar:
LOAD Trimestru&'|'&Luna as TrimLuna, Luna, DenumireLuna, Trimestru
FROM calendar.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);

S-a utilizat (&) pentru a crea cheia compusă și un alias pentru denumirea ei.
Tabela $Syn1table, precum și cheia sintetică au fost eliminate (figura 3.96).

Figura 3.96. Eliminarea cheilor sintetice

Dependențe circulare
Se consideră următoarele fișiere (csv):
Vazari.csv:
An, Luna, Prodid, Cantitate
2000, 1, 1, 12
2000, 2, 1, 10
2000, 3, 2, 11
2000, 4, 3, 15
2001, 1, 1, 60
2001, 2, 2, 90
2001, 3, 1, 10
2001, 4, 3, 20

Produse.csv:
Prodid, denumire, categorieID
1, produs A,1
50
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

2, produs B,1
3, produs C,2

Buget.csv
categorieID,An,valoare
1, 2000, 2500
1, 2001, 1900
2, 2000, 2000
2, 2001, 1500

Se parcug următorii pași:


1. Se creează un document: dependente circulare.qvw;
2. Se selectează opțiunea File/Edit script și se încarcă cele trei surse. Se va
crea următorul script:
Vanzari:
LOAD An, Luna, prodid, Cantitate
FROM vanzari1.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
Buget:
LOAD categorieID, An, valoare
FROM buget.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
Produse:
LOAD prodid, denumire, categorieID
FROM produse.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);

3. Se salvează și apoi se execută scriptul. În urma execuției apare următorul


mesaj:
„One or more loops have been detected in your database structure. Loops may
cause ambiguous results and should therefore be avoided. QlikView will cut the
loop(s) by setting one or more tables as loosely coupled. Settings for loosely
coupled tables can be modified after script execution in the tables page of the
document properties dialog.”

Iar modelul arată astfel (figura 3.97):

51
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.97. Dependențe circulare

Se creează dependențe circulare. Tabela logică Produse este asociată direct cu


tabela logică Buget prin atributul categorieID și indirect prin tabela logică Vanzari.
Tabela logică Vanzari este asociată cu tabela logică Buget prin atributul An și cu
tabela logică Produse prin atributul prodid. Datele formează o anomalie: Produsul
A (prodid=1) este vândut în anul 2000 în lunile ianuarie și februarie. Vânzările din
2000 sunt asociate cu bugetul din 2000 și avem două bugete pentru categoria 1 și
categoria 2, deci produsul A se asociază cu categoria 1, dar și cu categoria 2, ceea
ce nu este corect.
Pentru a evita rezultate incorecte, Qlikview setează una sau mai multe tabele ca
fiind “loosely coupled-cuplate slab” și afișează un mesaj de atenționare. În exemplu
nostru, tabela logică Vanzari este “slab cuplată” cu tabela Produse și tabela Buget,
ceea ce înseamnă că deducția logică nu poate fi propagată prin aceasta tabelă. În
fereastra Document properties (opțiunea Settings/Document properties) se
poate stabili care tabelă este utilizată ca tabelă “slab cuplată” (figura 3.98). În
funcție de ce tabelă alegem, vom obține rezultate diferite din deducția logică.

52
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.98. Fereastra Document properties

De ce apare dependența circulară? În exemplu nostru, din cauza că cele două


tabele logice Vanzari și Buget au granularități diferite. Bugetul este la nivel de an și
categorie de produse, iar vânzările sunt la nivel de lună, an și produs. Ele se
asociază cu tabela logică Produse la nivele de granulație diferite (prodid respectiv
categorieid). Este o situație des întâlnită atunci când în modelul asociativ se
încarcă multiple tabele de fapte cu granularități diferite și care au mai multe
dimensiuni comune. Pentru a elimina dependențele circulare, o soluție ar fi
concatenarea celor două tabele cu ajutorul cheilor generice. În locul cheii prodid a
tabelei logice Produse se utilizează chei generice. Aceste chei se vor crea ținând
cont de faptul că un produs face parte dintr-o anumită categorie. Se utilizează
funcția applymap().
Scriptul modificat:
Produse:
Load prodid, denumire, categorieID from produse.csv
(txt, codepage is 1252, embedded labels, delimiter is ',', msq);
Prodid_to_categorieID:
Mapping Load prodid, categorieID resident Produse;
//se concatenează cele două tabele logice Vanzari și Buget
Tabela:

53
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Load Cantitate,An, Luna,


Applymap('Prodid_to_categorieID', prodid, null()) &'|'& prodid as %prodid,
'vanzari' as type
FROM vanzari.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
// se utilizează chei generice, dar și simbolul N/A pentru nivelul de detaliu:
Concatenate (Tabela) load valoare, An,
categorieID & '|' &'N/A' as %prodid, 'buget' as type
from buget.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
// se creează o tabelă de legătură care va asocia tabela Produse cu cele două
tabele Vanzari și Buget
[Produse link tabela]:
Load distinct categorieID &'|'&prodid as %prodid, categorieID, prodid
resident Produse;
Load distinct categorieID &'|'&'<N/A>' as %prodid, categorieID, Null() as prodid
resident Produse;
Drop field categorieID from Produse;

În unele cazuri trebuie să utilizam aceeași sursă de date de mai multe ori, în
timpul execuției scriptului. Pentru că sursa este deja încărcată în RAM, se poate
accesa utilizând opțiunea RESIDENT LOAD.
Clauza MAPPING a comenzii LOAD/SELECT se utilizează pentru a crea o
tabelă de mapare temporară. O tabelă de mapare e formată din două coloane: prima
coloană conține valorile de comparație (de exemplu, denumirea tabelei/atributului)
și a doua coloană conține valorile dorite pentru mapare (de exemplu, categoria de
produse). Tabele de mapare sunt stocate temporar în RAM, apoi sunt șterse
automat după execuția scriptului. Conținutul unei tabele de mapare poate fi accesat
utilizând: funcția applymap(), funcția mapsubstring(), comanda
MAP/RENAME. O tabelă de mapare poate fi utilizată și pentru a înlocui valorile
atributelor sau denumirea atributelor, în timpul execuției scriptului.
Modelul rezultat este prezentat în figura 3.99. În figura 3.100 se afișează
conținutul tabelei Tabela.

Figura 3.99. Utilizarea cheilor generice

54
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.100. Tabela rezultată prin concatenare

Cheile generice conțin informații atât despre nivelele superioare cât și despre
cele inferioare ale ierarhiei (prodid>categorieid) și pot fi utilizate fie numai pentru
nivelul superior sau pentru ambele nivele ale ierarhiei. În acest mod se va realiza o
asociere corectă între înregistrările din tabela rezultată prin concatenare și tabela
logică Produse (înregistrările din tabela logică Vanzari se leagă la nivel de produs,
iar înregistrările din tabela logică Buget se leagă la nivel de categorie și nu la nivel
de produs). Cheile generice trebuie să fie mapate la cheile reale, utilizând tabela de
legătură Produse link tabela (figura 3.101).

55
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Figura 3.101. Tabela de legătură Produse link tabela

Așa cum am văzut în exemplele anterioare, se pot extrage și încărca date din
baze de date relaționale tranzacționale, cu o structură normalizată. Dar, sursa de
date poate fi și un depozit de date cu o structură stea/fulg de zăpadă/combinații cu
una sau mai multe tabele de fapte și multe tabele dimensionale. În cazul în care
modelul dimensional este o simplă schemă stea /fulg de zăpadă, cu o singură tabelă
de fapte, modelul asociativ creat are o structură identică cu schema stea/fulg de
zăpadă sursă. Situația se schimbă atunci când modelul dimensional include
multiple tabele de fapte cu dimensiuni comune. La încărcarea acestor tabele de
fapte, Qlikview va genera chei sintetice, tabele sintetice și uneori dependențe
circulare care trebuie evitate fie prin:
1. concatenarea tabelelor de fapte;
2. crearea unei tabele de legătură. Tabela de legătură este o soluție bună
pentru acele modele în care avem mai multe tabele de fapte cu granulații
diferite. În acest caz, modelul asociativ trebuie să aibă structura din figura
3.102;

În următorul exemplu, vom simula cazul a două tabele de fapte cu două


atribute comune și conectate la o dimensiune comună. Vom utiliza următoarele
fișiere (csv):

56
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

Vanzari.csv:
An, Luna, Prodid, Cantitate
2000, 1, 1, 12
2000, 2, 1, 10
2000, 3, 2, 11
2000, 4, 3, 15
2001, 1, 1, 60
2001, 2, 2, 90
2001, 3, 1, 10
2001, 4, 3, 20

Produse.csv:
Prodid, denumire, categorieID
1, produs A,1
2, produs B,1
3, produs C,2

Buget.csv
An, prodid, valoare
2000, 1, 2500
2000, 2, 1900
2000, 3, 2000
2001, 1, 1500
2001, 2, 1000
2001,3, 500

Tabela
3. de fapte Tabela
dimensională
Tabela de legătură

Tabela de fapte
Tabela
dimensională

Tabela
dimensională

Figura 3.102. Utilizarea tabelei de legătură

Se parcurg următorii pași:


1. Se creează un nou document: Tabele_de_legatura.qvw;

57
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

2. Se selectează opțiunea File/Edit script și se vor încărca sursele de mai sus.


Se va genera următorul script:
Vanzari:
LOAD An, Luna, prodid, Cantitate
FROM vanzari.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
Buget:
LOAD An, prodid, valoare
FROM buget.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
Produse:
LOAD prodid, denumire, categorieID
FROM produse.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);

Se salvează și apoi se execută scriptul. Modelul de date creat este prezentat în


figura 3.103.

Figura 3.103. Modelul asociativ creat

Observăm că s-a creat o tabelă sintetică $Syn1 Table cu atributele $Syn1, prodid
și An. Atributele prodid și An sunt comune tabelelor logice Buget și Vanzari.
Pentru a elimina cheia sintetică, vom utiliza o tabelă de legătură. Tabela de legătură
conține toate combinațiile posibile de valori pentru setul de atribute comune și
printr-o cheie unică este asociată la tabelele originale. De asemenea, se va crea o
cheie compusă pentru a asocia cele trei tabele logice. Cheia compusă este obținută
prin concatenarea câmpurilor comune (An&'|'&prodid as cheie). Apoi se vor șterge
atributele comune din model. Scriptul se va modifica astfel:

Vanzari:
Load An&'|'&prodid as cheie, Cantitate, Luna, An, prodid

58
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

FROM vanzari.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
Buget:
Load An&'|'&prodid as cheie, valoare, An, prodid
FROM buget.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
//se utilizează clauza DISTINCT pentru a elimina duplicatele
Legatura:
Load distinct An&'|'&prodid as cheie, An, prodid
resident Vanzari;
concatenate(Legatura)
Load distinct An&'|'&prodid as cheie, An, prodid
resident Buget where not exists (cheie);
Produse:
LOAD prodid, denumire, categorieID
FROM produse.csv (txt, codepage is 1252, embedded labels, delimiter is ',', msq);
drop fields An, prodid from Vanzari;
drop fields An, prodid from Buget;

Se salvează și se execută scriptul. Modelul reproiectat este prezentat în figura


3.104. Cheia sintetică a fost ștearsă și tabelele logice Vanzari și Buget sunt acum
asociate la tabela logică Produse indirect prin tabela de legătură.

Figura 3.104. Modelul reproiectat

Se pune următoarea întrebare: Care dintre cele două metode este mai bună:
concatenarea sau utilizarea tabelelor de legătură? Când lucrăm cu seturi mici de
date, ambele metode sunt bune, dar dacă avem seturi mari de date trebuie să ținem
cont de dimensiunea tabelelor de fapte. Din punct de vedere al performanței, este
mai eficient de a concatena tabelele de fapte, se evita încărcarea în memorie a unei
59
Mihaela Muntean, Ana-Ramona Bologa
Business Intelligence. Teorie și practică, editura ASE, 2015, ISBN 978-606-
505-858-3

noi tabele cu milioane de înregistrări. Dacă tabelele de fapte au însă granularități


diferite, trebuie să utilizăm chei generice. În modele de date complexe se utilizează
totuși o abordare hibridă: tabelele de legătură păstrează modelul mai ușor de
înțeles, pe de altă parte concatenarea este o metodă mai simplistă, cu performanțe
excelente, în special în cazul volumelor mari de date.
În proiectarea unui model de date asociativ trebuie să ținem cont de următorii
factori: timpul de răspuns, consumul RAM, timpul de execuție a scriptului,
flexibilitatea modelului și complexitatea scriptului.
……………………………………………..

60

S-ar putea să vă placă și