· Par Équipe HeyData

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

Le préfixe Semantic dans Qlik Sense : naviguer de parent en enfant d’un clic

Dans un organigramme, on veut parfois avancer pas à pas : partir du service commercial, voir ses équipes, puis les agences de l’une d’elles. Hierarchy donne des niveaux et HierarchyBelongsTo des sous-arbres entiers, mais aucun des deux ne permet de « descendre d’un cran » depuis la sélection courante. C’est le rôle du préfixe Semantic, l’un des mots-clés les moins connus du script.

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, qui est à notre connaissance la seule documentation détaillée du préfixe ; les liens sont en fin d’article.

Le principe : une table de relations

Semantic se place devant un LOAD de trois ou quatre champs, dans un ordre fixe :

  1. un objet ;
  2. le nom de la relation, lue du premier objet vers le second ;
  3. l’objet lié ;
  4. facultatif : le nom de la relation dans l’autre sens.

Le préfixe crée un champ particulier, ici Relation, dont les valeurs sont les noms de relation. Sélectionner une de ces valeurs fait passer des objets sélectionnés aux objets liés.

Quatre cases décrivent les champs d’un LOAD Semantic : champ 1, l’objet, ID as ID ; champ 2, la relation aller, 'Parent' as Relation ; champ 3, l’objet lié, ParentID as ID ; champ 4, la relation retour, 'Child' as Relation. Les champs 1 et 3 sont surlignés car ils portent le même nom. En dessous, l’instruction complète et une table Org avec Commercial, ID 2, et France, ID 4 de parent 2 : en lecture aller, 4 a pour Parent 2 ; en lecture retour, 2 a pour Child 4.

Une ligne d’organigramme, lue dans les deux sens.

Org:
LOAD ID, Name, If(Len(ParentID), ParentID) as ParentID
INLINE [
ID, Name, ParentID
1, Direction,
2, Commercial, 1
3, Opérations, 1
4, France, 2
5, Allemagne, 2
6, Logistique, 3
7, Lyon, 4
8, Paris, 4
];

Relations:
Semantic
LOAD ID as ID, 'Parent' as Relation, ParentID as ID, 'Child' as Relation
RESIDENT Org;

Le détail qui compte : les champs 1 et 3 portent le même nom, ID, celui de la table Org. L’aide Qlik explique que c’est ce qui permet d’enchaîner les relations : le résultat d’un clic devient le point de départ du suivant. Avec deux noms différents, on n’obtient que les voisins directs, ce que l’aide juge de peu d’intérêt pratique.

Sur une feuille, placez une table avec ID et Name, et un volet de filtre sur Relation. Sélectionnez « Commercial », puis cliquez sur Child : la table ne montre plus que France et Allemagne. Un second clic sur Child descend encore : Lyon et Paris. Parent remonte d’un niveau.

Un organigramme : Direction, avec en dessous Commercial et Opérations ; sous Commercial, France et Allemagne ; sous France, Lyon et Paris ; sous Opérations, Logistique. Des pastilles numérotées marquent le parcours : 1, la sélection de Commercial ; 2, Relation égale Child, qui donne France et Allemagne ; 3, Relation égale Child une seconde fois, qui donne Lyon et Paris.

Chaque clic sur Child descend d’un niveau.

Capture de deux volets de filtre Qlik Cloud, Name et Relation. Dans Name, Commercial est sélectionné en vert ; les sept autres services sont en gris clair. Relation propose Child et Parent, en blanc.

Capture des mêmes volets de filtre après un clic sur Child. Dans Name, Allemagne et France sont en blanc, donc possibles ; Commercial, Direction, Logistique, Lyon, Opérations et Paris sont en gris foncé, exclus.

Dans Qlik Cloud : Commercial sélectionné, puis Relation = Child. Il ne reste que les deux services rattachés à Commercial.

C’est une navigation, pas une agrégation : Semantic ne calcule ni niveaux ni chemins. Pour sommer les ventes d’une branche entière, HierarchyBelongsTo reste l’outil adapté (voir notre article sur les hiérarchies).

Trois champs : une seule étiquette

Sans quatrième champ, le nom de la relation sert dans les deux sens. Qlik en fait alors deux valeurs fléchées, une par sens : remplacé par -> et <- remplacé par. C’est pratique pour une relation qui n’est pas un arbre, comme le remplacement d’un produit par un autre :

Succession:
Semantic
LOAD OldProduct as Product, 'remplacé par' as Relation, NewProduct as Product
INLINE [
OldProduct, NewProduct
P1, P2
P2, P3
];

Depuis P1, remplacé par -> mène à P2, puis à P3. Dans l’autre sens, <- remplacé par remonte vers les prédécesseurs. Rien n’oblige les relations à former un arbre : un produit peut remplacer deux références, un document peut en citer plusieurs. Semantic décrit un graphe, là où Hierarchy exige un seul parent par nœud.

Semantic ou Hierarchy ?

BesoinOutil
Des niveaux pour un tableau croisé, un cheminHierarchy
Sélectionner une branche entière, des droitsHierarchyBelongsTo
Avancer d’un niveau à la fois depuis un choixSemantic
Des relations qui ne forment pas un arbreSemantic

Les trois peuvent cohabiter dans la même application, sur la même table source.

À retenir

  • Un champ pour naviguer. Semantic crée un champ dont les valeurs, comme Parent et Child, déplacent la sélection vers les objets liés.
  • Trois ou quatre champs, dans l’ordre. Objet, relation, objet lié, puis la relation inverse si besoin.
  • Le même nom pour les objets. Les champs 1 et 3 doivent porter le même nom pour enchaîner les clics.
  • Un graphe, pas seulement un arbre. Plusieurs liens par objet sont permis.
  • Navigation, pas calcul. Pour les niveaux et les sous-arbres, Hierarchy et HierarchyBelongsTo restent les bons outils.

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.

// Le préfixe Semantic 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 créez une table et un volet de filtre sur Relation.
SET vExemple = 1;   // 1 à 3

IF $(vExemple) <> 2 THEN
    Org:
    LOAD ID, Name, If(Len(ParentID), ParentID) as ParentID
    INLINE [
    ID, Name, ParentID
    1, Direction,
    2, Commercial, 1
    3, Opérations, 1
    4, France, 2
    5, Allemagne, 2
    6, Logistique, 3
    7, Lyon, 4
    8, Paris, 4
    ];
END IF

IF $(vExemple) = 1 THEN
    // Exemple 1 : quatre champs, Parent et Child (premier et deuxième schémas)
    Relations:
    Semantic
    LOAD ID as ID, 'Parent' as Relation, ParentID as ID, 'Child' as Relation
    RESIDENT Org;
    // Table ID, Name ; volet de filtre Relation.
    // Sélectionnez Commercial dans Name, puis Child : France et Allemagne. Child encore : Lyon et Paris.
END IF

IF $(vExemple) = 2 THEN
    // Exemple 2 : trois champs, une relation qui n'est pas un arbre
    Products:
    LOAD * INLINE [
    Product, ProductName
    P1, Modèle 2024
    P2, Modèle 2025
    P3, Modèle 2026
    ];

    Succession:
    Semantic
    LOAD OldProduct as Product, 'remplacé par' as Relation, NewProduct as Product
    INLINE [
    OldProduct, NewProduct
    P1, P2
    P2, P3
    ];
    // Sélectionnez P1, puis « remplacé par -> » : P2. « <- remplacé par » remonte aux prédécesseurs.
END IF

IF $(vExemple) = 3 THEN
    // Exemple 3 : Semantic et Hierarchy sur la même source
    Relations:
    Semantic
    LOAD ID as ID, 'Parent' as Relation, ParentID as ID, 'Child' as Relation
    RESIDENT Org;

    Levels:
    Hierarchy (ID, NodeParentID, NodeName)
    LOAD ID, ParentID as NodeParentID, Name as NodeName
    RESIDENT Org;
    // Levels, reliée à Org par ID, porte NodeName1 à NodeName4 ; Relation sert à naviguer.
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.