mardi 6 septembre 2011

Gestion des échanges EDI avec Talend - 2° partie

Après avoir étudié la lecture du fichier en entrée et l'alimentation des tables correspondantes (voir Gestion des échanges EDI avec Talend), nous allons maintenant créer le fichier attendu par notre partenaire.
Ce fichier possède un format propriétaire et possède la structure suivante :
  • Les lignes sont au format texte positionnel (chaque colonne est définie par sa position sur la ligne et son nombre de caractères), il n'y a pas de délimiteur
  • Chaque ligne (segment) est identifié par ses 2 premiers caractères (00, 10, 11, ...)

Les règles de calcul et de transformation vers le fichier en sortie peuvent être assez complexes. 
Le schéma ci-dessous résumé les correspondances entre les segments du fichier en entrée et ceux du fichier en sortie.


Ci-dessous un exemple de règle de gestion (pour une des colonnes du segment "15") :
1 - (
PRI.price (PRI.price_qualifier = 'AAA')
/
PRI.price (PRI.price_qualifier = 'AAB')
)
Cadré à droite, comblé avec des '0', 2 carac. + 3 décimales
Le principe général pour générer le fichier en sortie est le suivant :
  • écrire un requête SQL pour chaque type de ligne à générer
    chaque requête comporte les colonnes attendues en sortie + des colonnes permettant de trier les lignes (on verra dans la suite comment)
  • Fusionner les différents types de lignes dans un seul flux Talend
  • Trier ce flux pour extraire les lignes dans l'ordre spécifié pour le fichier de sortie :
    lignes 00, pour chaque facture, puis lignes 10, puis pour chaque ligne 10, les lignes 11 et 15, pour chaque ligne de facture, ... ...
  • Générer le fichier de sortie 
Voilà à quoi cela ressemble dans Talend :

Chaque requête permet de récupérer les données qui vont permettre de créer la ligne en sortie, elle peut faire intervenir un certain nombre de segments du fichier d'entrée. L'exemple ci-après correspond au segment "15", auquel j'ai fait référence dans l'exemple de règle de gestion ci-dessus.

Le flux en sortie de la requête est traité avec un composant tJavaRow, dans lequel on effectue des opérations de formatage et on concatène l'ensemble des colonnes dans la zone "data".
Ci dessous, un extrait. On remarque l'utilisation d'une autre fonction de la bibliothèque 6 IT : "fillStringAndAlign" qui permet d'effectuer les opérations de formatage de base.

 Le composant tUnite permet de fusionner les flux en entrée dans un seul flux en sortie, qui est ensuite transmis au composant tSortRow. Ce composant permet de trier les lignes pour les remettre dans l'ordre voulu dans le fichier en sortie du job.








Enfin, le composant tMap permet simplement de mapper la zone "data" dans le fichier texte en sortie.

J'espère que ces 2 articles vous ont donné des idées. N'hésitez pas à commenter et à nous donner vos propres astuces.

Et n'hésitez pas à me contacter si vous avez des questions, des besoins particuliers : jmd@6it.fr