Accès aux données
Les fonctions d'accès aux données vous permettent de rechercher et récupérer des objets depuis votre base de données directement dans vos formules.
Recherche d'objets
findObject(typeObjet, requete)
Recherche et retourne un seul objet correspondant aux critères. Si plusieurs correspondent, seul le premier est retourné.
// Rechercher un client par son nom
findObject(client, { name: "ACME Corp" })
// Rechercher un client lié à la commande
findObject(client, { id: "{{commande.clientId}}" })
// Rechercher une facture spécifique
findObject(facture, { numero: "FAC-2025-001" })
// Utiliser l'objet trouvé
let monClient = findObject(client, { email: "contact@acme.com" });
monClient.nomAttention : Si aucun objet n'est trouvé, cette fonction peut générer une erreur. Utilisez exists pour vérifier ou ifError pour gérer ce cas.
findObjects(typeObjet, requete)
Recherche et retourne tous les objets correspondant aux critères sous forme de tableau.
// Récupérer tous les projets
findObjects(projet, {})
// Récupérer les commandes d'un client
findObjects(commande, { clientId: "{{client.id}}" })
// Accéder aux champs de tous les objets trouvés
findObjects(produit, {}).nom // Tableau des noms
// Combiner avec d'autres fonctions
let commandes = findObjects(commande, {});
client.commandes.map(commande => commande.total).sum()Bon à savoir : Une requête vide {}retourne tous les objets du type spécifié. C'est utile pour obtenir une liste complète.
Syntaxe des requêtes
Les requêtes utilisent une syntaxe inspirée de MongoDB (MEL Query). Voici les opérateurs disponibles.
Égalité simple
La forme la plus simple : { champ: valeur }
// Rechercher par nom
findObject(client, { name: "ACME Corp" })
// Rechercher par statut
findObjects(commande, { statut: "validée" })
// Rechercher par booléen
findObjects(facture, { payee: true })Opérateur $eq
Forme explicite de l'égalité. Utile avec des valeurs dynamiques.
// Égalité explicite
findObject(facture, { order: { $eq: "{{order}}" } })
// Équivalent à la forme simple
findObject(facture, { order: "{{order}}" })Critères multiples
Combinez plusieurs critères (tous doivent correspondre - ET implicite).
// Rechercher avec plusieurs critères
findObjects(commande, {
clientId: "{{client.id}}",
statut: "validée"
})
// Client actif dans une ville
findObjects(client, {
ville: "Paris",
actif: true
})Valeurs dynamiques
Vous pouvez utiliser l'interpolation "{{objet.champ}}" dans les requêtes pour passer des valeurs dynamiques. Enveloppez-les dans des guillemets si nécessaire.
Historique des statuts
objet.statusChangedAt(nomStatut)
Retourne la date à laquelle un objet est passé à un statut spécifique. Utile pour calculer des délais ou afficher des dates clés.
// Date de validation d'une commande
commande.statusChangedAt("validée")
// Date d'envoi d'une facture
facture.statusChangedAt("envoyée")
// Calculer le délai de traitement
let dateCreation = commande.dateCreation;
let dateValidation = commande.statusChangedAt("validée");
dateCreation.daysBetweenInclusive(dateValidation)Bon à savoir : Cette fonction recherche dans l'historique des changements de statut. Si l'objet n'a jamais eu ce statut, elle retourne une erreur.
Bonnes pratiques
✓ Stocker dans une variable
Si vous utilisez le résultat plusieurs fois, stockez-le dans une variable.
// ✓ Bon : une seule recherche
let client = findObject(client, { id: "{{commande.clientId}}" });
client.nom.concat(" - ", client.email)
// ✗ À éviter : deux recherches pour le même objet
findObject(client, { id: "{{commande.clientId}}" }).nom.concat(" - ",
findObject(client, { id: "{{commande.clientId}}" }).email
)✓ Filtrer après la recherche
Parfois il est plus clair de chercher puis filtrer.
// Récupérer puis filtrer
let commandes = findObjects(commande, {});
let commandesValidees = client.commandes.filter(commande => commande.statut === "validée");
let commandesRecentes = commandesValidees.filter(commandesValidee => commandesValidee.date > today() - 30
);⚠ Gérer l'absence de résultat
Vérifiez toujours si un objet a été trouvé avant de l'utiliser.
let client = findObject(client, { email: "{{email}}" }).ifError(null
);
client.exists()
? client.nom
: "Client non trouvé"Exemples pratiques
Calculer le chiffre d'affaires d'un client
let commandes = findObjects(commande, { clientId: "{{client.id}}" });
let commandesPayees = client.commandes.filter(commande => commande.statut === "payée");
let totaux = commandesPayees.map(commandesPayee => commandesPayee.totalTTC);
totaux.sum()Vérifier l'unicité d'un email
let emailExistant = findObject(client, { email: "{{nouveauClient.email}}" }).ifError(null
);
emailExistant.exists()
? "Cet email est déjà utilisé par " + emailExistant.nom
: "Email disponible"Trouver la dernière facture d'un client
let factures = findObjects(facture, { clientId: "{{client.id}}" });
let dates = client.factures.map(facture => facture.date);
let datePlusRecente = max(dates);
let derniereFacture = client.factures.find(facture => facture.date === datePlusRecente);
derniereFacture.exists()
? "Dernière facture : ".concat(derniereFacture.numero)
: "Aucune facture"Calculer le délai moyen de paiement
let factures = findObjects(facture, { payee: true });
let delais = client.factures.map(facture => facture.dateEmission.daysBetweenInclusive(facture.statusChangedAt("payée")
)
);
delais.average()Prochaine étape
Apprenez maintenant à gérer les erreurs et les valeurs manquantes pour des formules robustes.