Aller au contenu principal

Étapes

Une étape est une unité de travail d'une tâche. Les étapes s'exécutent dans l'ordre ; quand l'une échoue, les suivantes sont enregistrées comme skipped: earlier step failed.

L'étape…Type
lance une requête nommée d'un connecteur SQLsql_query
copie une table entière d'un connecteur à un autresql_copy
charge un classeur ou un fichier CSV dans une tablefile_load
écrit le résultat d'une requête de lecture dans un fichier Excel ou CSVfile_export
appelle une fonction Python d'un pluginpython
appelle une URLhttp
lit un annuaire LDAP / Active Directory dans une tableldap_sync
lance une autre tâche et l'attendcall_job
produit un fichier Excel ou PDF à partir d'une analyse enregistrée, d'un tableau de bord ou d'un rapportreport
envoie un message, accompagné des fichiers de l'exécutionnotify

Dans l'éditeur de tâche, la barre Ajouter une étape : propose un bouton par type, et chaque étape ouvre un formulaire avec ses propres champs. Quelques clés n'existent que dans jobs.toml (signalées ci-dessous).


Vue d'ensemble​

Étapes · sales-copyAdd step:sql_querysql_copyfile_loadpythonhttpldap_synccall_jobsql_copycopy-F0101sourcejdedwards · PRODDTA · F0101targetwarehouse · public · f0101modeoverwrite ▾type_coercionjde ▾batch_size10000sql_queryrefresh-totalsSept types d'étapesSQL, fichier, Python, HTTP…Formulaire d'étapeles champs de son typeoverwritetable de travail échangéeExécution dans l'ordrereprises par étape

Champs communs​

ChampDéfautRemarques
name—Affiché dans le détail de l'exécution ; unique dans la tâche.
type—L'un des dix types.
enabledtruefalse saute l'étape (enregistrée comme skipped: disabled). Se règle dans jobs.toml, ou pour une exécution dans la fenêtre Exécuter avec des paramètres.
timeout_seconds3600L'étape est annulée passé ce délai. Se règle dans jobs.toml.
continue_on_failurefalsetrue : quand l'étape échoue (après ses tentatives), les suivantes s'exécutent quand même et l'exécution finit en échec en la nommant — pour une tâche qui enchaîne des traitements indépendants. Une case à cocher dans l'éditeur d'étape ; pour toutes les étapes d'une tâche, [jobs.step_defaults].

Désactiver une étape pour une installation. Une étape dont l'installation n'a pas besoin — la collecte LDAP sans LDAP — se liste dans disabled_steps = ["SECURITY_LDAP"] de la tâche (la case Désactivée pour cette installation de l'éditeur d'étape). Elle ne s'exécute jamais, même quand une exécution ou un préréglage sélectionne toutes les étapes : la fenêtre Exécuter avec des paramètres la montre désactivée et non sélectionnable, l'exécution l'enregistre comme skipped: turned off for this install. Contrairement à enabled — la valeur par défaut qu'une exécution peut remplacer — c'est le dernier mot de l'exploitant, et l'installateur des applications sous licence la conserve d'une mise à jour à l'autre.

Quand une étape échoue sur une erreur de base de données, le détail de l'exécution affiche la phrase de la base elle-même — invalid input for query argument $1: 2025 (expected str, got int) — et l'instruction part dans le journal du serveur.


Requête SQL — sql_query​

Lance une requête nommée d'un connecteur SQL — une requête définie sur la page du connecteur, en lecture ou en écriture.

ChampRequisRemarques
connectorouiLe connecteur SQL.
queryouiLe nom de la requête, pas du texte SQL.
paramsnonLes valeurs liées aux paramètres de la requête.
poolnonUn autre pool de l'ensemble du connecteur — voir Connecteurs multi-pools. Uniquement dans jobs.toml.

Enregistre le nombre de lignes renvoyées ou modifiées. Pour rafraîchir une vue matérialisée, appeler une procédure ou purger une table, écrire l'instruction comme une requête du connecteur, puis l'appeler ici.


Copie SQL — sql_copy​

Transfère les lignes d'une table source vers une table cible, éventuellement sur une autre base.

ChampDéfautRemarques
source = {connector, schema, table}—Requis. pool peut s'y ajouter (uniquement dans jobs.toml).
target = {connector, schema, table}—Requis. Idem.
modeoverwriteoverwrite : les lignes sont écrites dans une table de travail <table>__new, qui remplace ensuite la cible en une transaction — la cible n'est jamais vide pendant la copie. append : les lignes s'ajoutent à la cible telle quelle.
type_coercionjdejde applique les règles JD Edwards (décimales implicites, dates juliennes, codes complétés d'espaces) ; none copie les valeurs telles quelles.
decimal_modetruncateAvec jde : tronquer (truncate) ou conserver (preserve) la partie décimale.
batch_size10000Lignes par lot.
strip_both_columns[]Colonnes dont les valeurs sont débarrassées des espaces des deux côtés.

upsert est accepté par le schéma mais refusé à l'exécution : pour un ajout ou une mise à jour, écrire une requête MERGE / ON CONFLICT et l'appeler avec sql_query. Enregistre le nombre de lignes écrites.


Chargement de fichier — file_load​

Charge un classeur Excel (.xlsx, .xlsm) ou un fichier texte (.csv, .txt, .tsv) dans une table — selon une planification, sans personne au clavier, aux volumes d'une table de faits, et rejouable pour une période sans toucher aux autres.

Le fichier​

Le fichier vient, par ordre de priorité :

  1. d'un fichier choisi au lancement de la tâche — la fenêtre Exécuter avec des paramètres affiche un sélecteur de fichier pour chaque étape file_load (la fenêtre s'ouvre pour toute tâche qui en contient une), de même que la page de la tâche ouverte depuis le menu d'une application, pour les étapes sans path ni dossier surveillé ;
  2. de path — un chemin sur le serveur, qui peut contenir ${params.x} (un paramètre d'exécution), ${run.id} et ${job.id} : /data/in/sales-${params.period}.xlsx ;
  3. d'un dossier surveillé — watch_dir et watch_pattern (*.xlsx) : chaque fichier correspondant est chargé dans l'ordre des noms, chacun dans sa propre transaction, puis déplacé dans done/ ou failed/ sous un nom horodaté. Un fichier en échec arrête l'exécution ; les fichiers suivants restent dans le dossier. Un dossier vide n'est pas une erreur.
ChampDéfautRemarques
sheetpremière feuilleUn nom ou un numéro (1 = la première).
header_row1La ligne des en-têtes de colonnes ; les données commencent en dessous. Les lignes vides sont ignorées.
delimiterdétectéSéparateur CSV ; détecté parmi ; , tabulation `
encodingutf-8-sigCSV uniquement.

La cible​

ChampRemarques
target = {connector, schema, table}Un connecteur SQL ; la table doit exister.
columnsColonne cible ← en-tête du fichier ou position (#3). Les en-têtes se retrouvent sans tenir compte de la casse, des espaces, de _ et de - ; les colonnes non citées se retrouvent par leur nom.
constantsColonne cible ← valeur, pour ce que le fichier ne porte pas : period = "${params.period}", batch_id = "${run.id}".

Chaque cellule est convertie au type de sa colonne cible : entiers, décimaux (12,5 et 12.5 donnent tous deux 12,5 ; une virgule seule est le séparateur décimal), dates (2026-10-27, 27/10/2026, 27.10.2026, 20261027, et dates Excel), booléens (1, true, yes, oui…), texte. Un nombre saisi comme texte ne retrouve pas les zéros de tête que le tableur a déjà retirés.

Mode de chargement​

ChampChoix
load_modeappend (défaut) ajoute les lignes. replace_partition supprime d'abord les lignes des partitions présentes dans le fichier, puis insère — en une seule transaction : un chargement en échec laisse les données précédentes en place, et un mois corrigé ne remplace que ce mois.
partition_byLes colonnes de partition (period, company) — obligatoires avec replace_partition. Les partitions viennent des constantes quand elles couvrent toutes les colonnes, sinon des valeurs distinctes trouvées dans le fichier.
on_errorfail (défaut) : la première cellule invalide fait échouer l'étape et cite la ligne. skip : les lignes invalides sont comptées comme rejetées et écrites dans un CSV (fichier, ligne, motif) proposé dans le détail de l'exécution.
batch_size10000 lignes par insertion.

Garde-fous​

ChampRemarques
refuse_queryUne requête nommée lancée avant toute écriture, avec les paramètres d'exécution et les constantes comme paramètres liés. Avec partition_by, elle s'exécute une fois par partition présente dans le fichier, les colonnes de partition servant de paramètres liés (:YEAR, :MONTH, :COMPANY_CODE) : la garde suit le fichier, et non un paramètre saisi au lancement. Si elle renvoie une ligne, le chargement est refusé et la première colonne en donne le motif : période 2026-02 clôturée. refuse_connector : son connecteur, celui de la cible par défaut.
control_column + control_totalLa colonne est sommée sur les lignes chargées et comparée à une valeur, à ${params.total} ou à une cellule du fichier (@B2, @Totaux!B2), à control_tolerance près. Un écart annule le chargement du fichier et cite les deux montants.

Dans l'exécution​

Le détail de l'exécution affiche N read · N inserted · N rejected et, quand des lignes ont été rejetées, Rejected rows (csv) pour les télécharger. Le journal ajoute les partitions remplacées et les lignes supprimées.

Les fichiers envoyés et les fichiers de rejets vont dans la zone de travail des tâches, .nomaflow/files à côté de la configuration ; un envoi est limité à 200 Mo.

jobs.toml
[[jobs.steps]]
type = "file_load"
name = "load-sales"
path = "/data/in/ventes-${params.period}.xlsx"
sheet = "Ventes"
target = { connector = "sales", schema = "public", table = "fact_sales" }
columns = { company = "Société", article = "Article", qty = "Quantité", revenue = "CA" }
constants = { period = "${params.period}", batch_id = "${run.id}" }
load_mode = "replace_partition"
partition_by = ["period", "company"]
refuse_query = "period_closed_get"
control_column = "revenue"
control_total = "@Totaux!B2"

Python — python​

Appelle une fonction d'un plugin : callable = "paquet.module:fonction".

ChampRemarques
callablemodule.chemin:fonction — forme vérifiée à l'enregistrement, import au lancement de l'étape.
op_kwargsLes arguments passés à la fonction, fusionnés par-dessus les paramètres partagés de la tâche.

La fonction reçoit ses arguments par mot-clé et, quand elle les déclare par leur nom, connectors (le registre des connecteurs), ctx (l'exécution : ctx.run_id, ctx.job_id, ctx.trigger) et settings. Elle peut être async ou non. Sa valeur de retour : un int donne le nombre de lignes modifiées, un dict est conservé comme détail de l'étape, None convient ; une exception fait échouer l'étape. Pour écrire dans le journal de l'exécution, utiliser un logger d'un espace de noms enregistré. Le contrat complet se trouve dans Écrire un callable.


HTTP — http​

ChampDéfautRemarques
url—Requis. Utilisée telle quelle.
methodGETGET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS.
headers{}Envoyés tels quels.
bodyaucunDu texte, ou une table envoyée en JSON (avec Content-Type: application/json si aucun n'est défini).

Une réponse 2xx réussit ; toute autre fait échouer l'étape avec le code. L'étape conserve le code, les 4 premiers Ko de la réponse et la durée. Les valeurs de l'environnement s'écrivent ${NOM} dans jobs.toml et sont remplacées au chargement du fichier.


Synchronisation LDAP — ldap_sync​

Lit des entrées d'un annuaire LDAP et lance une requête d'écriture d'un connecteur SQL pour chacune.

ChampRemarques
serverldaps://ad.example.com:636.
bind_dn, bind_passwordLe compte de lecture ; écrire le mot de passe ${LDAP_PASSWORD}.
search_base, search_filterOù et quoi chercher : DC=example,DC=com, (objectClass=user).
attributesLes attributs à lire.
target_connector, target_queryLa requête d'écriture lancée pour chaque entrée.
mappingAttribut LDAP → paramètre de la requête. Un attribut absent donne NULL.

Enregistre le nombre d'entrées lues et de lignes écrites.


Lancer une tâche — call_job​

target_job_id désigne une autre tâche. L'étape la lance, attend sa fin et en prend le résultat : succès, échec ou annulation. La tâche appelée a sa propre exécution dans l'historique et reprend le niveau de journal et les paramètres d'exécution de l'appelante. Une tâche qui finirait par s'appeler elle-même est refusée.


Rapport — report​

Produit un document dans la zone de travail de l'exécution : une analyse ou un tableau de bord enregistré de l'explorateur de données, ou un rapport d'un plugin. Suivie d'une étape notify, elle fait d'une synthèse planifiée une tâche ordinaire.

sales-monthly-digestChiffre d'affaires par business unit, rendu le mois dernier et envoyéreportrevenueanalysis:revenue_by_business_unit → xlsxQUOI RENDRESourceUne analyse enregistrée (Explorateur) ▾Modèle d'explorationSales · sales ▾AnalysesCA par business unit ▾FormatExcel ▾Nom du fichiermonthly-salesPériodeMois dernier ▾Rendre comme l'utilisateurcfoRendre comme le rôleSans restriction ▾notifysendMESSAGEDestinatairesrole:managementemail:cfo@example.comObjetSynthèse des ventes {DATE}Joindre (fichiers du run ; ∗ = tous)∗CanauxportalemailObjet enregistréanalyses et tableaux partagésVisibilitépérimètre d'un utilisateur ou d'un rôleFichiers du run jointstous, ou par nomPériode prédéfiniesinon celle de l'analyseMarqueurs{JOB} {RUN_ID} {FILES} {DATE}
Champ (éditeur)Remarques
SourceUne analyse enregistrée (Explorateur), Un tableau de bord d'analyses (Explorateur) — une section par tuile — ou Un rapport (plugin).
Modèle d'exploration, Analyses / Tableaux de bordLe modèle, puis l'une de ses analyses ou l'un de ses tableaux de bord partagés. Un élément privé n'est pas proposé.
RapportPour un rapport de plugin : le rapport, parmi ceux des applications installées.
FormatExcel ou PDF — les mêmes documents que l'export de l'explorateur, graphiques dessinés dans le PDF.
PériodeUn préréglage (Mois dernier, Ce trimestre, 7 derniers jours…, ou toutes les dates), ou La période propre de l'analyse.
Nom du fichierLe nom du fichier ; par défaut, le titre de l'analyse.
Rendre comme l'utilisateurLe document contient ce que voit cet utilisateur : le périmètre de données de ses rôles, avec ses attributs. Une synthèse rendue pour le responsable d'une société ne contient que cette société.
Rendre comme le rôleLe périmètre de données d'un rôle. Une règle dont les valeurs viennent d'un attribut utilisateur n'autorise rien dans ce cas : pour ces rôles, préférer Rendre comme l'utilisateur.

Pour un rapport de plugin, les paramètres de l'exécution — ceux de la tâche, ceux choisis au lancement, les paramètres utilisateur — sont transmis au rapport en plus de ceux de l'étape, convertis dans le type que déclare le rapport (un nombre reste un nombre) ; une valeur vide laisse la valeur par défaut du rapport.

Sans utilisateur ni rôle, le document est sans restriction. Le détail de l'exécution propose le fichier au téléchargement sous l'étape ; le journal le nomme avec sa taille.


Notification — notify​

Envoie un message par les canaux de notification, accompagné des fichiers produits par l'exécution.

Champ (éditeur)Remarques
Destinatairesuser:<identifiant>, role:<rôle> ou email:<adresse>, un par ligne.
Objet, CorpsTexte avec marqueurs : {JOB}, {RUN_ID}, {FILES} (les noms des fichiers joints), {DATE} (la date du jour).
Joindre (fichiers du run ; * = tous)* joint tous les fichiers produits par l'exécution — chaque report, et les lignes rejetées d'un file_load ; sinon, nommer les fichiers. Un fichier nommé que l'exécution n'a pas produit fait échouer l'étape.
Canauxportal (la cloche) et email. Le compte de messagerie est celui des notifications.

Le message renvoie vers l'exécution. Le détail de l'exécution liste les fichiers joints sous l'étape.

jobs.toml — une synthèse mensuelle
[[jobs.steps]]
type = "report"
name = "revenue"
report = "analysis:revenue_by_business_unit"
app = "sales"
model = "sales"
format = "pdf"
period = "lastMonth"
as_user = "cfo"

[[jobs.steps]]
type = "notify"
name = "send"
recipients = ["role:management"]
subject = "Synthèse des ventes {DATE}"
body = "La synthèse mensuelle des ventes est jointe : {FILES}."
attach = ["*"]

Planifier la tâche le premier du mois (cron 0 7 1 * *) — voir Planifications.


Export de fichier — file_export​

Écrit le résultat d'une requête de lecture nommée dans un fichier de la zone de travail de l'exécution — pour qu'un autre système le récupère, ou qu'une étape notify le joigne. Une requête d'écriture est refusée.

Champ (éditeur)Remarques
Connecteur, RequêteLa requête de lecture à exécuter.
ParamètresSes paramètres liés ; ceux de l'exécution sont transmis aussi. Une valeur peut utiliser ${params.x}.
FormatExcel (xlsx) (par défaut) ou CSV.
Nom du fichier (par défaut : la requête)Peut utiliser ${params.x} et ${run.id} : sales-${params.period}.
FeuilleExcel seulement — le nom de la requête par défaut.
Séparateur CSV, EncodageCSV seulement — ; et utf-8-sig par défaut.
Copier aussi dans ce dossier (optionnel)Un dossier du serveur où une copie est également écrite, créé s'il n'existe pas : /data/out/${params.period}.

Les lignes sont lues dans la base au fil de l'eau, dans la limite de lignes du connecteur — le journal indique quand l'export a été plafonné. La ligne d'en-tête porte les libellés des colonnes ; les colonnes masquées sont écartées. Le détail de l'exécution propose le fichier sous l'étape, et la rétention de la zone de travail s'y applique — pas à la copie dans l'autre dossier.


Réessais et délais​

Le bloc Politique de réessai de la tâche (attempts, backoff fixe ou exponentiel, base_seconds) s'applique à chaque étape : une étape est tentée jusqu'à attempts fois au total (1, la valeur par défaut, signifie aucune nouvelle tentative), avec une attente de base_seconds entre deux tentatives — constante, ou doublée à chaque fois avec exponential. La tâche entière s'arrête après timeout_seconds (4 heures par défaut).