Référence

Boucles, listes et filtres dans un flux

Traiter une liste élément par élément, reprendre là où le flux s'était arrêté, préparer des lignes de document et mettre en forme les valeurs entre Odoo et Sage 100.

9 min de lectureMis à jour le 11 novembre 2026

Une synchronisation entre deux logiciels traite presque toujours des listes : les clients modifiés dans Odoo depuis hier, les lignes d'une commande, les articles d'un dossier Sage. L'éditeur de flux propose trois outils pour cela, sans écrire de code : l'étape Pour chaque élément, l'étape Mettre en forme une liste et les filtres, qui ajustent une valeur avant de l'envoyer.

Pour chaque élément

Cette étape reçoit une liste renvoyée par une étape précédente, par exemple {{step_2}} pour les clients lus dans Odoo, ou {{step_2.records}} pour les fiches trouvées dans Sage. Elle a deux sorties :

  • Chaque élément : les étapes reliées à cette sortie s'exécutent une fois par élément de la liste, dans l'ordre. Le bouton { } y propose l'élément en cours ({{step_3.item.name}}, {{step_3.item.email}}…) et sa position.
  • Ensuite : les étapes reliées à cette sortie s'exécutent une fois, quand toute la liste a été traitée. Elles peuvent utiliser le bilan de la boucle : nombre d'éléments, réussis et en échec.

Lire la liste

Ajoutez l'étape qui lit les données, par exemple une recherche Odoo sur les clients ou l'outil Sage 100 de recherche de fiches.

Ajouter la boucle

Sélectionnez cette étape, puis cliquez sur Pour chaque élément dans la colonne de gauche (sur un téléphone, sous Ajouter une étape). Indiquez la liste à parcourir avec le bouton { }.

Ajouter les étapes de chaque élément

La boucle sélectionnée, ajoutez l'étape à exécuter pour chaque élément, par exemple l'outil Sage 100 qui crée ou modifie un tiers. Les étapes suivantes s'ajoutent à la suite, toujours dans la boucle.

Choisir ce qui se passe en cas d'erreur

Par défaut, le flux s'arrête au premier élément en échec. Choisissez Continuer avec les éléments suivants pour traiter toute la liste : les étapes de Ensuite s'exécutent quand même, avec le bilan et la liste des éléments en échec (pour les signaler à un autre logiciel, par exemple), puis le flux est marqué en échec, avec le nombre d'éléments concernés. Avec un point de reprise, dans un flux planifié, chaque élément en échec est gardé et relancé tout seul (voir plus bas). Le même choix se fait pour toutes les boucles du flux à la fois sur sa première étape (planification ou déclencheur), sous Si un élément échoue : Passer à l'élément suivant ou Arrêter l'exécution. Les flux créés depuis la galerie passent à l'élément suivant.

Une boucle traite 100 éléments par exécution, jusqu'à 1000 si vous le réglez. Pour une liste plus longue, lisez les données par paquets (limite de la recherche) et laissez le point de reprise avancer d'une exécution à l'autre. Un flux qui contient une boucle peut s'exécuter pendant 15 minutes. Dans l'historique des exécutions, les étapes des trois premiers éléments et de chaque élément en échec sont détaillées, numérotées par élément ; pendant l'exécution, le nombre d'éléments déjà traités s'affiche (« Pour chaque article : 12 sur 50 »), puis l'étape de la boucle donne le bilan (réussis, en échec).

À la fin de chaque exécution, Écrit dans Sage et Odoo compte ce que le flux a créé, modifié ou supprimé, pour tous les éléments et pas seulement les trois détaillés : par exemple « Articles Sage : 4 créations · 2 modifications ». Détail donne les fiches concernées, référence et nom (les 500 premières de chaque sorte). La liste des exécutions reprend ce bilan en une ligne. Une liste recopiée en une fois, comme les listes de prix, n'en donne que le nombre.

Une boucle reste fermée

Une étape exécutée pour chaque élément ne peut mener qu'à d'autres étapes de la même boucle. Pour continuer après la liste, partez de la sortie Ensuite. Une boucle ne peut pas en contenir une autre.

Reprendre là où le flux s'était arrêté

Un flux planifié qui synchronise vos clients toutes les heures ne doit relire que ce qui a changé. Pour suivre Sage presque en temps réel, planifiez-le toutes les quelques minutes (1, 2, 5, 10, 15 ou 30) : une exécution plus longue que l'intervalle n'est jamais doublée, la suivante part à sa fin. Le point de reprise d'une boucle sert à cela : après chaque élément traité, le flux garde les valeurs que vous choisissez, puis l'exécution suivante les relit avec {{trigger.cursor}}.

Exemple avec Odoo : dans les réglages de la boucle, ajoutez au point de reprise at = {{step_3.item.write_date}}. Dans la recherche Odoo qui précède, filtrez sur la date de modification :

[["write_date", ">", "{{trigger.cursor.at | default:1970-01-01}}"]]

triez par write_date croissant et limitez la recherche à 100 clients. La première exécution reprend tout depuis le début, les suivantes seulement les clients modifiés depuis.

Quand une exécution planifiée traite un lot complet (autant d'éléments que la limite de la boucle), le flux repart aussitôt pour le lot suivant au lieu d'attendre l'heure prévue, jusqu'à un lot incomplet : une première synchronisation de 5 000 fiches ne prend pas 100 heures. Pour cela, gardez la même limite pour la recherche et pour la boucle. Le flux n'enchaîne pas après un arrêt sur un élément en échec ni quand aucun élément n'a réussi. Un test depuis l'éditeur ne déplace jamais le point de reprise : il repart toujours du même endroit et ne lance pas le lot suivant. Pour une vraie exécution sans attendre l'heure prévue, cliquez sur Lancer maintenant : le flux enregistré s'exécute, le point de reprise avance et, si le flux est actif, les lots s'enchaînent jusqu'au dernier. En pause, un seul lot est traité à chaque clic.

Avec Sage 100, la colonne de date de modification de chaque fiche (cbModification) joue le même rôle dans les filtres de l'outil de recherche.

Le point de reprise n'avance pas pendant un test depuis l'éditeur. Il s'affiche dans les réglages du déclencheur et de la boucle, avec le bouton Repartir du début pour tout reprendre.

Relances automatiques

Une commande qui ne passe pas parce qu'Odoo, Sage ou la passerelle ne répond pas n'est pas perdue. Dans un flux planifié dont la boucle continue après une erreur et garde un point de reprise (c'est le cas de tous les modèles de la galerie), chaque élément en échec est gardé, chiffré, puis :

  • erreur passagère (service injoignable, délai dépassé, passerelle hors ligne, fiche verrouillée, client pas encore synchronisé) : l'élément est relancé tout seul, sans relire tout le reste, après 5 minutes, 15 minutes, 1 heure, puis toutes les 4 heures, pendant 24 heures ;
  • erreur définitive (Odoo ou Sage refuse les données : champ invalide, article inconnu, compte en sommeil), ou toujours en échec au bout de 24 heures : l'élément est mis de côté dans l'onglet À traiter du flux.

Dans À traiter, chaque élément montre sa référence (numéro de pièce, référence article…) et son erreur. Corrigez la cause, dans Odoo, dans Sage ou dans le flux, puis cliquez sur Relancer ; Ignorer l'écarte. Un élément modifié entre-temps dans le logiciel d'origine repasse aussi tout seul. La liste des flux affiche le nombre d'éléments à traiter et en relance.

Si le flux échoue avant même de lire ses éléments pour une raison passagère, par exemple la passerelle hors ligne, il est relancé aux mêmes délais, sans attendre sa prochaine exécution planifiée. Il reprend là où il s'était arrêté.

Les administrateurs du client et de l'intégrateur reçoivent un e-mail quand des éléments passent dans À traiter (au plus un par flux et par heure), quand un flux échoue depuis 24 heures pour une raison passagère puis quand il fonctionne de nouveau, et quand un flux s'arrête sur une erreur qui demande une intervention. Une relance qui réussit ne donne lieu à aucun e-mail.

Pour vos propres flux

Un élément peut être relancé alors qu'une partie de ses étapes avait déjà abouti, par exemple quand Odoo a créé la commande sans répondre à temps. Avant de créer, vérifiez qu'il n'existe pas déjà, comme le font les modèles de la galerie avec « Déjà dans Sage ? ».

Mettre en forme une liste

Certaines étapes attendent une liste dans un format précis : un document de vente Sage attend des lignes avec un article, une quantité et un prix. L'étape Mettre en forme une liste construit cette liste à partir d'une autre.

Exemple : transformer les lignes d'une commande Odoo en lignes Sage.

ChampValeur
article{{step_5.item.product_id.default_code}}
quantite{{step_5.item.product_uom_qty}}
prix_unitaire{{step_5.item.price_unit}}

Activez Ne garder que certains éléments pour écarter les titres de section et les notes : {{step_5.item.display_type | not}} est égal à true. Vous pouvez aussi mettre plusieurs listes bout à bout (par exemple les lignes de la commande puis une ligne de frais de port), ou choisir Une seule valeur pour obtenir une liste simple, comme les identifiants. Une liste mise en forme compte jusqu'à 50 000 éléments.

Les filtres

Un filtre ajuste une valeur avant de l'envoyer. Il s'écrit après la donnée, séparé par une barre verticale, et plusieurs filtres s'enchaînent :

{{step_3.item.name | text | truncate:35 | upper}}
FiltreEffetExemple
default:valeurValeur de remplacement si la donnée est absente ou vide{{step_3.item.ref | default:"À compléter"}}
textTexte simple ; un champ vide d'Odoo (false) devient un texte vide{{step_3.item.street | text}}
upper, lower, trimMajuscules, minuscules, espaces retirés{{step_3.item.ref | upper}}
truncate:nGarde les n premiers caractèresIntitulé Sage limité à 35 caractères
pad:n, padstart:nComplète par des zéros à droite ou à gaucheCompte 411000 en 41100000 avec pad:8
digitsGarde seulement les chiffresSIRET ou téléphone
suffix:texteAjoute un texte après une valeur non vide, rien si elle est videPrénom puis espace : {{step_3.item.CT_Prenom | text | suffix:" "}}
abs, round:nValeur absolue, arrondi{{step_3.item.balance | abs}}
sign:a:ba si le nombre est positif ou nul, sinon b{{step_3.item.balance | sign:debit:credit}}
bool, notVrai ou faux, ou l'inverse{{step_3.item.active | not}}
dateGarde la date au format AAAA-MM-JJ{{step_3.item.invoice_date | date}}
first, joinPremier élément d'une liste, liste écrite en texte{{step_2.tags | join:" / "}}
chooseRemplace une valeur par une autre ; * pour toute autre valeur{{step_2.usage | choose:"vente=sale;achat=purchase"}}

Un texte qui contient : ou | s'écrit entre guillemets doubles : default:"Sans adresse : à vérifier".

Les champs vides d'Odoo

Odoo renvoie false pour un champ vide. Mettez text avant les filtres de texte ({{step_3.item.city | text | upper}}) et, dans une condition, comparez {{step_3.item.ref | text}} avec est vide.

Un filtre inconnu ou mal écrit est signalé à l'enregistrement du flux. Pour lancer un flux depuis un autre logiciel, voir aussi Lancer un flux par API.