XPath et VTL, les différences
Ce document est un résumé permettant de traduire rapidement quelques fonctions ou syntaxes fréquemment utilisées dans les questionnaires entreprises saisis dans Pogues.
Note
Pour (re)découvrir de façon plus approfondie et détaillée le langage VTL, le guide VTL de référence est ici.
Changements au niveau du langage
Quelques opérateurs identiques
Opérateur ou fonction | Xpath | VTL |
---|---|---|
A est égal à B | A = B | A = B |
A plus B | A + B | A + B |
A moins B | A - B | A - B |
A fois B | A * B | A * B |
et logique | and | and |
ou logique | or | or |
Quelques opérateurs différents
Opérateur ou fonction | Xpath | VTL |
---|---|---|
A différent de B | A != B | A <> B |
A divisé par B | A div B | A / B |
sous-chaine de longueur 2, à partir du 1er caractère | substring(A,1,2) | substr(A,1,2) |
concaténer A, B | concat(A,B ) | A || B |
nullité (cf. infra) | A = '' | isnull(A) |
Utilisation de texte
Dans les contrôles ou les filtres décrits dans Pogues, on n'utilise plus (comme c'était le cas en Xpath) les simples '
mais des guillemets "
.
Exemples :
- Filtre :
$VAR_TEXTE$ = "1" or $VAR_TEXTE$ ="2"
- Contrôle :
$VAR_TEXTE$ = "1" and $VAR_NUMERIQUE$ > 1000
Changements dûs au format des variables (passage XForms -> Lunatic)
Le format des variables a évolué ce qui conduit à quelques évolutions dans la manière de formuler filtres ou contrôles.
Nature des modalités de réponse aux QCM
En VTL, on ne retourne plus des "0" / "1" ou des "" / "1" pour les modalités de réponse à un QCM, mais true si une modalité est cochée, null ou false si elle ne l'est pas. Cf. partie "les contrôles dans les QCM".
Comprendre et gérer le vide et la nullité
Généralités
En xforms, la non-réponse était systématiquement une chaîne vide quel que soit le format. Dans le format Lunatic en revanche, un champ qui n’est pas encore rempli par le répondant est de valeur "null", que ce soit un champ nombre, texte, un QCU, un QCM etc. Quand le répondant saisit une réponse, on va collecter un nombre, du texte, un booléen (valeurs true/false, cf. supra). Lorsque le répondant saisit une réponse puis l'efface, le champ collecté n'est pas systématiquement remis à null : il redeviendra null pour un champ nombre mais vaudra "" pour du texte, et false pour une modalité de QCM décochée.
Champ collecté | jamais saisi | répondu / coché | effacé/décoché |
---|---|---|---|
Nombre | null | 123 | null |
Texte | null | "xyz" | "" |
Modalité de QCM | null | true | false |
Modalité de QCU | null | un code (décrit dans Pogues) | impossible |
Sommer des variables
Quand on manipule des variables numériques en VTL, il faut se prémunir de ce null ou ce "" puisqu'en VTL, la valorisation de VAR1_NUMERIQUE + VAR2_NUMERIQUE, si VAR2_NUMERIQUE est non rempli, vaudra null (alors qu'on pourrait s'attendre à ce que la somme soit VAR1_NUMERIQUE). Pour cela, on utilise la fonction nvl qui permet de proposer une valeur en cas de null ou de "" : nvl(\$MA_VARIABLE$, "valeur si nulle") c'est-à-dire : si \$MA_VARIABLE$ n'est pas renseignée, lui affecter la valeur si nulle, sinon lui affecter \$MA_VARIABLE$.
Exemple:
$VAR1_NUMERIQUE$ + $VAR2_NUMERIQUE$
=>nvl($VAR1_NUMERIQUE$,0) + nvl($VAR2_NUMERIQUE$,0)
Tester la nullité/le vide
On peut vouloir détecter des potentielles non-réponses (par exemple pour ne pas déclencher un contrôle entre 2 variables VAR_A et VAR_B, si une des 2 variables n'est pas renseignée). Pour cela, on va devoir tester la nullité des variables et, en fonction de la nature de la variable collectée, s'assurer que l'on n'a pas aussi une chaîne vide. Plusieurs syntaxes sont possibles :
isnull($VAR_NUMERIQUE$) (pour les variables numériques)
isnull($VAR_TEXTE$) or $VAR_TEXTE$="" (pour les textes).
isnull($VAR_QCM1$) or not $VAR_QCM1$ (pour les modalités de QCM).
isnull($VAR_QCU$) (pour un QCU)
On peut également tirer partie de la fonction nvl :
nvl($VAR_TEXTE$, "") = ""
nvl($VAR_QCM_1$, false)
Personnaliser un libellé
Trois éléments assez différents de Xpath :
- on utilise l’opérateur VTL || qui permet de concaténer des chaînes de caractères, ou une chaîne de caractères et une variable.
- pour être utilisées dans un libellé, les variables numériques collectées doivent être converties en chaînes de caractères (fonction cast)
- les variables externes, quelle que soit leur nature, sont vues comme des variables Texte, qui peuvent donc être utilisées dans des libellés (de questions, de déclarations, de messages d'erreur)
Exemples :
"Hello" || $VAR_TEXTE$
"En " || $VAR_TEXTE_EXTERNE$ || ", votre activité est-elle toujours " || $VAR_TEXTE_EXTERNE2$ || " ?"
"Votre chiffre d'affaires est de " || cast($VAR1_NUMERIQUE$,string) || " euros et votre effectif de " || cast($VAR2_NUMERIQUE$,string) || " personnes".
"Vous venez de déclarer un chiffre d'affaires de " || cast($VAR1_NUMERIQUE$,string) || " euros alors qu'il était de " || cast($VAR2_NUMERIQUE_EXTERNE$,string) || " euros l'an dernier".
ou"Vous venez de déclarer un chiffre d'affaires de " || cast($VAR1_NUMERIQUE$,string) || " euros alors qu'il était de " || $VAR2_NUMERIQUE_EXTERNE$ || " euros l'an dernier".
Contrôles et variables calculées
Il est assez simple d'écrire des contrôles ou de calculer des variables à partir des données collectées ou externes dès lors qu'on dispose des opérateurs (cf. infra), qu'on a compris le principe de la nullité et qu'on connaît la nature des variables, en particulier celles des variables externes.
Exemples :
sans gestion du null : if $VAR_NUMERIQUE$ < 10 then "1" else "2" ==> renvoie 2 si null
gestion du null : if nvl($VAR_NUMERIQUE$,0) < 10 then "1" else "0" ==> renvoie 1 si null
variable externe (on doit convertir la variable en numérique pour la comparer à 0 par exemple): if nvl($VAR2_NUMERIQUE_EXTERNE, "") <> 0 and cast($VAR2_NUMERIQUE_EXTERNE$,integer) > 0 then "1" else "0"
$VAR_SOMME$ = nvl($VAR1_NUMERIQUE,0) + nvl($VAR2_NUMERIQUE$,0)
Contrôles dans les QCM
Dans la nouvelle filière, on ne retourne plus des 0 / 1 pour les modalités de réponse à un QCM, mais des true si une modalité est cochée, null si elle ne l'est pas et false si elle est décochée. Les contrôles ou filtres impliquant ces variables doivent prendre en compte ces aspects.
Exemples :
- tester que QCM1 est cochée (pour un filtre par exemple) =>
nvl($QCM1$,false) = true
- tester une modalité exclusive (ici par exemple QCM4 ne peut pas être cochée si QCM1, QCM2, ou QCM3 l'est) =>
(nvl($QCM4$,false) = true and nvl($QCM3$,false) = true) or (nvl($QCM4$,false) = true and nvl($QCM2$,false) = true) or (nvl($QCM4$,false) = true and nvl($QCM1$,false) = true))
Et si le questionnaire ne peut pas être visualisé ou se visualise mal ?
- Si la visualisation du questionnaire ne fonctionne pas, il est possible de visualiser chaque séquence/sous-séquence l'une après l'autre, afin de déterminer quelle séquence/sous-séquence pose un problème, puis quelle question.
- Si une question filtrée s'affiche à tort, c'est que le filtre est incorrect (variable mal décrite, inexistante)
- Si es déclarations n’apparaissent pas, penser à vérifier que le(s) mode(s) de collecte est(sont) bien coché(s).