Skip to content

Commit

Permalink
add in function
Browse files Browse the repository at this point in the history
  • Loading branch information
JulienCarmona committed Feb 11, 2025
1 parent c919b5c commit f794339
Show file tree
Hide file tree
Showing 3 changed files with 153 additions and 108 deletions.
36 changes: 33 additions & 3 deletions bowiedocs/docs/1._Pogues/Le VTL dans Pogues/fonctions-vtl.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
| [**`cast()`**](fonctions-vtl.md/#cast) | Permet de changer le tye de la donnée |
| [**`substr()`**](fonctions-vtl.md/#substr) | :construction: Coming soon ... |
| [**`isnull()`**](fonctions-vtl.md/#isnull) | :construction: Coming soon ... |
| [**`in`**](fonctions-vtl.md/#in) | :construction: Coming soon ... |
| [**`in`**](fonctions-vtl.md/#in) | Permet de tester l'appartenance d'une valeur à un ensemble |
| [**`if ... then ...`**](fonctions-vtl.md/#if-then) | :construction: Coming soon ... |

## Détail des fonctions
Expand Down Expand Up @@ -75,7 +75,6 @@
!!! question "Utilité"
En VTL, Le typage **définit la nature des valeurs que peuvent prendre les données que nous manipulons**. <br>
Il est parfois nécessaire de passer d’un type de variable à un autre, on parle dans ce cas de transtypage.


!!! abstract "Syntaxe"
```
Expand Down Expand Up @@ -168,7 +167,38 @@
##### isnull
:construction: Coming soon ...
##### in
:construction: Coming soon ...

!!! question "Utilité"
Il peut être intéressant de savoir si un élément est présent dans un vecteur ou non.
Ex, on veut savoir si parmi les prénoms récoltés, il y a quelqu'un qui s'appelle "Bob"

!!! abstract "Syntaxe"
```
<var> in <ensemble>
```

- `var` : variable dont on veut savoir la présence dans une liste d'éléments
- `ensemble` : liste d'éléments sur lequel on teste la présence de `var`

=== "Texte"
| Valeur de `MA_VARIABLE` | Valeur de `ENSEMBLE` | Fonction | Résultat |
| --- | ---| --- | --- |
| `"a"` | `{"a", "b", "c"}` | `$MA_VARIABLE$ in $ENSEMBLE$` | `true` |
| `"d"` | `{"a", "b", "c"}` | `$MA_VARIABLE$ in $ENSEMBLE$` | `false` |
=== "Nombre"
| Valeur de `MA_VARIABLE` | Valeur de `ENSEMBLE` | Fonction | Résultat |
| --- | ---| --- | --- |
| `18` | `{18, 25, 3}` | `$MA_VARIABLE$ in $ENSEMBLE$` | `true` |
| `6` | `{18, 25, 3}` | `$MA_VARIABLE$ in $ENSEMBLE$` | `false` |

??? example "Exemple d'utilisation"
=== "avec des variables"
```
$PRENOM$ not_in $PRENOMS_FAMILLE$
# ou
$PRENOM$ not_in {"Alice", "Bob", "Charlie"}
```

##### if ... then ...
:construction: Coming soon ...

162 changes: 80 additions & 82 deletions bowiedocs/docs/1._Pogues/Le VTL dans Pogues/vtl.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ VTL est utilisé dès que l’on souhaite :

Les champs correspondants dans Pogues proposent dans la plupart des cas un **éditeur VTL** :

![Editeur VTL](/Bowie/img/vtl/code-list-editor.png 'Éditeur VTL')
![Editeur VTL](../../img/vtl/code-list-editor.png 'Éditeur VTL')

## Fonctionnalités de l’éditeur

Expand Down Expand Up @@ -62,7 +62,7 @@ Un chiffre avec décimales :

Voici un exemple de syntaxe pour un libellé personnalisé :

![Libellé personnalisé](/Bowie/img/vtl/vtl-in-pogues-custom-label.png 'Libellé personnalisé')
![Libellé personnalisé](../..//img/vtl/vtl-in-pogues-custom-label.png 'Libellé personnalisé')

On utilise ici 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 (ici `NOM`).

Expand Down Expand Up @@ -104,13 +104,13 @@ Mon libellé de question avec [une infobulle](. "dont voici le contenu").

Un exemple de contrôle sur une valeur numérique :

![Exemple de contrôle](/Bowie/img/vtl/vtl-in-pogues-simple-control.png 'Exemple de contrôle')_Libellé personnalisé avec gestion de la nullité_
![Exemple de contrôle](../..//img/vtl/vtl-in-pogues-simple-control.png 'Exemple de contrôle')_Libellé personnalisé avec gestion de la nullité_

## Variables calculées

Pogues permet de créer des variables calculées à partir de variables collectées. Par exemple, pour sommer les revenus de l’enquêté et de son conjoint on écrira :

![Variable calculée pour le revenu](/Bowie/img/vtl/vtl-in-pogues-computed-variable-earnings.png)
![Variable calculée pour le revenu](../..//img/vtl/vtl-in-pogues-computed-variable-earnings.png)

L'expression VTL étant :

Expand All @@ -122,7 +122,7 @@ nvl($REVENUS$, 0) + nvl($REVENUS_CONJOINT$, 0)

Voici un exemple de filtre simple exprimé en VTL :

![Filtre simple](/Bowie/img/vtl/vtl-in-pogues-simple-filter.png 'Filtre simple')_Un filtre simple_
![Filtre simple](../..//img/vtl/vtl-in-pogues-simple-filter.png 'Filtre simple')_Un filtre simple_

<span class="label label-rounded label-primary">À noter</span> À ce jour, le champ “Condition d’affichage” du filtre n’utilise pas l’éditeur VTL.

Expand Down Expand Up @@ -150,7 +150,7 @@ nvl($VARIABLE_EXCLUSIVE$, false) and

L’usage de VTL dans Pogues et les outils de collecte s’appuie sur les bibliothèques Lunatic (pour les composants graphiques) et Trevas (qui fournit le moteur VTL).

C’est l’état d’avancement de cette dernière qui permet de connaître les opérateurs et fonctions disponibles : la référence est donc la [page de suivi de l’implémentation](https://inseefr.github.io/Trevas-JS/fr/coverage.html).
C’est l’état d’avancement de cette dernière qui permet de connaître les opérateurs et fonctions disponibles : la référence est donc la [page de suivi de l’implémentation](https://inseefr.github.io/Trevas-TS/docs/coverage).

### Logique

Expand All @@ -167,22 +167,6 @@ C’est l’état d’avancement de cette dernière qui permet de connaître les
| ------------ | ------- | ---------------------------------- |
| Remplacement | replace | `replace("bag", "g", "c") # → bac` |

### Appartenance

Les opérateurs `in` et `not_in` permettent de tester l'appartenance d'une valeur à un ensemble. Par exemple :

```
"a" in {"a", "b", "c"} # → true
```

Il permet aussi de faire ce test en utilisant des variables :

```
$PRENOM$ not_in $PRENOMS_FAMILLE$
# ou
$PRENOM$ not_in {"Alice", "Bob", "Charlie"}
```

## Cookbook

### Chaînes de caractères
Expand Down Expand Up @@ -339,8 +323,10 @@ match_characters(

#### Contrôle de validité d'un SIRET

Il faut deux contrôles, chacun avec un message différent :
Il faut 3 contrôles, chacun avec un message 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**
Expand All @@ -351,51 +337,56 @@ Il faut deux contrôles, chacun avec un message différent :

??? tip "Code VTL pour le contrôle du Siret"

``` title="Contrôle Siret 1"
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)
```

``` title="Contrôle Siret 2"
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)
```
=== "Contrôle Siret de format"
```
not match_characters($SIRET$,"^[0-9]{14}$")
```
=== "Contrôle Siret 1"
```
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)
```
=== "Contrôle Siret 2"
```
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
Expand All @@ -407,6 +398,8 @@ Il faut deux contrôles, chacun avec un message différent :

Comme pour le Siret, on va utiliser le premier contrôle en remplaçant la taille exigée à 9. Ce qui donne un contrôle avec le message suivant

- 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.
Expand All @@ -416,20 +409,25 @@ Comme pour le Siret, on va utiliser le premier contrôle en remplaçant la taill
Et le code VTL
??? tip "Code VTL pour le contrôle du Siren"

``` title="Contrôle Siren"
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)
```
=== "Contrôle Siret de format"
```
not match_characters($SIRET$,"^[0-9]{9}$")
```
=== "Contrôle Siren"
```
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)
```

#### Contrôle de validité d'un RNA

Expand Down
63 changes: 40 additions & 23 deletions bowiedocs/docs/1._Pogues/Le guide/23-controles.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,26 +31,43 @@ Il est possible de supprimer ou dupliquer un contrôle.
Côté collecte enquêteur, les contrôles ne sont implémentés.


## Exemples de condition

- `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"`
- `nvl($VAR1_NUMERIQUE,0) + nvl($VAR2_NUMERIQUE$,0) > 0`
- 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))`
- tester une durée :

```
// valeur initiale de DUREE : PT12H30M
cast(
replace(
replace(
replace($DUREE$, "PT", ""), // "12H30M"
"M", ""), // "12H30"
"H", "."), // "12.30"
number) // 12.30
> 7.3 // true
```

Voir aussi : [https://inseefr.github.io/Bowie/pogues/Le%20VTL%20dans%20Pogues/vtl/#controles_1](https://inseefr.github.io/Bowie/pogues/Le%20VTL%20dans%20Pogues/vtl/#dates)
!!! example "Exemples de condition pour les contrôles"
=== "sans et avec gestion du null"
```
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`
```
=== "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"
```
=== "case cochée"
Pour un filtre par exemple
```
nvl($QCM1$,false) = true
```
=== "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))
```
=== "durée"
```
// 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](../Le%20VTL%20dans%20Pogues/vtl.md/#cookbook)

0 comments on commit f794339

Please sign in to comment.