Résoudre les cassages de champs référence dans Grist
Ça vous énerve quand vous copiez-collez (ou que vous formuledinitialisationnez) dans un champ de type référence et que la liaison avec la table en question ne marche pas ? Vous savez, la petite case qui devient rouge – comme vous – d’insatisfaction ?
Dans ces cas-là, moi je souffle et je me dis : Ah oui, c’est vrai, j’avais trouvé une solution l’autre fois ! Alors je vous partage MA solution, mais si vous en avez une plus simple, je suis preneuse !
Cas pratique : Lier des projets et des tâches
Prenons un cas simple avec deux tables :
PROJETS avec le champ NOM_PROJET.
TACHES avec les champs :
NOM_TACHE
PROJET_ASSOCIE (Texte – récupéré par une formule d’initialisation, par exemple).
LIEN_PROJET (Référence vers PROJETS).
Ajoutez cette formule dans LIEN_PROJET :
result = PROJETS.lookupOne(NOM_PROJET=rec.PROJET_ASSOCIE)
return result if result else None
Si PROJET_ASSOCIE existe bien dans la table PROJETS, alors le lien sera correctement établi.
Faites le test en copiant-collant le contenu de PROJET_ASSOCIE vers un champ COPIÉ COLLÉ de type Référence simple (comme LIEN_PROJET), et vous verrez la différence.
J’anticipe la question, pour un champ de type référence multiple, il faut que vos données multiples dans LIEN_PROJET soient séparées par une virgule et une espace==> ', ’
et il faut utiliser cette formule
projets = [p for p in PROJETS.all if p.NOM_PROJET in rec.PROJET_ASSOCIE.split(", ")]
return projets if projets else []
Bonjour. Je fais un message dans ce fil car ça correspond assez bien à ma problématique.
J’ai créé dans une table COMMANDE un champ calculé à la création d’une ligne avec la formule user.Email. Je souhaite que ce champ soit une référence de ma table UTILISATEURS notamment pour récupérer le service du demandeur automatiquement. Malheureusement il s’affiche en rouge et la liaison de se fait pas… une idée ?
@audezu@celine ,
Votre astuce marchait bien jusqu’ici et je m’en sers souvent. Mais voilà, sans savoir pourquoi cela ne fonctionne pas avec un champ, ChercheSIRET. Votre expertise est la bienvenue.
class Table_de_travail:
@grist.formulaType(grist.Reference('TR_Exploitants'))
def ChercheSIRET(rec, table):
result = TR_Exploitants.lookupOne(N_SIRET=rec.Recherche).N_SIRET
return result if (result and len(rec.Recherche)==14) else None
@grist.formulaType(grist.Reference('TR_Exploitants'))
def CherchePacage(rec, table):
result = TR_Exploitants.lookupOne(Pacage=rec.Recherche)
return result if (result and len(rec.Recherche)==9) else None
class TR_Exploitants:
Pacage = grist.Text()
N_SIRET = grist.Text()
class Table_de_travail:
@grist.formulaType(grist.Reference('TR_Exploitants'))
def ChercheSIRET(rec, table):
result = TR_Exploitants.lookupOne(N_SIRET=rec.Recherche)
return result if (result and len(rec.Recherche)==14) else None
@grist.formulaType(grist.Reference('TR_Exploitants'))
def CherchePacage(rec, table):
result = TR_Exploitants.lookupOne(Pacage=rec.Recherche)
return result if (result and len(rec.Recherche)==9) else None
class TR_Exploitants:
Pacage = grist.Text()
N_SIRET = grist.Text()