BizTalk : Publication multi-occurencée d’IDocs pour SAP

Lorsqu’on souhaite utiliser BizTalk Server pour publier des IDoc à SAP, on a le choix entre 2 types de publications :
- Mono occurencée : on publie les IDocs un par un
- Multi occurencée : tous les IDocs sont publiés en un seul appel
La publication multi occurencée permet de limiter le nombre d’appels et donc d’envoyer une quantité plus importante d’IDocs.
Pour envoyer plusieurs IDocs dans un seul message, il faut renseigner le champ DOCNUM de chaque segment SAP. Ce champ est incrémenté pour chaque nouvel IDoc présent dans le message. Cependant, les segments doivent être regroupés par type et non par IDoc.
Si on prend l’exemple d’un message contenant 3 IDocs chacun constitué d’un segment A et d’un segment B, le message envoyé aura la structure suivante :
- A1
- A2
- A3
- B1
- B2
- B3
SAP sera ensuite capable de regrouper les segments pour reconstituer les 3 IDocs :
- IDoc 1
- A1
- B1
- IDoc 2
- A2
- B2
- IDoc 3
- A3
- B3
Le message à envoyer est construit à l’aide d’un mapping. Ce dernier doit donc prendre en charge le calcul du DOCNUM. Dans la suite nous verrons comment réaliser un tel mapping dans 2 cas :
- Mapping direct : chaque occurrence du message entrant fera l’objet d’un IDoc dans le message de sortie.
- Mapping conditionnel : une occurrence du message entrant ne fera l’objet d’un IDoc que s’il respecte une condition donnée.
Mapping direct
Dans le cas de notre mapping, la plupart des champs seront mappés de façon directe, il faut simplement calculer la valeur du champ DOCNUM pour chaque segment. Le mapping peut se faire via l’interface graphique (BizTalk Mapper) à l’aide des functoids.
Prenons le schéma de gauche pour notre message entrant et la structure du message à publier à SAP à droite:
Etant donné que chaque occurrence dans le message entrant fera l’objet d’un IDoc dans le message sortant, nous allons utiliser le functoïd Iteration. Ce functoïd permet de récupérer l’index d’un nœud dans le message entrant. Nous allons donc le lier, en entrée, au nœud racine d’une occurrence. En sortie le functoïd alimentera les champs DOCNUM de tous les segments.
Segment technique EDI_DC40
Le champ à renseigner est DOCNUM:
Segment fonctionnel
Le champ à renseigner est DATAHEADERCOLUMN_DOCNUM:
Supposons qu’en entrée nous avons un message avec 2 occurrences :
Voici le résultat obtenu en sortie :
Ce résultat est bien conforme au résultat souhaité.
Mapping conditionnel
Supposons que l’on souhaite publier un IDoc uniquement si l’occurrence dans le message entrant respecte une condition donnée (par exemple uniquement si le champ X = « toto »). On souhaite également que la numérotation des IDocs soit continue : « 1 – 2 – 3 – 4 » et non « 1 – 3 – 6 – 7 » par exemple.
Dans ce cas la valeur du champ DOCNUM ne correspond plus à l’index de l’occurrence du message d’entrée. Nous avons besoin de construire un compteur qui sera incrémenté uniquement si la condition est respectée. Pour cela le mapping doit être construit via XSLT. La valeur de notre compteur permettra de renseigner les champs DOCNUM. Etant donné que les segments doivent être regroupés par type, nous allons créer un tempate XSLT pour chaque type de segment. Chaque template définira un compteur et vérifiera le respect de la condition.
Dans l’exemple ci-dessous, on appelle un template pour chaque segment. Ce template prend en paramètre la valeur initiale du compteur (0) et la première occurrence du message entrant.
Prenons le template permettant de créer les segments EDI_DC40. Pour l’occurrence du message entrant en cours de traitement :
- On définit des variables utiles pour évaluer le respect de la condition.
- On définit le compteur:
- Si la condition est respectée, on incrémente le compteur.
- Sinon, le compteur garde la même valeur.
- Si la condition est respectée, on définit le segment EDI_DC40.
- Si l’occurrence du message entrant n’est pas la dernière, on applique de nouveau ce template à l’occurrence suivante avec comme paramètre:
- La nouvelle valeur du compteur : incrémenté ou non selon le respect de la condition.
- L’occurrence du message entrant à traiter.
- Cela permet de créer tous les segments EDI_DC40 les uns à la suite des autres.
Si le segment doit être créé, car la condition est respectée, le champ DOCNUM du segment est défini avec la nouvelle valeur du compteur.
Voilà donc comment faire une incrémentation conditionnelle en XSLT. Cela peut être utile pour publier des IDocs de façon multi-occurencée mais aussi dans plein d’autres situations.