Aller au contenu

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 = ""
Ou en utilisant la fonction nvl() :

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
Ou en utilisant la fonction nvl() :

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)
Explication du code

  1. On vérifie que l'on a une chaîne de 14 chiffres
  2. On fait une grosse addition dont on vérifie si elle est égale à 0 modulo 10
  3. 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 donne 1+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

  1. Commence par 'W'
  2. 1 chiffre
  3. 1 caractère (lettre ou chiffre)
  4. 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

Contrôle 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.