TUTORIEL · QLIK SENSE

Resident Load ou Preceding Load ?

Deux façons d’enchaîner des transformations dans Qlik Sense : suivez les données pas à pas et voyez quand utiliser chacune.

Le problème à résoudre

Resident Load et Preceding Load permettent tous les deux d’enchaîner plusieurs étapes de transformation. Pour bien voir leur différence, nous allons résoudre exactement le même besoin avec les deux méthodes.

Le fichier VENTES.qvd contient les données suivantes :

ID_VENTEDATE_TEXTEQUANTITEPRIX_UNITAIRE
V0012026-09-15225
V0022026-09-16340
V0032026-09-17175

Objectif : interpréter DATE_TEXTE, calculer CA_LIGNE et produire une date DATE_VENTE.

Nous conserverons le même besoin dans les chapitres suivants : seule la façon d’enchaîner les transformations changera.

DATE_TEXTEdate présente dans la source
CA_LIGNEQUANTITE × PRIX_UNITAIRE
DATE_VENTEdate finale

Resident Load : créer puis relire une table

Avec Resident, la première étape crée réellement une table dans Qlik. Une seconde instruction LOAD peut ensuite relire cette table et poursuivre les transformations.

Enchaînement : VENTES.qvd → VENTES_TMP → VENTES.

  1. Le premier LOAD lit le QVD et crée la table VENTES_TMP.
  2. Le second LOAD utilise Resident VENTES_TMP pour poursuivre les transformations.
  3. DROP TABLE VENTES_TMP supprime la table temporaire lorsqu’elle n’est plus utile.

Le mot important est « Resident » : la source du second LOAD réside déjà dans la mémoire de l’application Qlik.

Exemple · Même transformation avec Resident Load

// ÉTAPE 1 — création d'une table intermédiaire
VENTES_TMP:
LOAD
    ID_VENTE,
    Date#(DATE_TEXTE, 'YYYY-MM-DD') AS DATE_BRUTE,
    QUANTITE,
    PRIX_UNITAIRE,
    QUANTITE * PRIX_UNITAIRE AS CA_LIGNE
FROM [lib://Donnees/VENTES.qvd] (qvd);

// ÉTAPE 2 — on relit la table déjà chargée
VENTES:
LOAD
    ID_VENTE,
    Date(DATE_BRUTE, 'DD/MM/YYYY') AS DATE_VENTE,
    CA_LIGNE
Resident VENTES_TMP;

// ÉTAPE 3 — la table intermédiaire n'est plus utile
DROP TABLE VENTES_TMP;
VENTES_TMPexiste réellement dans Qlik
Residentrelit une table déjà chargée
DROP TABLEretire la table temporaire

Preceding Load : faire remonter les données

Avec un Preceding Load, il n’y a pas de table intermédiaire nommée. Le résultat du LOAD inférieur est transmis directement au LOAD placé juste au-dessus.

Les instructions LOAD sont écrites l’une au-dessus de l’autre. Pour comprendre leur exécution, il faut les lire de bas en haut.

  1. Le LOAD inférieur lit VENTES.qvd et calcule DATE_BRUTE et CA_LIGNE.
  2. Le résultat est transmis directement au LOAD supérieur.
  3. Le LOAD supérieur construit DATE_VENTE. Aucune table intermédiaire nommée n’est créée.

Dans le fichier script, le LOAD supérieur est écrit en premier. Dans le flux de données, c’est pourtant le LOAD du bas qui commence le travail.

Exemple · La même transformation avec un Preceding Load

// ÉTAPE 2 — ce LOAD reçoit le résultat du LOAD inférieur
VENTES:
LOAD
    ID_VENTE,
    Date(DATE_BRUTE, 'DD/MM/YYYY') AS DATE_VENTE,
    CA_LIGNE;

// ÉTAPE 1 — celui-ci s'exécute d'abord
LOAD
    ID_VENTE,
    Date#(DATE_TEXTE, 'YYYY-MM-DD') AS DATE_BRUTE,
    QUANTITE * PRIX_UNITAIRE AS CA_LIGNE
FROM [lib://Donnees/VENTES.qvd] (qvd);
LOAD inférieurs’exécute en premier
Résultatremonte au LOAD supérieur
Table temporaireaucune table nommée

Même résultat, deux chemins

Resident et Preceding aboutissent ici au même résultat. Mais les deux solutions ne sont pas équivalentes en termes de simplicité : dans ce cas précis, le Preceding Load est le choix le plus naturel.

Les deux méthodes produisent ici le même résultat, mais leur fonctionnement diffère :

CritèreResident LoadPreceding Load
EnchaînementUne table est créée puis relue.Le résultat passe directement d’un LOAD à l’autre.
Table intermédiaireVENTES_TMP existe en mémoire.Aucune table intermédiaire nommée.
Cas adaptéÉtape à conserver ou à réutiliser.Transformations successives et linéaires.

Dans cet exemple, Preceding Load est le plus simple : la table temporaire ne servirait qu’une fois.

Résultat obtenu dans les deux cas :

ID_VENTEDATE_VENTECA_LIGNE
V00115/09/202650
V00216/09/2026120
V00317/09/202675

Ici, choisissez Preceding : le traitement est linéaire et aucune étape intermédiaire n’a besoin d’être conservée ou réutilisée.

Résultat finalidentique dans cet exemple
Residenttable intermédiaire
Precedingchaîne directe

Quand Resident devient plus naturel

Preceding est très pratique pour une chaîne linéaire. Resident devient particulièrement intéressant lorsque la même étape intermédiaire doit être relue, agrégée ou servir à plusieurs traitements.

Une table intermédiaire peut servir à plusieurs traitements. Par exemple, VENTES_TMP peut alimenter :

  • un calcul de chiffre d’affaires par vente ;
  • une agrégation par mois ;
  • un contrôle ou une autre transformation.

Dans ce cas, Resident Load permet de réutiliser les données préparées sans répéter le chargement initial. Il peut aussi être combiné avec un Preceding Load, comme dans l’exemple ci-dessous.

Ici, matérialiser VENTES_TMP a un véritable intérêt : la même étape préparée sert plusieurs fois. On combine ici Resident et Preceding : le champ MOIS est préparé avant le GROUP BY, qui doit porter sur un nom de champ.

Exemple · Une table intermédiaire réutilisée

// VENTES_TMP a été créée au chapitre 2 :
// ID_VENTE, DATE_BRUTE, QUANTITE, PRIX_UNITAIRE, CA_LIGNE.

CA_Vente:
LOAD
    ID_VENTE,
    Sum(CA_LIGNE) AS CA_VENTE
Resident VENTES_TMP
GROUP BY ID_VENTE;

// Le LOAD inférieur prépare le champ MOIS,
// le LOAD supérieur peut alors faire GROUP BY MOIS.
CA_Mois:
LOAD
    MOIS,
    Sum(CA_LIGNE) AS CA_MOIS
GROUP BY MOIS;
LOAD
    MonthStart(DATE_BRUTE) AS MOIS,
    CA_LIGNE
Resident VENTES_TMP;

// Une fois toutes les réutilisations terminées
DROP TABLE VENTES_TMP;
1 table sourceplusieurs traitements possibles
GROUP BYagrégation lisible
DROP TABLEaprès la dernière utilisation

Comment choisir ?

Resident et Preceding ne sont pas des concurrents. Ce sont deux outils différents pour organiser les transformations d’un script Qlik.

SituationApproche
Une seule transformation suffit.Un seul LOAD.
Plusieurs transformations se suivent directement.Preceding Load.
Une étape doit être conservée ou réutilisée.Resident Load.

Le bon réflexe : choisir la solution qui rend le chemin des données le plus facile à comprendre, sans ajouter d’étape inutile.

Un même script peut parfaitement utiliser Resident à un endroit et Preceding à un autre.

Exemple

Réflexe SOSBIUn seul LOAD si possible · Preceding pour une chaîne directe · Resident pour une étape matérialisée ou réutiliséela lisibilité du traitement reste prioritaire
1 LOADsi une seule étape suffit
Precedingtransformations en chaîne
Residentétape matérialisée ou réutilisée