Bonjour à tous j’ai trouvé une solution à mon problème àtravers le bouton widget. En m’aidant de cette publication : https://forum.grist.libre.sh/t/vue-personnalisee-pour-importer-des-donnees-dune-table-dans-une-autre/873/5
J’ai donc créé une table Maintenance avec une colonne action ou j’ai appliqué le code suivant cela m’a permis de récupérer les informations de plusieurs tables sur une table. Si cela peut servir à quelqu’un
actions = []
# ---------- Compteurs par source ----------
removed_a = removed_p = removed_t = removed_v = removed_e = 0
updated_a = updated_p = updated_t = updated_v = updated_e = 0
created_a = created_p = created_t = created_v = created_e = 0
# ---------- Récupération de l'ID (référence) du dossier ----------
def get_dossier_id(obj):
d = getattr(obj, "Dossier", None)
return d.id if d else None
# ========= 0) Sets d'IDs vivants en source (pour purge) =========
ids_ad = set(r.id for r in Adresses.lookupRecords())
ids_pe = set(r.id for r in Personnes.lookupRecords())
ids_te = set(r.id for r in Telephones.lookupRecords())
ids_ve = set(r.id for r in Vehicules.lookupRecords())
# Emails peut ne pas exister selon le doc → on sécurise
try:
_emails = Emails.lookupRecords()
ids_em = set(r.id for r in _emails)
except NameError:
_emails = []
ids_em = set()
# ========= 1) PURGE des lignes orphelines =========
for row in Ref_ValeursUniques.lookupRecords():
ts = getattr(row, "TypeSource", None)
sid = getattr(row, "SourceRowId", None)
if ts == "Adresses" and sid not in ids_ad:
actions.append(["RemoveRecord", "Ref_ValeursUniques", row.id]); removed_a += 1
elif ts == "Personnes" and sid not in ids_pe:
actions.append(["RemoveRecord", "Ref_ValeursUniques", row.id]); removed_p += 1
elif ts == "Telephones" and sid not in ids_te:
actions.append(["RemoveRecord", "Ref_ValeursUniques", row.id]); removed_t += 1
elif ts == "Vehicules" and sid not in ids_ve:
actions.append(["RemoveRecord", "Ref_ValeursUniques", row.id]); removed_v += 1
elif ts == "Emails" and sid not in ids_em:
actions.append(["RemoveRecord", "Ref_ValeursUniques", row.id]); removed_e += 1
# ========= 2) ADRESSES : upsert =========
for r in Adresses.lookupRecords():
lib = getattr(r, "LibelleSource", None)
if not lib:
continue
sid = r.id
exist = Ref_ValeursUniques.lookupRecords(TypeSource="Adresses", SourceRowId=sid)
did = get_dossier_id(r)
base = {"TypeSource": "Adresses", "SourceRowId": sid, "RefAdresse": lib}
if exist:
data = dict(base)
if did is not None:
data["Dossier"] = did # référence (ID)
actions.append(["UpdateRecord", "Ref_ValeursUniques", exist[0].id, data]); updated_a += 1
else:
data = dict(base)
if did is not None:
data["Dossier"] = did
actions.append(["AddRecord", "Ref_ValeursUniques", None, data]); created_a += 1
# ========= 3) PERSONNES : upsert =========
for p in Personnes.lookupRecords():
lib = getattr(p, "LibelleSource", None)
if not lib:
continue
sid = p.id
exist = Ref_ValeursUniques.lookupRecords(TypeSource="Personnes", SourceRowId=sid)
did = get_dossier_id(p)
base = {"TypeSource": "Personnes", "SourceRowId": sid, "RefPersonne": lib}
if exist:
data = dict(base)
if did is not None:
data["Dossier"] = did
actions.append(["UpdateRecord", "Ref_ValeursUniques", exist[0].id, data]); updated_p += 1
else:
data = dict(base)
if did is not None:
data["Dossier"] = did
actions.append(["AddRecord", "Ref_ValeursUniques", None, data]); created_p += 1
# ========= 4) TELEPHONES : upsert =========
for t in Telephones.lookupRecords():
lib = getattr(t, "LibelleSource", None)
if not lib:
continue
sid = t.id
exist = Ref_ValeursUniques.lookupRecords(TypeSource="Telephones", SourceRowId=sid)
did = get_dossier_id(t)
base = {"TypeSource": "Telephones", "SourceRowId": sid, "RefTelephone": lib} # adapte le nom si Ref_telephone
if exist:
data = dict(base)
if did is not None:
data["Dossier"] = did
actions.append(["UpdateRecord", "Ref_ValeursUniques", exist[0].id, data]); updated_t += 1
else:
data = dict(base)
if did is not None:
data["Dossier"] = did
actions.append(["AddRecord", "Ref_ValeursUniques", None, data]); created_t += 1
# ========= 5) VEHICULES : upsert =========
for v in Vehicules.lookupRecords():
lib = getattr(v, "LibelleSource", None)
if not lib:
continue
sid = v.id
exist = Ref_ValeursUniques.lookupRecords(TypeSource="Vehicules", SourceRowId=sid)
did = get_dossier_id(v)
base = {"TypeSource": "Vehicules", "SourceRowId": sid, "RefVehicule": lib} # adapte si Ref_Vehicule
if exist:
data = dict(base)
if did is not None:
data["Dossier"] = did
actions.append(["UpdateRecord", "Ref_ValeursUniques", exist[0].id, data]); updated_v += 1
else:
data = dict(base)
if did is not None:
data["Dossier"] = did
actions.append(["AddRecord", "Ref_ValeursUniques", None, data]); created_v += 1
# ========= 6) EMAILS : upsert (si la table existe) =========
for e in _emails: # vide si Emails n'existe pas
lib = getattr(e, "LibelleSource", None)
if not lib:
continue
sid = e.id
exist = Ref_ValeursUniques.lookupRecords(TypeSource="Emails", SourceRowId=sid)
did = get_dossier_id(e)
base = {"TypeSource": "Emails", "SourceRowId": sid, "RefEmail": lib}
if exist:
data = dict(base)
if did is not None:
data["Dossier"] = did
actions.append(["UpdateRecord", "Ref_ValeursUniques", exist[0].id, data]); updated_e += 1
else:
data = dict(base)
if did is not None:
data["Dossier"] = did
actions.append(["AddRecord", "Ref_ValeursUniques", None, data]); created_e += 1
# ========= 7) Message multi-lignes =========
msg = f"""
✅ Synchronisation terminée
🧹 Purge
• Adresses : {removed_a}
• Personnes : {removed_p}
• Téléphones : {removed_t}
• Véhicules : {removed_v}
• Emails : {removed_e}
🏠 Adresses — MAJ : {updated_a} | Créées : {created_a}
👤 Personnes — MAJ : {updated_p} | Créées : {created_p}
📞 Téléphones — MAJ : {updated_t} | Créées : {created_t}
🚗 Véhicules — MAJ : {updated_v} | Créées : {created_v}
📧 Emails — MAJ : {updated_e} | Créées : {created_e}
⚙️ Dossier est écrit en RÉFÉRENCE (ID) et n'est pas écrasé s'il est absent côté source.
"""
return {
"button": "Synchroniser les tables",
"description": msg,
"actions": actions
}