🔗 Copier automatiquement des données d'une table vers une autre

Le besoin

« Je voudrais copier automatiquement des donnĂ©es d’une table dans une autre. Comment pourrais-je procĂ©der ? Â»

Cette question revient souvent ! Un cas fréquent : tu saisis des données dans une table (ex : des commandes) et tu veux que ça alimente automatiquement une autre table (ex : un référentiel de fournisseurs).

PlutĂ´t que de « copier Â», Grist propose la fonction lookupOrAddDerived : crĂ©er automatiquement une fiche liĂ©e si elle n’existe pas encore.


Comment ça marche ?

TableCible.lookupOrAddDerived(Champ=$Champ_texte) if $Champ_texte else None
  • TableCible : la table oĂą tu veux chercher/crĂ©er l’enregistrement
  • Champ : le champ sur lequel faire la correspondance
  • $Champ_texte : la valeur saisie librement par l’utilisateur
  • if $Champ_texte else None : Ă©vite de crĂ©er une ligne vide si le champ n’est pas encore rempli

:receipt: Exemple : suivi des commandes et fournisseurs

Contexte : Tu passes des commandes pour ton service. Tu veux garder une trace des fournisseurs sans te prendre la tête à créer chaque fiche avant de saisir une commande.

Table Commandes

Date Objet Fournisseur texte Fournisseur Montant TTC Statut
2025-04-10 Ramettes papier A4 Fourni’Tout Fourni’Tout 89 € Livrée
2025-04-11 Réparation imprimante Techni’Bureau Techni’Bureau 150 € En attente

Table Fournisseurs

Nom SIRET Contact Email Marché cadre
Fourni’Tout 123 456 789 00012 M. Martin contact@fournitout.fr Oui
Techni’Bureau 987 654 321 00034 Mme Lefebvre service@technibureau.fr Non

:gear: Configuration

Table : Commandes

  1. Tu crées une colonne Fournisseur texte (type Texte) → c’est là que tu tapes le nom librement

  2. Tu crées une colonne Fournisseur (type Référence vers Fournisseurs) → avec cette formule :

Fournisseurs.lookupOrAddDerived(Nom=$Fournisseur_texte) if $Fournisseur_texte else None

:white_check_mark: Ce que ça permet

  • Saisie rapide : tu tapes « Fourni’Tout Â» → la fiche existe dĂ©jĂ  → liaison automatique
  • Nouveau fournisseur : tu tapes « Imprim’Express Â» → Grist crĂ©e la fiche → tu complètes SIRET, contact, etc. plus tard
  • Pas de ligne fantĂ´me : si le champ texte est vide, rien n’est créé

:memo: Et pour les formulaires ?

Autre question frĂ©quente : « Je voudrais qu’un seul formulaire alimente plusieurs tables. Â»

Les formulaires Grist sont liés à une seule table, c’est une limitation. Mais avec lookupOrAddDerived, tu contournes le problème.

Le principe

Sur la table de ton formulaire, tu crées :

  • Des colonnes texte libre pour chaque donnĂ©e que tu veux envoyer vers une autre table (ex : Fournisseur texte, CatĂ©gorie texte…)
  • Des colonnes rĂ©fĂ©rence avec la formule lookupOrAddDerived qui vont crĂ©er automatiquement les fiches dans les tables liĂ©es

Exemple concret

Tu veux un formulaire de saisie de commandes qui alimente aussi la table Fournisseurs :

  1. Ta table Commandes contient :

    • Fournisseur texte (type Texte) → visible dans le formulaire, l’utilisateur tape le nom
    • Fournisseur (type RĂ©fĂ©rence) → cachĂ© du formulaire, alimentĂ© par la formule
  2. Dans le formulaire, tu affiches uniquement Fournisseur texte

  3. Quand l’utilisateur soumet le formulaire, la formule s’exécute et crée la fiche fournisseur si besoin

Résultat : un seul formulaire, plusieurs tables alimentées. :tada:


:bar_chart: Bonus : colonnes calculées dans Fournisseurs

Tu peux ajouter des colonnes pour voir les stats par fournisseur :

Nom Nb commandes Total commandé
Fourni’Tout 1 89 €
Techni’Bureau 1 150 €

Formules :

len(Commandes.lookupRecords(Fournisseur=$id))
SUM(Commandes.lookupRecords(Fournisseur=$id).Montant_TTC)
9 « J'aime »

Bonsoir,
Merci pour ces infos. Sauf erreur, avec ce fonctionnement, le champ fournisseur est complètement libre. Est-ce qu’il est possible de proposer la sélection des fournisseurs déjà définis dans l’autre texte ? Sinon on risque de se retrouver avec plusieurs fiches pour le même fournisseur avec juste des typos qui différent.

Merci pour cette astuce. Elle m’ a beaucoup aidée mais j’ai un problème avec les formulaires. Je ne peux plus soumettre la vue formulaire de ma table où j’ai appliqué la formule lookupAddDerived. J’ai ce message d’erreur: Une erreur s’est produite lors de l’envoi de votre formulaire. Veuillez réessayer. Pouvez-vous me donner des pistes de solution. A noter qu’avant j’avais un problème similaire avec une vue formulaire, c’était dû à une colonne de type référence (bidirectionnelle) qu’il y’avait dans la table.
Cordialement,

Bonjour,
J’ai eu le même problème que vous et pour débloquer la situation, j’ai pour le moment transformer la formule en formule d’initialisation. Les formulaires sont désormais envoyés correctement.
Si cela peut vous aider en attendant que le bug soit résolu.

2 « J'aime »

Bonjour,
Merci. Je vais essayer.

Bonjour.

Depuis que j’ai découvert cette fonction, je l’utilise à toutes les sauces, car cela correspond à mes besoins. Mais je ne trouve aucune documentation sur le sujet et suis obligée de tâtonner pour obtenir le bon résultat, en particulier à cause de la casse pour les prénoms.

Savez-vous oĂą se trouve la documentation de cette fonction ?

Ce que j’aimerais pouvoir faire à l’aide de cette fonction, mais pour le moment, je ne sais pas si c’est possible, ni comment faire, j’aimerais que la fonction crée ou récupère la ligne en comparant 2 ou 3 informations, puis complète une autre colonne sans que ce soit une valeur comparée.

Je m’explique par un exemple.

Je veux mettre à jour les admins d’un site Web.

La fonction actuelle est : Administrateurs.lookupOrAddDerived(Saisie_mail=$Courriel_dir_pub.lower(),Nom=$Nom_dir_pub.upper(),Prenom=$Prenom_dir_pub.capitalize()) if $Creer and $MAJ_dir_pub == « change » else None

Or, dans l’idéal, j’aimerais aussi ajouter la “Fonction” de la personne, mais comme cette fonction était précédemment non renseignée, je ne peux pas la mettre comme paramètre de la fonction. Il faut que cela soit fait dans un 2e temps.

Des idées ?

En résumé :

  • oĂą est la doc de la fonction ?
  • peut-on ajouter une valeur Ă  la rĂ©fĂ©rence créée ou rĂ©cupĂ©rĂ©e dans un 2e temps ?

Merci d’avance.

Bonjour, le créateur de Grist s’est expliqué sur le fait que cette fonction est (volontairement) non documentée :

2 « J'aime »