Notion : les bases de données qui se respectent

Alors je ne pense pas que ce soit possible.
Je pense que c’est typiquement un cas de limite de notion (je suis en plein dedans et je viens de passer presque 2 jours à construire quelque chose qui me permette de déduire des valeurs d’une somme et d’avoir un retour visuel de la somme restante … à base de double DB, double agrégations etc … je partagerais quand j’aurais terminé de commenter tout ça).

Pour ton problème, l’une des solutions pourrait se trouver en externe, via des SaaS permettant des automatisations : Make, Zappier pour ne citer qu’eux.
En dehors de ça, j’avoue ne pas savoir (je suis plus bidouilleur qui finit par réussir à faire des trucs vaguement fonctionnels, qu’un expert du sujet).

Si je met en place un rollup sur un status, comment faire en sorte que « count per group » affiche un nombre unique ? Parce que par défaut, cela affiche un résultat relatif. Par exemple si j’ai 3 items en « To do » et 4 items en « In progress », en lançant le rollup, ça m’affiche « 3/7 ». Comment faire pour que cela affiche seulement « 3 » ?

L’idée étant ensuite de reprendre les résultats et de les afficher avec des beaux tags dynamiques, comme sur l’image (mais sans les moches « 3/7 »).

sINYqfARJP

Euh, je te dirais bien d’essayer avec une formule :
voir dans un 1er temps ce que te renvoi une formule avec uniquement le nom de la propriété (celle du rollup) et ensuite de voir ce que ça donne avec les opérateur des formules (sum(prop) et compagnie).
J’ai fais un truc similaire, sorte de hack, sur mon histoire de déduction d’une somme : faire un sum(prop) alors que la propriété est une agrégation (rollup) règle sur “afficher l’original”. Donc je dirais qu’il faut tester, ya parfois des associations résultat rollup/ formules qui peuvent donner le résultat que tu cherches.

C’est malheureusement bien au delà de mes capacités rachitiques en programmation, je pensais qu’il existerait un moyen plus basique !

Edit. J’ai parlé trop vite, avec un simple replaceAll, j’arrive à virer le « /7 » et à garder juste le 3. Bonne idée du coup, merci ! Maintenant faut que je trouve le moyen de rendre le remplacement dynamique, par exemple « vire moi le / et tout ce qu’il y a après »…

Oh, c’est pas dit. Je peux regarder dans le weekend, ou dans la semaine si je n’oublie pas :slight_smile:

Ok j’ai trouvé : replaceAll(prop("Active projects"), "/.*", "").

1 « J'aime »

J’ai trouvé une autre solution sans rollup sinon :

lets(
	count,
	prop("Projects").filter(current.prop("Status") == "In Progress" or current.prop("Status") == "On Hold").length(),
	ifs(
		count > 0,
		(
			count + " Active project" + ifs(count != 1, "s")
		).style("b","c","green","green_background")
	)
)
1 « J'aime »

Je partage ici un template à l’arrache pour @pierresnake pour expliquer grosso merdo comment faire pour « faire des relations sans faire de relations »

Avec l’explication :

Question Pierre :

Je cherche à faire une jointure entre deux DB existante, ou importer des propriétés dans une DB. Est-ce qu’on a des possibilités désormais la dessus ?
J’ai vu pour importer des lignes via CSV, faire une relation / aggrégation mais il faut faire le lien manuellement pour chaque ligne, bref rien pour « simplement » mettre à jour une propriété depuis une source de données en utilisant une clef.

Réponse Lorelei :

Ca s’automatise en quelque sorte, mais ce sera pas une « vraie » relation et c’est pas efficace en terme de perf à la fin : ça nécessite de créer une relation avec toutes les pages + formule pour faire le lien + template pour s’assurer que toutes les pages sont bien dans la relation. En bref possible mais suboptimal

Follow up Lorelei :

Très bien donc l’idée ça reste sur les relations évidemment, mais au lieu de les créer ligne par ligne, on lie toutes les pages ensemble et on utilise des formules pour faire le filtre.

Pour le setup:

  • Tu as deux bases DB1 et DB2
  • Tu crées une relation (à double sens) entre les 2
  • Tu ajoutes toutes les pages de DB1 dans la relation dans DB2 (ça peut s’automatiser avec un template dans DB1 qui va automatiquement ajouter une page à la relation dans DB2 et réciproquement)

Maintenant tu veux utiliser une clé pour filtrer, mettons qu’elle s’appelle key1 dans DB1 et key2 dans DB2 (oui je me suis foulée, je fais ce que je veux, c’est moi qui explique)

Dans la formule, la base ce sera quelque chose du genre (peut varier en fonction du type de propriété) : prop("DB1").filter(current.prop("key1") == prop("key2")) et inversement prop("DB2").filter(current.prop("key2") == prop("key1"))

Après tu peux rajouter ta popote pour récupérer des propriétés ou faire des calculs.
Exemples (dans DB2) :
prop("DB1").filter(current.prop("key1") == prop("key2")).length() ça compte les pages correspondantes dans DB1
prop("DB1").filter(current.prop("key1") == prop("key2")).map(current.prop("value")).sum() ça somme une propriété value des pages correspondantes dans DB1

Tu peux même avoir plusieurs clés ou bien des conditions plus sophistiquées : prop("DB1").filter(current.prop("prop1") == prop("prop2") and current.prop("Date") <= prop("Date")) (là on teste en plus si les dates de DB1 sont antérieures aux dates de DB2)

Je vais te faire un petit template rapide pour illustrer ce sera sûrement plus simple. Sur le papier c’est cool parce qu’à partir d’une seule relation tu peux tout recouper. Dans les faits niveau perf, ça peut ralentir pas mal.

Note en passant: prop("DB1").filter(current.prop("key1") == prop("key2")).map(current.prop("value")).sum() c’est un rollup mais filtré, l’équivalent en rollup ce serait juste prop("DB1").map(current.prop("value")).sum()

PS: Désolée j’ai inversé DB1 et DB2 dans le template par rapport à mes explications mais j’espère que le principe sera compris

TLDR; tu lies toutes les pages, tu mets dans la marmite et paf ça fait des Chocapic

4 « J'aime »

wunderbar !

Comme dit sur le discord, merci pour tout ça ! Je sens que ça va servir à pas mal de monde en plus.

1 « J'aime »

Le template du dredi qui utilise ce principe : faire un classement en fonction d’une valeur

La formule :
prop("All").sort(current.prop("Unit Sales")).reverse().findIndex(current.prop("Players") == prop("Players")) + 1

L’explication :

  • Toutes les pages sont dans la relation « All »
  • On trie la relation par Unit Sales avec prop("All").sort(current.prop("Unit Sales")).reverse() (ordre décroissant avec le reverse)
  • On cherche la position de la page courante (en utilisant le nom) dans cette liste avec .findIndex(current.prop("Players") == prop("Players"))
  • Et on ajoute 1 pour avoir un classement qui démarre à 1 (vu que les listes sont indexées à partir de 0)

image

On peut affiner éventuellement pour gérer les lignes avec les mêmes valeurs pour « Unit Sales »

1 « J'aime »