· Par Équipe HeyData

Série : Fonctions et mots-clés méconnus de Qlik Sense : une série · article 9 sur 13

Merge, Add, Replace : le rechargement partiel dans Qlik Sense

Un rechargement complet efface toutes les tables et rejoue tout le script. Pour ajouter les commandes du jour, ou appliquer quelques modifications venues d’un journal, c’est beaucoup de travail pour peu de lignes. Le rechargement partiel garde les tables en mémoire et n’exécute que certaines instructions, marquées par trois préfixes : Add, Replace et Merge.

Cet article fait partie de notre série sur les fonctions et mots-clés méconnus de Qlik Sense. Il s’appuie sur l’aide Qlik ; les liens sont en fin d’article.

Ce qui s’exécute, et quand

En rechargement partiel, Qlik Sense conserve toutes les tables existantes et n’exécute que les LOAD et SELECT précédés de Add, Replace ou Merge. Les autres sont ignorés. Le qualificatif Only fait l’inverse : une instruction Add Only, Replace Only ou Merge Only ne s’exécute que lors d’un rechargement partiel.

Une matrice à trois lignes et deux colonnes, rechargement complet et rechargement partiel. Un LOAD simple est exécuté en rechargement complet et ignoré en partiel. Un LOAD préfixé par Add, Replace ou Merge est exécuté dans les deux cas. Un LOAD préfixé par Add Only, Replace Only ou Merge Only est ignoré en rechargement complet et exécuté en partiel.

Only réserve une instruction au rechargement partiel.

Les instructions de contrôle (SET, LET, IF, FOR…) s’exécutent dans les deux cas. Un rechargement partiel exige que l’application contienne déjà des données.

Add : ajouter des lignes

Add LOAD ajoute des lignes à une table existante : celle qui a les mêmes champs, ou celle désignée par Concatenate. En rechargement complet, il se comporte comme un LOAD ordinaire. En partiel, il ne crée jamais de table : la table cible doit exister.

Add ne vérifie pas les doublons. Un second rechargement partiel ajoute de nouveau les mêmes lignes, sauf si vous les écartez :

Add LOAD ID, Name, Score
FROM [lib://Data/NewPersons.csv] (txt, utf8, embedded labels, delimiter is ',')
WHERE NOT Exists(ID);

Replace : remplacer une table

Replace LOAD supprime la table existante puis la recharge. En partiel, la suppression est systématique. En rechargement complet, elle n’a lieu que si une table de mêmes champs existe déjà, ou si Concatenate en désigne une. C’est l’outil pour rafraîchir une petite table de référence, des taux de change par exemple, sans toucher aux faits.

Merge : appliquer un journal de modifications

Merge est le plus riche des trois. Il applique à une table existante une liste d’opérations : le premier champ du LOAD contient l’opération, Insert, Update ou Delete (ou i, u, d).

À gauche, la table Persons avant fusion, avec Anna 10, Ben 20 et Chloé 30. À droite, un journal de modifications : Insert 4 Dan 40, Update 2 Ben 25 et Delete 3. En dessous, Persons après Merge ON ID : Anna 10, Ben 25 et Dan 40 ; les lignes modifiée et ajoutée sont surlignées, la ligne 3 a disparu.

Insert ajoute, Update remplace, Delete retire.

Merge (ChangeDate, vLastChange) ON ID
LOAD Operation, ID, Name, Score, ChangeDate
FROM [lib://Data/ChangeLog.csv] (txt, utf8, embedded labels, delimiter is ',')
WHERE ChangeDate > '$(vLastChange)';
  • ON ID donne la clé primaire, éventuellement composée de plusieurs champs.
  • (ChangeDate, vLastChange) est facultatif. ChangeDate ordonne les opérations : pour une même clé, seule la plus récente compte. Après le chargement, la variable vLastChange reçoit la plus grande valeur de ChangeDate. C’est le point de départ du rechargement suivant, d’où la clause WHERE.
  • Update ne modifie que les champs présents dans le LOAD : les autres gardent leur valeur.
  • La table cible est celle qui a les mêmes champs, hors champ d’opération, ou celle désignée par Concatenate.

Merge fonctionne aussi en rechargement complet : il charge alors la table en ne gardant, pour chaque clé, que la dernière opération, et sans les lignes supprimées.

Déclencher un rechargement partiel

L’aide Qlik documente plusieurs moyens :

  • un bouton sur une feuille, avec l’action Recharger les données et l’option Rechargement partiel ;
  • dans Qlik Cloud, une planification de rechargement avec l’option Rechargement partiel activée ;
  • sur Qlik Sense Enterprise on Windows, une tâche de rechargement de la QMC, avec l’option Rechargement partiel de ses propriétés d’exécution ;
  • l’API du moteur (Qlik Engine JSON API).

Les pièges

  • Les tables absentes. Un LEFT JOIN ou un CONCATENATE vers une table qui n’existe qu’en rechargement complet fait échouer le partiel. Protégez-les avec IsPartialReload(), comme ci-dessous.
  • Les valeurs fantômes. Les valeurs supprimées par un rechargement partiel restent dans la liste interne des valeurs du champ jusqu’au prochain rechargement complet. FieldValueCount() et FieldValue() peuvent donc en compter plus qu’il n’en existe.
  • Les doublons d’Add. Sans WHERE NOT Exists() ni DISTINCT, chaque rechargement partiel ajoute de nouveau les mêmes lignes.
  • Pas de persistance. Le rechargement partiel travaille en mémoire. Pour un historique qui survit à un rechargement complet, le chargement incrémental avec des QVD reste la méthode de référence. Les deux se complètent.

Le garde-fou pour les tables absentes :

IF NOT IsPartialReload() THEN
    LEFT JOIN (Orders) LOAD OrderID, Region RESIDENT Regions;
END IF

À retenir

  • Partiel = tables gardées. Seuls les LOAD préfixés par Add, Replace ou Merge s’exécutent.
  • Only pour le partiel seul. Une instruction … Only est ignorée en rechargement complet.
  • Add n’écarte pas les doublons. Ajoutez WHERE NOT Exists().
  • Replace remplace toute la table. Utile pour une petite table de référence.
  • Merge applique Insert, Update, Delete. Avec une clé ON, et une variable de séquence pour repartir du dernier changement.
  • Protégez les jointures. IF NOT IsPartialReload() autour des instructions qui visent une table absente en partiel.

Essayer dans Qlik Sense

Ce script reprend les exemples de l’article avec les données des schémas, chargées en INLINE : il ne dépend d’aucun fichier ni d’aucune base. Collez-le dans l’éditeur de chargement de données d’une application vide, choisissez l’exemple avec la variable vExemple, puis rechargez.

// Merge, Add, Replace dans Qlik Sense : script d'essai (HeyData)
// Collez-le dans l'éditeur de chargement de données d'une application vide, choisissez
// l'exemple, rechargez, puis affichez les tables dans la visionneuse du modèle de données.
SET vExemple = 1;   // 1 à 4

Persons:
LOAD ID, Name, Score, Date(Date#(ChangeDate, 'YYYY-MM-DD')) as ChangeDate
INLINE [
ID, Name, Score, ChangeDate
1, Anna, 10, 2026-01-02
2, Ben, 20, 2026-01-02
3, Chloé, 30, 2026-01-02
];

IF $(vExemple) = 1 THEN
    // Exemple 1 : Merge applique un journal (deuxième schéma), ici en rechargement complet
    Merge (ChangeDate, vLastChange) ON ID
    LOAD Operation, ID, Name, Score, Date(Date#(ChangeDate, 'YYYY-MM-DD')) as ChangeDate
    INLINE [
    Operation, ID, Name, Score, ChangeDate
    Insert, 4, Dan, 40, 2026-01-05
    Update, 2, Ben, 25, 2026-01-05
    Delete, 3, , , 2026-01-05
    ];
    // Persons : 1 Anna 10, 2 Ben 25, 4 Dan 40 ; la variable vLastChange vaut le 2026-01-05.
END IF

IF $(vExemple) = 2 THEN
    // Exemple 2 : Add sans doublon
    Add LOAD ID, Name, Score, Date(Date#(ChangeDate, 'YYYY-MM-DD')) as ChangeDate
    INLINE [
    ID, Name, Score, ChangeDate
    3, Chloé, 30, 2026-01-02
    5, Eva, 50, 2026-01-06
    ]
    WHERE NOT Exists(ID);
    // Persons : 1, 2, 3 et 5 ; la ligne 3, déjà présente, n'est pas ajoutée une seconde fois.
END IF

IF $(vExemple) = 3 THEN
    // Exemple 3 : Replace remplace toute la table de mêmes champs
    Replace LOAD ID, Name, Score, Date(Date#(ChangeDate, 'YYYY-MM-DD')) as ChangeDate
    INLINE [
    ID, Name, Score, ChangeDate
    9, Zoé, 90, 2026-01-07
    ];
    // Persons ne contient plus que Zoé.
END IF

IF $(vExemple) = 4 THEN
    // Exemple 4 : observer un rechargement partiel
    // Ajoutez sur une feuille un bouton « Recharger les données » avec « Rechargement partiel »,
    // et une table ReloadType, ReloadTime. Chaque clic ajoute une ligne « Partiel ».
    ReloadLog:
    LOAD 'Complet' as ReloadType, Timestamp(Now()) as ReloadTime AUTOGENERATE 1;

    Add Only LOAD 'Partiel' as ReloadType, Timestamp(Now()) as ReloadTime AUTOGENERATE 1;
    // Un rechargement complet remet la table à une seule ligne « Complet ».
END IF

Sources

Le texte et les exemples sont de HeyData. Cet article fait partie de notre série sur les fonctions et mots-clés méconnus de Qlik Sense : découvrir la série.