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:

Schema_Pivot                 Schema_BOMMAT

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: Map_ToEDI

Segment fonctionnel

Le champ à renseigner est DATAHEADERCOLUMN_DOCNUM: Map_ToNode

Supposons qu’en entrée nous avons un message avec 2 occurrences : Pivot_example Voici le résultat obtenu en sortie : BOMMAT_Result 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.

MapXSL_ToEDI

Prenons le template permettant de créer les segments EDI_DC40. Pour l’occurrence du message entrant en cours de traitement :

  1. On définit des variables utiles pour évaluer le respect de la condition.
  2. On définit le compteur:
    • Si la condition est respectée, on incrémente le compteur.
    • Sinon, le compteur garde la même valeur.
  3. Si la condition est respectée, on définit le segment EDI_DC40.
  4. 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.
  5. Cela permet de créer tous les segments EDI_DC40 les uns à la suite des autres.

MapXSL_ToEDI_Template

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. MapXSL_ToEDI_Template_detail

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.

Pas de commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *