Altova MapForce 2025 Enterprise Edition

Contexte dans les UDF

Accueil Préc Haut Suivant

Les fonctions définies par l'utilisateur (FDUs) sont des fonctions personnalisées intégrées dans le mappage, où vous définissez les entrées, les sorties et la logique de traitement. Chaque fonction définie par l'utilisateur peut contenir le même type de composant en tant que mappage principal, y compris les services Web et les bases de données.

 

Par défaut, si une FDU contient une base de données ou un composant de service Web et si les données d’entrée du FDU est une séquence de plusieurs valeurs, chaque entrée de valeur appellera la FDU et par conséquent entraînera dans une base de données ou un appel de service Web.

 

Ce comportement mentionné peut être acceptable pour le type de mappage dans lequel vous avez vraiment besoin que la FDU soit appelée autant de fois qu’il y a de valeurs d’entrée et que vous n’avez pas d’alternative.

 

Si vous ne souhaitez pas que cette situation se produise, vous pouvez configurer la FDU de manière à ce qu’elle soit appelée une seule fois même si elle reçoit une séquence de valeurs en tant qu’entrée. Généralement, c’est la technique que vous adopterez pour les FDU qui fonctionnement sur un ensemble de valeurs avant qu’elles puissent être retournées (comme des fonctions qui calculent les moyennes ou les totaux).

 

Configurer une FDU pour accepter plusieurs valeurs d’entrée dans le même appel de fonction est possible si la FDU est de type "regular", pas "inlined". (Pour plus de détails, voir le chapitre Fonctions définies par l'utilisateur.) Avec des fonctions régulières, vous pouvez spécifier que le paramètres d'entrée est une séquence en cochant la case Entrée est une séquence. Cette case à cocher est visible dans les paramètres de composant, après avoir double-cliqué dans la barre de titre d’un paramètre d'entrée. La case à cocher influe sur le nombre de fois que la fonction est appelée :

 

Lorsque les données d’entrée sont connectées à un paramètre sequence, la fonction définie par l'utilisateur est appelée uniquement une fois et la séquence complète est passée dans la fonction définie par l'utilisateur.

Lorsque les données d’entrée sont connectées à un paramètre non-sequence, la fonction définie par l'utilisateur est appelée une seule fois dans chaque item unique dans la séquence.

 

Pour un exemple, ouvrir le mappage de démonstration suivant : <Documents>\Altova\MapForce2025\MapForceExamples\InputIsSequence.mfd.

mf_input_is_sequence_01

Le mappage ci-dessus illustre un cas typique d’une FDU qui fonctionne sur un ensemble de valeurs et nécessite donc toutes les valeurs d’entrée en un appel. Spécifiquement, la fonction définie par l'utilisateur Calculate retourne les températures minimum, maximum et moyennes, en prenant en tant que données d’entrée provenant d’un fichier XML de source. La sortie de mappage attendue est comme suit :

 

<Temperatures>
  <YearlyStats Year="2008">
      <MinimumTemp>-0.5</MinimumTemp>
      <MaximumTemp>24</MaximumTemp>
      <AverageTemp>11.6</AverageTemp>
  </YearlyStats>
</Temperatures>

 

Comme d’habitude, l’exécution de mappage commence avec l’item supérieur du composant cible (YearlyStats, dans cette exemple). Pour remplir ce nœud, le mappage tente d’obtenir des données de source provenant de la FDU, qui, en revanche, déclenche le filtre. Le rôle du filtre dans ce mappage est de passer dans la FDU uniquement les températures depuis l’année 2008.

 

La case à cocher Entrée est séquence a été cochée pour le paramètre d’entrée de la FDU (pour voir cette case à cocher, double-cliquer sur la barre de titre de la fonction Calculate pour saisir le mappage de la fonction ; ensuite double-cliquer sur la barre de titre du paramètre d’entrée). Comme évoqué plus haut, l’option Entrée est séquence option entraîne l’approvisionnement de la séquence de valeurs complète en tant qu’entrée dans la fonction et la fonction est appelée une seule fois.

mf_input_is_sequence_02

Si vous n’aviez pas coché la case à cocher Entrée est séquence, la FDU aurait été appelée pour chaque valeur dans la source. Par conséquence, le minimum, le maximum et la moyenne serait calculée pour chaque valeur unique individuelle et une sortie incorrecte serait produite.

 

En appliquant la même logique dans des FDU plus complexes qui comprennent une base de données ou des appels de service Web, il peut être possible d’optimiser l’exécution et d’éviter des appels inutiles à la base de données ou au service Web. Néanmoins, sachez que la case à cocher Entrée est séquence ne contrôle pas ce qui arrive à la séquence de valeur après qu’elle saisit la fonction. En d’autres termes, rien ne vous empêche de connecter la séquence des valeurs entrantes dans l’entrée d’un service Web et donc de l’appeler plusieurs fois. Considérez l’exemple suivant :

mf_input_is_sequence_03

La FDU illustrée ci-dessus reçoit une séquence des valeurs depuis le mappage externe. En particulier, les données fournies au paramètre d’entrée provient d’une base de données. L’option paramètre d'entrée Entrée est séquence est sélectionnée, donc toute la séquence est fournie à la fonction en un appel. La fonction est censée accumuler plusieurs valeurs quantity et publier le résultat dans un service Web. Exactement un appel de service Web est attendu. Néanmoins, le service Web sera appelé plusieurs fois de manière incorrecte lorsque le mappage est exécuté. La raison est que l’entrée Request du service Web reçoit une séquence de valeurs, pas une seule valeur.

 

Pour régler ce problème, connecter l’entrée Request du service Web dans le résultat de la fonction sum. La fonction produit une seule valeur, donc le service Web sera aussi appelé une fois :

mf_input_is_sequence_04

 

Normalement, les fonctions aggregate comme sum, count, etc produisent une seule valeur. Néanmoins, s’il existe une connexion parent qui le permet, elles peuvent également produire une séquence de valeurs, comme décrit plus loin dans l’Exemple : Changer le contexte Parent.

 

© 2018-2024 Altova GmbH