Bonjour,
Pour faire simple, QlikView ne va pas utiliser votre base de données SQL Server à proprement parler.
En effet, QlikView travaille uniquement avec des données chargée en mémoire au moment du chargement (stockées ensuite dans le document QlikView, ou dans des fichiers dédiés).
Dans la phase "SQL Server", il ne sera donc à rien de trop dénormaliser votre modèle des données/faire des aggrégats, etc.
En effet, c'est dans QV que vous allez faire tout ça en convertissant votre modèle "1NF Compliant" en modèle en étoile, avec tables de faits et de dimensions.
Pour faire simple, la constitution d'un document QV se fait en deux étapes :
- Création du script de chargement
- Création des écrans d'analyse
Le script de chargement, c'est du bête SQL : vous faites des requêtes dont vous stockez le résultat dans des tables d'analyse (faits et dimensions).
Les relations entre table se font automatiquement sur les colonnes de même nom : attention à ça, c'est très important.
Le modèle est forcément en étoile. La moindre relation cyclique va provoquer une erreur lors du chargement des données. C'est vraiment la plus grosse contrainte de QV.
Voici un exemple d'extrait de script de chargement (pour vous faire une idée) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
Company:
LOAD
fi_id,
fi_name,
fi_postcode,
fi_city,
co_id
where exists (fi_id);
SQL
select
fi.id fi_id,
fi.firma fi_name,
fi.Plz fi_postcode,
fi.Ort fi_city,
la.code co_id
from $(prefix)fi fi
inner join $(prefix)la la on la.id = fi.land;
CompanySalesmen:
LOAD
fi_id,
id2_id,
id2_name
where exists (fi_id);
SQL
select
sb.id_fi fi_id,
id.id id2_id,
case when id.fname is not null and id.vname is not null then concat(concat(id.fname, ' '), id.vname) else id.bezeichnung end id2_name
from $(prefix)sb sb
inner join $(prefix)id id on id.id = sb.bezirksleiterid; |
Explication :
"Company:" singifie qu'on déclare une nouvelle table (ici, de dimension)
Ensuite, la liste suivante, c'est la liste des colonnes de la table :
fi_id,
fi_name,
fi_postcode,
fi_city,
co_id
where exists (fi_id);
Le "where exists (fi_id)" permet, indépendamment de la requête SQL, de ne charger que les compagnies pour lesquelles l'identifiant a déjà été chargé (dans une étape précédente, je charge l'ensemble des factures de la base, qui contiennent cette colonne, et donc je ne veux faire d'analyse que sur les clients qui ont au moins une facture)
SQL
select
fi.id fi_id,
fi.firma fi_name,
fi.Plz fi_postcode,
fi.Ort fi_city,
la.code co_id
from $(prefix)fi fi
inner join $(prefix)la la on la.id = fi.land;
=> Il s'agit de la commande SQL (ça aurait pu être une instruction pour charger un CSV par exemple)
Les variables $(xxx) sont déclarées en amont :
let prefix = 'TE_LSI_';
D'ailleurs, je rebondi sur la capacité de QlikView à :
- Lire des CSV
- Etre capable de produire des QVD
Et je réitère mes doutes quant à la nécessitée d'utiliser SSIS en amont du chargement des données.
Un fichier QV peut parfaitement se charger de consolider les données des CSV et autres bases sources dans un ou plusieurs QVD, qui seront ensuite utilisés comme source par le document QV final.
=> C'est ce que j'ai mis en place chez un client qui souhaitait analyser des données à partir de plusieurs outils, et ça fonctionne tout à fait.
Après, je dis pas que SSIS est complètement inutile ou une mauvaise option, mais clairement pas nécessaire, je pense.
Partager