1. #1
    Membre du Club

    Homme Profil pro
    Inscrit en
    juin 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : juin 2004
    Messages : 43
    Points : 68
    Points
    68

    Par défaut Regroupement avec inversion dans un map

    Bonjour,

    Pour l'ouverture de ce nouveau forum d'entraide j'ai un soucis que je n'arrive pas à régler.
    En fait je ne sais même pas si c'est faisable dans un map voir même en XSLT.

    Donc voici mon soucis.

    J'ai ce fichier en entrée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <HEAD>
      <TRACKINGS>
        <TRACKING>8L995-2522</TRACKING>
        <TRACKING>8L008-2539</TRACKING>
      </TRACKINGS>
      <LINES>
        <LINE>
          <PRODUCTCODE>2246</PRODUCTCODE>
          <DETAIL>
            <NUMCOLIS>2522</NUMCOLIS>
          </DETAIL>
        </LINE>
        <LINE>
          <PRODUCTCODE>2244</PRODUCTCODE>
          <DETAIL>
            <NUMCOLIS>2522</NUMCOLIS>
          </DETAIL>
        </LINE>
        <LINE>
          <PRODUCTCODE>2250</PRODUCTCODE>
          <DETAIL>
            <NUMCOLIS>2539</NUMCOLIS>
          </DETAIL>
        </LINE>
      </LINES>
    </HEAD>
    Et voici ce que je dois obtenir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <HEAD>
      <COLIS>
        <TRACKING>2522</TRACKING>
        <LIGNE>
          <CODEARTICLE>2246</CODEARTICLE>
        </LIGNE>
        <LIGNE>
          <CODEARTICLE>2244</CODEARTICLE>
        </LIGNE>
      </COLIS>
      <COLIS>
        <TRACKING>2539</TRACKING>
        <LIGNE>
          <CODEARTICLE>2250</CODEARTICLE>
        </LIGNE>
      </COLIS>
    </HEAD>
    Donc pas facile et j'y ai passé déjà un certain temps.
    Si quelqu'un a une idée ou une piste que je n'aurai pas explorée

    Mon soucis se situe surtout pour faire créer les balises <LIGNE> car le <COLIS> <TRACKING> est bien alimenté.

    Que ce soit en XSLT ou en C# je n'ai aucune idée de comment faire

    Merci.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET / Biztalk
    Inscrit en
    octobre 2008
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET / Biztalk

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 047
    Points : 1 630
    Points
    1 630

    Par défaut

    Bonjour,

    Dans BizTalk, tu as du créés deux schemas .xsd :
    - Un pour le fichier d'entré : le noeud TRACKINGS doit être en min occur 0 et max occurs ainsi que le noeud LINES
    - le deuxième pour le fichier final

    En .NET, tu génères des classes C# grâce à BizTalk, tu pourras travailler directement en C# avec le format de tes schémas. Ensuite dans une classe personnalisée, il te suffit de boucler sur le noeud TRACKING et de récupérer les informations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // Le Type sera généré automatiquement par BizTalk. Il correspond au schéma du fichier IN
    public static function getMsg(ClassFichierInXSD msgOUT)
    {
        // Tu déclares un fichier de type OUT (sera généré aussi par BizTalk avec le Type du schèma de sortie)
        ClassFichierOutXSD msgOUT = new ...();
    
         // On boucle sur tous les noeud Trackings
         foreach(var i in msgOUT.TRACKINGS)
        {
               var query = (from t in i where tacondition select t) // Dans tacondition, tu dois retrouver le champ tracking, qui te permet de mapper surement avec un autre champs)
    
                msgOUT.tonchamps = query.tonchamp;
         }
    }
    Code simplifié, mais avec du linq tu dois pouvoir y arriver.

    Avec une Map, tu dois pouvoir effectivement utiliser le XSLT.

    Mais avant, comment veux-tu associer tes valeurs ? Tu prend le premier TRACKING et tu l'associes aux premières valeurs que tu trouves et ainsi de suite ?
    Règle N° 1 : Si tout va bien, ne touchez à rien.

    Je ne réponds pas au MP technique, inutile donc de poser vos questions. Le forum est là pour ça

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    mai 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2003
    Messages : 17
    Points : 23
    Points
    23

    Par défaut

    Citation Envoyé par bob633 Voir le message
    Avec une Map, tu dois pouvoir effectivement utiliser le XSLT.
    Oui, ça parait plus simple que le code proposé, qu'il faut d'ailleurs placer quelque part (autrement qu'avec une orchestration je ne vois pas, avec un custom functoid ?)

    A partir de ton map actuel qui fonctionne en partie (looping source/destination sur les nœuds TRACKING), valide le map, récupère le fichier xsl généré, ajoute une clé sur le nœud NUMCOLIS en suivant la méthode Muench (il y a de très bons posts de GrandFather et de Erwy dans la section XSLT sur ce sujet) afin de ne récupérer que les codes articles. Puis tu référence cette page XSL modifiée dans ton mapping, éventuellement tu récupère aussi le fichier d'extension XML si tu as des appels à des bibliothèques personnalisées, et le tour est joué.

    Au passage, c'est un peu moche HEAD comme nom de racine XML

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .NET / Biztalk
    Inscrit en
    octobre 2008
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET / Biztalk

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 047
    Points : 1 630
    Points
    1 630

    Par défaut

    qu'il faut d'ailleurs placer quelque part (autrement qu'avec une orchestration je ne vois pas, avec un custom functoid ?)
    J'ai pour l'habitude de générer un projet "Utils" associé au projet BizTalk. Ce projet est de type .NET, et contient toutes les fonctions utiles (voir l'intelligence du projet BizTalk). Je ne créé des functoid que lorsque le traitement est petit (changement de format de date par exemple, pas natif sur BizTalk).

    Cette solution remplace la map dans certains cas.

    C'est un choix à faire. Lorsqu'il y a trop d'intelligence à mettre dans une map, où ça devient très vite illisible, autant passer par une classe .NET. Surtout que BizTalk propose un outil qui permet de générer des classes objects en fonction des schémas XSD : plus qu'à déclarer l'objet (nom du schema) et y affecter les valeurs. Ca offre l'avantage d'avoir toute la puissance .NET derrière (Linq en l’occurrence, très pratique pour travailler sur des schémas), tu appelles ta fonction depuis une box "Expression Shape" dans ton orchestration, tu envoies ton message en paramètre, et elle te renvoie ton fichier final.
    Règle N° 1 : Si tout va bien, ne touchez à rien.

    Je ne réponds pas au MP technique, inutile donc de poser vos questions. Le forum est là pour ça

  5. #5
    Membre du Club

    Homme Profil pro
    Inscrit en
    juin 2004
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : juin 2004
    Messages : 43
    Points : 68
    Points
    68

    Par défaut

    Bonjour,

    merci pour vos réponses et désolé de mon délai de réponse mais j'étais absent depuis un moment.
    Je vais tester vos solutions cette semaine.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    mai 2003
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mai 2003
    Messages : 17
    Points : 23
    Points
    23

    Par défaut

    Pareil pour moi pour le délai de réponse, mais vu l'activité dans ce sous forum ce n'est déjà pas si mal

    Ne connaissant pas ton niveau je n'ai pas détaillé la méthode pour l'utilisation d'un custom XSL au sein d'un map, il y a une méthode en anglais ici, elle est correcte modulo la suppression des liens (inutile puisque le map est ignoré une fois que tu indiques qu'il y a un custom XSL, et au moins tu peux rajouter une partie de la logique métier si nécessaire afin de refaire un nouveau cutom XSL dans ton map BizTalk). Il manque juste l'utilisation du champ Custom Extension XML, c'est le même principe il faut récupérer le fichier généré lors de la validation du map. Ce point n'est nécessaire que si tu as fait appel à une bibliothèque de ton cru (comme ce que décrit bob633 avec son projet "Utils")

    @bob633 : Idem pour moi, sauf que je l'appelle soit FunctoidHelper soit OrchestrationHelper selon que le code sera utilisé dans un mapping ou dans une orchestration. Cela permet de mettre à jour la ou les fonctions appelées sans redéployer le mapping ou l'orchestration, uniquement avec un gacutil (je crois comprendre que tu fais du inline C# ou VB.NET pour les petites fonctions), et également de les mutualiser.

    Par rapport à ma question (mal formulée), je parlais d'un scripting functoid avec appel à une assembly externe. Mais normalement c'est pour le même but que ce que tu indiques (essentiellement formatage et conversion des données). Je n'ai pas vraiment trouvé de véritable custom functoid utile, mis à part celui qui permet de lire les données de contexte lors de l'exécution du mapping.

    Donc c'est bien ce que je pensais, tu passes par une orchestration, c'est autre chose en terme de charge qu'un simple mapping... Je suis d’accord que c'est pratique lorsqu'on arrive à un certain niveau de complexité, mais c'est plutôt à réserver pour des traitements que l'on ne peut réellement pas faire autrement à mon avis (routage par role link, création de send port dynamiques, etc.), ici le custom XSL semble facilement applicable.

    Effectivement il faut peut-être détailler le besoin pour valider ce qui est le mieux, mais jusque là je n'ai jamais vu de transformation d'un schéma vers un autre, à partir d'un seul message bien sûr, qui ne soit pas réalisable avec un mapping faisant appel à du custom XSL (que ce soit pour tout le mapping ou uniquement certaines sections avec des scripting functoid utilisant du inline XSL ou inline XSL call template).

Discussions similaires

  1. Comment utiliser inverse dans le mapping nhibernate
    Par hellalaboy dans le forum NHibernate
    Réponses: 1
    Dernier message: 25/10/2011, 12h32
  2. regroupement de tables dans une requete avec chiffre MAX
    Par db48752b dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 15/10/2009, 11h02
  3. Comment regrouper avec une condition dans une requête
    Par moilou2 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/07/2008, 10h39
  4. problème avec insert dans une map
    Par LePetitBricoleur dans le forum C++
    Réponses: 3
    Dernier message: 01/11/2007, 11h52
  5. [Delta3d] probléme avec un objet dans une map
    Par astragoth dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 27/03/2006, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo