Les contrôles
Un contrôle permet de vérifier la qualité des informations saisies au sein d'un questionnaire.
Deux types de contrôle sont implémentés :
- les contrôles de format (automatiques, et dépendant de la nature de la variable décrite dans Pogues)
- les contrôles de cohérence interne au questionnaire (éventuellement cohérence avec les données antérieures), décrits dans Pogues par le concepteur.
Les contrôles et filtres ne fonctionnent pas quand on fait une visualisation sur une sous partie du questionnaire : séquence, sous séquence ou question
Pour tester le bon fonctionnement des contrôles, on peut faire une visualisation et voir si ces derniers se déclenchent correctement.
Il faut visualiser le questionnaire dans son entièreté.
Syntaxe
Dans l'onglet "Contrôles" de la question du questionnaire à partir de laquelle on veut appliquer le contrôle, renseigner :
- la description du contrôle : texte libre documentant le contrôle
- la condition (pour laquelle on affiche le message d'erreur)
- le message d'erreur : saisir ici le message d'erreur qui s'affichera à l'enquêté si la condition est remplie (à rédiger en VTL)
- la criticité : choisir une criticité parmi
- Information
- Avertissement
- Erreur
A ce jour, aucun contrôle n'est bloquant et on ne valorise donc pas la criticité en termes de blocage de navigation, mais on distingue visuellement les contrôles de niveau information ou avertissement/erreur. Si on souhaite mettre en évidence une anomalie, on privilégiera les criticités Avertissement ou Erreur.
Valider.
Il est possible de supprimer ou dupliquer un contrôle.
Tip
Côté collecte web, un contrôle se déclenche au clic sur suivant lorsque la condition est vraie. Les contrôles figurent sous les champs de saisie et lorsque plusieurs contrôles ont été décrits, ils apparaissent avec une précédence (un contrôle doit être résolu avant que le suivant ne se déclenche).
Tip
Côté collecte enquêteur, les contrôles ne sont implémentés mais des développement sont prévu pour fin 2025
Exemples de condition pour les contrôles
if $VAR_NUMERIQUE$ < 10 then "1" else "2" ==> renvoie 2 si null
if nvl($VAR_NUMERIQUE$,0) < 10 then "1" else "0" ==> renvoie 1 si null
nvl($VAR1_NUMERIQUE,0) + nvl($VAR2_NUMERIQUE$,0) > 0`
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"
Pour un filtre par exemple
nvl($QCM1$,false) = true
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))
// valeur initiale de DUREE : PT12H30M
cast(
replace(
replace(
replace($DUREE$, "PT", ""), // "12H30M"
"M", ""), // "12H30"
"H", "."), // "12.30"
number) // 12.30
> 7.3 // true
Voir d'autres exemples
Cohérence avec les filtres
Si on ajoute un contrôle sur une question qui est filtré, il faut rajouter la condition du filtre dans ce contrôle pour que ce dernier ne se déclenche pas quand la question n'est pas affiché
Exemples pratiques
Non-réponse
Dans la plupart des cas, vérifier une potentielle non-réponse c'est vérifier que la variable sous-jacente n'a pas été valorisée. Il faut donc écrire un contrôle pour tester la nullité.
Dépendamment du type de la variable, la formule VTL de conditionnant l'affichage du contrôle de non réponse est différente.
Pour ces types, la formule VTL est simple avec seulement l'utilisation de isnull()
isnull($VAR$)
Comme pour le Booléen, il faut gérer aussi le cas où un répondant à commencé à remplir le champ mais a finalement effacé sa réponse. Dans ce cas la valeur de la variable n'est plus null
mais ""
.
On peut gérer ça des deux manière suivantes :
isnull($VAR) or $VAR = ""
nvl($VAR, "") = ""
Comme pour le Texte, il faut gérer aussi le cas où un répondant à cocher la case mais a finalement décoché. Dans ce cas la valeur de la variable n'est plus null
mais false
.
On peut gérer ça des deux manière suivantes :
isnull($VAR) or $VAR = false
nvl($VAR, false) = false
Contrôle de validité d'une adresse mail
Certains questionnaires peuvent collecter des informations de contact. Dans le cas d'une adresse mail, on veut pouvoir s'assurer de la justesse syntaxique de celle-ci. S'il n'existe pas de formule assurant la compatibilité à 100% avec la spécification initiale relative aux adresses mail, ce que l'on utilise dans la formule suivante permet d'empêcher la plupart des erreurs :
match_characters(
$MAIL$,
"^[A-Za-z0-9._+\-\']+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}$"
) = false
Contrôle de validité d'un SIRET
3 contrôles, chacun avec un but différent
- Vérification du format du Siret (14 caractères et uniquement des chiffres) : Contrôle Siret de format
Le Siret doit être composé uniquement de 14 chiffres
- Vérification du Siren (9 premiers caractères) : Contrôle Siret 1
Les 9 premiers chiffres du numéro que vous avez renseigné ne correspondent pas à un numéro Siren.
- Vérification du Siret sachant que le Siren est correct : Contrôle Siret 2
Les 9 premiers chiffres du numéro que vous avez renseigné correspondent à un numéro Siren, mais les 5 derniers font que l'ensemble n'est pas un numéro Siret.
Formule VTL
On se place dans le cas où le Siret est collecté à travers la variable SIRET
not match_characters($SIRET$,"^[0-9]{14}$")
match_characters($SIRET$,"^[0-9]{14}$")
and ((mod(
cast(substr($SIRET$,1,1),integer)
+ cast(substr($SIRET$,2,1),integer)*2 -(if (cast(substr($SIRET$,2,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,3,1),integer)
+ cast(substr($SIRET$,4,1),integer)*2 -(if (cast(substr($SIRET$,4,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,5,1),integer)
+ cast(substr($SIRET$,6,1),integer)*2 -(if (cast(substr($SIRET$,6,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,7,1),integer)
+ cast(substr($SIRET$,8,1),integer)*2 -(if (cast(substr($SIRET$,8,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,9,1),integer)
,10)) <> 0)
match_characters($SIRET$,"^[0-9]{14}$")
and ((mod(
cast(substr($SIRET$,1,1),integer)
+ cast(substr($SIRET$,2,1),integer)*2 -(if (cast(substr($SIRET$,2,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,3,1),integer)
+ cast(substr($SIRET$,4,1),integer)*2 -(if (cast(substr($SIRET$,4,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,5,1),integer)
+ cast(substr($SIRET$,6,1),integer)*2 -(if (cast(substr($SIRET$,6,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,7,1),integer)
+ cast(substr($SIRET$,8,1),integer)*2 -(if (cast(substr($SIRET$,8,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,9,1),integer)
,10)) = 0)
and ((mod(
cast(substr($SIRET$,1,1),integer)*2 -(if (cast(substr($SIRET$,1,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,2,1),integer)
+ cast(substr($SIRET$,3,1),integer)*2 -(if (cast(substr($SIRET$,3,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,4,1),integer)
+ cast(substr($SIRET$,5,1),integer)*2 -(if (cast(substr($SIRET$,5,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,6,1),integer)
+ cast(substr($SIRET$,7,1),integer)*2 -(if (cast(substr($SIRET$,7,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,8,1),integer)
+ cast(substr($SIRET$,9,1),integer)*2 -(if (cast(substr($SIRET$,9,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,10,1),integer)
+ cast(substr($SIRET$,11,1),integer)*2 -(if (cast(substr($SIRET$,11,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,12,1),integer)
+ cast(substr($SIRET$,13,1),integer)*2 -(if (cast(substr($SIRET$,13,1),integer) > 4) then 9 else 0)
+ cast(substr($SIRET$,14,1),integer)
,10)) <> 0)
- On vérifie que l'on a une chaîne de 14 chiffres
- On fait une grosse addition dont on vérifie si elle est égale à 0 modulo 10
- On a une action caractère par caractère : On regarde le chiffre et selon sa position, on le multiplie par 1 ou 2 ; lorsqu'on le multiplie par 2, si ça atteint ou dépasse 10, on enlève 9
ex :7*2
donne1+4 (formule de Luhn) = 14-9 (formule calculée ici)
Si on ne veut pas que ces contrôles se déclenchent dans le cas où le champ est vide, il faut rajouter au début de chacun la formule
not (nvl($SIRET$,"")="") and ...
Contrôle de validité d'un SIREN
2 contrôles, chacun avec un but différent
- Vérification du format du Siren (9 caractères et uniquement des chiffres) : Contrôle Siren de format
Le Siren doit être composé uniquement de 9 chiffres
- Vérification du Siren (9 premiers caractères) : Contrôle Siren
Les 9 premiers chiffres du numéro que vous avez renseigné ne correspondent pas à un numéro Siren.
Formule VTL
On se place dans le cas où le Siren est collecté à travers la variable SIREN
not match_characters($SIRET$,"^[0-9]{9}$")
match_characters($SIREN$,"^[0-9]{9}$")
and ((mod(
cast(substr($SIREN$,1,1),integer)
+ cast(substr($SIREN$,2,1),integer)*2 -(if (cast(substr($SIREN$,2,1),integer) > 4) then 9 else 0)
+ cast(substr($SIREN$,3,1),integer)
+ cast(substr($SIREN$,4,1),integer)*2 -(if (cast(substr($SIREN$,4,1),integer) > 4) then 9 else 0)
+ cast(substr($SIREN$,5,1),integer)
+ cast(substr($SIREN$,6,1),integer)*2 -(if (cast(substr($SIREN$,6,1),integer) > 4) then 9 else 0)
+ cast(substr($SIREN$,7,1),integer)
+ cast(substr($SIREN$,8,1),integer)*2 -(if (cast(substr($SIREN$,8,1),integer) > 4) then 9 else 0)
+ cast(substr($SIREN$,9,1),integer)
,10)) <> 0)
Si on ne veut pas que ces contrôles se déclenchent dans le cas où le champ est vide, il faut rajouter au début de chacun la formule
not (nvl($SIREN$,"")="") and ...
Contrôle de validité d'un RNA
Le format attendu est un code avec les contraintes suivantes dans l'ordre
- Commence par 'W'
- 1 chiffre
- 1 caractère (lettre ou chiffre)
- Suite de 7 chiffres.
=> Un contrôle suffit.
Formule VTL pour le contrôle du RNA
On se place dans le cas où le RNA est collecté à travers la variable RNA
not(match_characters($RNA$,"^W\d[\da-zA-Z]\d{7}$"))
Si on ne veut pas que ces contrôles se déclenchent dans le cas où le champ est vide, il faut rajouter au début de chacun la formule
not (nvl($RNA$,"")="") and ...
Questionnaire exemple
Pour référence, des questionnaires illustrant ces contrôles sont disponibles dans l'environnement de demo, sous le timbre DOCUMENTATION.
- Un questionnaire implémentant les contrôles de Siret, Siren et Rna
- Un questionnaire similaire où les contrôles ne se déclenchent aussi quand le champ est vide