Une validation pour les enregistrements d'une table

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
3 « J'aime »