Une boucle Kesako ?
Dans l’ETL FME, on me demande souvent comment faire une boucle. C’est souvent un réflex de développeur car dans le monde classique du développement comme Python, PHP…les boucles sont omniprésentes. Dans ces langages on est habitué à utiliser des WHILE, des FOR et autre FOREACH.
La boucle permet de faire plusieurs itérations d’un morceau de code tant qu’une condition est vraie. Évidemment, dans une boucle, il faut absolument une condition de sortie, sinon l’outil tombera dans une boucle infinie et ne s’arrêtera pas. Il s’agit là d’un bug classique lorsque l’on utilise cette fonctionnalité.
Dis FME, pourquoi et comment créer une boucle
Dans FME et dans les 3/4 du temps, vous n’aurez pas à faire de boucle car cela est géré nativement dans les Transformers. On peut aussi s’en passer en utilisant les attributs de List ou encore le Transformer WorkspaceRunner qui permet d’exécuter des traitements par lot. Pour autant, il peut être parfois nécessaire de créer une boucle et cela tombe bien FME à prévu cette fonctionnalité !
Pour vous donner une idée plus précise de comment cela fonctionne dans FME, je vous propose un schéma ci-dessous :
On voit que les données arrivent en haut à gauche. A partir de là, nous créons deux attributs. Le premier NbLoopMax donne le nombre d’itération maximum de la boucle. Le second créer un compteur que l’on va incrémenter à chaque itération (chaque passage dans la boucle). Ensuite, vient le moment de vérifier avec un Tester si il n’est pas le moment de sortir de la boucle en comparant les valeurs de NbLoooMax et Compteur. Si compteur est inférieur à 10, on boucle et on ajoute à ce compteur +1. On fait alors le traitement que l’on souhaite X fois et la boucle reviens au point de départ et dès lors que l’attribut compteur vaut 10, la boucle s’arrête.
De la théorie à la pratique
Voilà pour la théorie, passons maintenant à la pratique avec FME Workbench 2020.1. Prenons notre exemple théorique du dessus, imaginons que nous souhaitions boucler 10 fois un traitement.
L’étape une consiste à développer la logique de la boucle.
Ensuite pour faire une boucle dans FME, il est nécessaire d’utiliser la fonctionnalité du Transformer Personnalisé. Je sélectionne les Transformers sauf le Creator et l’Inspector et sur un clic droit, je choisi Create Custom Transformer.
Je rentre alors un nom à ce Transformer Personnalisé, une description au besoin (la documentation, c’est toujours bien) et je fais OK. FME coupe alors les Transformers sélectionnés et créer un Onglet portant le nom de notre Transformer.
Voici ce que l’on retrouve dans le nouveau Signet portant le nom du Transformer personnalisé
Côté projet principal, nous nous retrouvons avec un Transformer vert (un Transformer Personnalisé) portant le nom de celui-ci. Le Creator et l’Inspector y sont connecté.
Retournons dans le Transformer et ajoutons une entrée qui nous permettra de boucler via un clic droit > Insert Transformer Input et connectons là au second AttributeCreator. La connection s’effectue au second car sans cela nous modifierions le Compter valant 0. Je rentre dans ses paramètrages pour décocher la case Publish (afin de ne pas voir ce port d’entrée côté main) et j’en profite pour renommer cette entrée en « Loop ».
Ceci étant fait, il reste à créer la fameuse boucle ! Enfin, faites un clic droit puis faire Insert Loop, choisissez le port d’entrée nommé Loop comme port pour boucler et validez.
Connectez ce port de sortie sur le port Failed du Tester.
La boucle est prête ! Si vous lancez le projet, vous apercevrez que la boucle tourne 10 fois et à la 11ième, lorsque le Tester vaut vrai, la boucle s’arrête et le projet peut continuer par le port de sortie qui mène à l’Inspector !
Attention, si vous devez utiliser un Transformer dit de regroupement dans une boucle, il sera nécessaire d’exporter le Transformer publié (en mode lié) et non en mode intégré. FME vous le dira automatiquement. Sinon cela ne fonctionnera pas.
Vous voici prêt à faire des boucles dans FME pour par exemple aller récupérer des données dans une API comme SIREN !
Loïc Guénin Randelli, expert FME pour SITDI-France.