Bonjour,
Grist ne propose pas de validation intégrée d’enregistrement, comme ça peut-être le cas dans un SGBD (cf. Record validation · Issue #939 · gristlabs/grist-core · GitHub). Il est néanmoins possible de créer un bouton de validation pour différencier un enregistrement validé d’un autre.
Si vous voulez tout de suite voir à quoi ça ressemble, allez sur Exemple avec validation d'enregistrement - Grist.
Principe général
Le principe général est de créer, pour chaque ligne, une colonne avec les messages d’erreur et un interrupteur à bascule pour valider :
- La colonne avec les message d’erreur recense les anomalies dans l’enregistrement
- L’interrupteur permet de valider l’enregistrement s’il n’y a pas d’anomalie.
Les messages d’erreur :
Les anomalies dans l’enregistrement sont de différentes natures, par exemple :
- une valeur du mauvais type ;
- une valeur numérique trop petite, trop grande ;
- une date dans le futur, dans le passé ;
- deux valeurs incohérentes : si la colonne A est à zéro, la colonne B doit être vide.
- etc.
Dans l’exemple fourni, les messages d’erreur sont créés de la manière suivante :
col_names = ["Numero", "Date", "c10_ou_plus", "A", "B"]
items = [(f, getattr(rec, f)) for f in col_names]
msgs = [
"Colonne '{}' : vide".format(f) for f, v in items if v is None
] + [
"Colonne '{}' : type invalide".format(f) for f, v in items if isinstance(v, grist.AltText)
]
if rec.c10_ou_plus < 10:
msgs.append("La colonne '10 ou plus' devrait être >= 10, mais est {}".format(rec.c10_ou_plus))
if rec.A > rec.B:
msgs.append("La colonne 'A' devrait être <= à la colonne 'B'")
return "\n".join(msgs)
Les objets de type grist.AltText désignent des erreurs de type.
Vous pouvez procéder comme vous le souhaitez, mais la logique suivante semble indiquée :
msgs = []
# ajouter des messages
return "\n".join(msgs)
Le contrôle de la validation
L’« astuce » consiste à interdire la validation d’un enregistrement pour lequel il existe des messages d’erreur.
Le contrôle de cette validation se fait par les permissions avancées sur la table (! signifie interdiction) :
| condition | permission | message |
|---|---|---|
| rec.Valider | !C | Ne peut pas créer un enregistrement prévalidé |
| newRec.Valider and newRec.Messages | !U | Ne peut pas valider un enregistrement en erreur (= avec des messages) |
| rec.Valider and newRec.Valider | !U | Doit dévalider avant de modifier |