Validation
Les deux lignes de défense des données — ce que le modèle garantit et les règles que les formulaires des écrans vérifient avant d'enregistrer.
Les données fausses entrent par distraction, pas par malveillance : un numéro fiscal à huit chiffres, un e-mail sans arobase, une remise de 300 %, un enregistrement enregistré sans le champ dont le reste du processus a besoin. Valider, c'est fermer ces portes — et dans Keplin, elles se ferment sur deux couches, qu'il vaut mieux ne pas confondre.
| Couche | Où elle se définit | Quand elle agit | Ce qu'elle attrape |
|---|---|---|---|
| Le modèle | Dans l'éditeur de la table (voir Tables et champs) | À toute écriture, d'où qu'elle vienne | Ce qui ne peut jamais arriver aux données. |
| Les règles des champs | Dans l'inspecteur de chaque champ de formulaire, catégorie Validation | Quand l'utilisateur enregistre un formulaire | Ce que la personne est en train d'écrire, avec le bon message à côté du champ. |
La règle pratique : ce qui est vrai des données vit dans le modèle ; ce qui est une aide à l'utilisateur vit dans le formulaire. Un champ obligatoire est les deux à la fois — on désactive Autorise NULL dans le modèle et on active Obligatoire sur le champ de l'écran.
Ce que le modèle garantit
Ce ne sont pas des « règles de validation » sous ce nom, mais c'est la seule défense qu'on ne contourne pas : elle vaut pour les écrans, pour les APIs, pour les scripts et pour qui écrit directement dans la base de données.
| Pièce | Ce qu'elle empêche |
|---|---|
| Autorise NULL désactivé | Un enregistrement sans valeur dans cette colonne. |
| Type de la colonne | Du texte dans un champ de date, des lettres dans un nombre. |
| Longueur / Précision · Échelle | Du texte plus long que la colonne, ou de l'argent avec trop de décimales. |
| Clé primaire (PK) | Des enregistrements en double et des enregistrements qu'on ne peut pas identifier. |
| Index unique | Deux clients avec le même numéro fiscal, deux utilisateurs avec le même e-mail. |
| Colonne de type enum | Un état qui n'existe pas dans la liste. |
| Relation physique + À la suppression du parent | Des enfants orphelins, ou des suppressions qui emportent ce qu'elles ne devraient pas. |

Dica
Avant d'écrire une règle sur un formulaire, demandez-vous : ceci peut-il être vrai sur un enregistrement, une fois ? Si la réponse est non, l'endroit est le modèle — parce que le formulaire n'est qu'une des portes par lesquelles les données entrent.
Les règles des champs de formulaire
Tous les champs de formulaire — Champ de texte, Zone de texte, Nombre, Oui/Non, Liste, Date, Couleur, Fichier — ont dans l'inspecteur la catégorie Validation. C'est là qu'on déclare ce que ce champ accepte.
Pour y arriver :
- Ouvrez l'écran dans le designer.
- Sélectionnez le champ — dans le canvas, ou par l'onglet Structure de l'inspecteur.
- Dans l'onglet Propriétés, ouvrez la catégorie Validation.

Obligatoire
L'interrupteur Obligatoire est la première et la plus utilisée des règles : le champ doit être rempli. C'est aussi la seule qui parle du vide — toutes les autres laissent passer un champ vide, parce que le vide est l'affaire de l'Obligatoire.

Les règles standard
Selon le type de champ, la catégorie affiche les règles qui ont du sens :
| Règle | Où elle apparaît | Ce qu'elle vérifie |
|---|---|---|
| Masque | Champ de texte | Le format pendant la saisie : # chiffre, A lettre, N alphanumérique, * n'importe quoi — le reste est du texte fixe. Ex. : +351 ### ### ###. |
| Min. caractères | Champ de texte, Zone de texte | Longueur minimale du texte. |
| Max. caractères | Champ de texte, Zone de texte | Longueur maximale du texte. |
| Motif (regex) | Champ de texte, Zone de texte | Une expression régulière que la valeur doit respecter. Ex. : ^[A-Z]{2}\d{4}$. |
| Format | Champ de texte | Aucun, Est un e-mail, Est un téléphone ou Est un nombre. Ils sont exclusifs : une valeur ne peut pas être e-mail et téléphone en même temps. |
| Valeur min. | Nombre | La plus petite valeur acceptée. |
| Valeur max. | Nombre | La plus grande valeur acceptée. |
| Égal au champ | Tous les champs | La valeur doit être égale à celle d'un autre champ de l'écran — la confirmation de mot de passe, l'e-mail répété. |
Nota
Le Masque est une aide à la saisie, ce n'est pas une validation : il guide ce que la personne écrit, mais celui qui garantit le format, c'est le Motif (regex) ou le Format. Un téléphone avec masque peut rester à moitié saisi.
Validation par code
Sous les règles standard se trouve la ligne Validation, qui affiche Aucune validation — définir ou Définie — modifier. Le bouton … ouvre un éditeur de code pour les règles que les champs ne couvrent pas : un numéro fiscal avec chiffre de contrôle, un IBAN, une date qui doit être postérieure à une autre, une règle métier que seule votre entreprise a.
Le code reçoit value — la valeur actuelle du champ — et renvoie :
true(ou rien) si la valeur est valide ;- une chaîne avec le message d'erreur à afficher, si elle ne l'est pas.
const s = String(value ?? "").replace(/\D/g, "");
if (s.length !== 9) return "Le numéro fiscal doit avoir 9 chiffres";
return true;
Dans ce code, vous avez aussi keplin à disposition — de quoi comparer avec un
autre champ, avec une valeur de la session ou avec des données déjà chargées dans
l'écran. C'est du TypeScript, avec des suggestions pendant que vous écrivez
(Ctrl+Espace) ; l'éditeur refuse d'enregistrer du code qui n'est pas
exécutable.

Quand la validation s'exécute
La validation d'un formulaire s'exécute à l'enregistrement — quand le bouton d'enregistrement demande d'enregistrer le datastore de l'enregistrement. L'ordre est toujours le même, par champ :
- Obligatoire — le champ est-il rempli ?
- Les règles standard — longueur, format, minimum, maximum, motif, égalité.
- La validation par code — votre règle.
La première erreur l'emporte : dès qu'une règle échoue, c'est le message de cette règle qui apparaît sous le champ et les suivantes ne s'exécutent pas. Si un champ échoue, rien n'est enregistré — l'enregistrement reste tel quel et la personne reste dans le formulaire, avec les erreurs sous les yeux.
On peut aussi valider un champ à la main, depuis le code d'un événement — par exemple pour vérifier un champ dès qu'il change au lieu d'attendre la fin. C'est l'affaire de Événements et le SDK.
Les messages
Les messages des règles standard sont ceux de la plateforme, écrits dans la langue de l'app : Champ obligatoire., E-mail non valide., Minimum {min} caractères., Valeur maximale : {max}., Les valeurs ne correspondent pas., Format non valide. Ils ne se modifient pas un par un — si vous devez dire les choses autrement, l'endroit est la validation par code, où le message est la chaîne que vous renvoyez.
La langue vient des paramètres de l'app (Paramètres de l'app ▸ Traductions) : la même app en portugais et en anglais affiche les erreurs dans la langue de celui qui l'utilise.
Ce que la validation N'EST PAS
Atenção
La validation d'un formulaire est une commodité, pas une sécurité. Elle s'exécute dans le navigateur de celui qui utilise l'app et sert à éviter les erreurs honnêtes. Qui veut vraiment écrire une valeur invalide ne passe pas par le formulaire — il passe par l'API. La vraie défense est celle du modèle (types, obligation, clés, index uniques, enums) et celle des permissions de qui peut écrire quoi.
Pourquoi ne… ?
- Pourquoi je ne vois pas la catégorie Validation dans ce widget ? Seuls les champs de formulaire valident. Un Bouton, un Libellé ou une Table n'ont pas de valeur à valider.
- Pourquoi la règle ne se déclenche-t-elle pas avec le champ vide ? C'est exprès : les règles standard ignorent le vide, qui est le territoire de l'Obligatoire. Activez-le.
- Pourquoi un enregistrement invalide a-t-il été enregistré quand même ? Soit le champ n'était pas relié au datastore (sans liaison, il n'entre pas dans la validation), soit la valeur a été écrite par une autre voie — une API, un script, un import. Voyez ce que le modèle garantit, plus haut sur cette page.
- Pourquoi le Motif (regex) ne correspond-il pas ? C'est une expression
régulière dans la syntaxe habituelle, et chaque caractère compte :
^[A-Z]{2}\d{4}$acceptePT1234et refusept1234. Testez l'expression avant de la coller. - Pourquoi ma validation par code n'a-t-elle pas été enregistrée ? L'éditeur refuse le code qui n'est pas exécutable — corrigez l'erreur signalée et enregistrez à nouveau.
- Pourquoi le message apparaît-il en anglais ? La langue de l'app est l'anglais. Changez-la dans Paramètres de l'app ▸ Traductions.