Start a new topic
Answered

Masque de rejets avec nom du schéma

Bonjour, 


Je souhaiterais utiliser un masque de rejets pouvant récupérer le schéma de ma table cible. Avez vous une doc sur le sujet ou une piste ? 

Quelque chose du genre : R_[SchemaTargetName]_[TargetName] est ce possible ? 


Merci à vous


Best Answer

Bonjour Axel,


Je comprends donc bien le problème.


En effet, en allant récupérer ./tech:physicalName() dans votre metadata (au niveau d'un schema), xDI va substituer cette fonction en concaténant le nom du catalog avec le schema. 
En plus de ça, les noms de ces objets contenant des caractères majuscules, xDI va forcer leur conservation en entourant avec des guillemets puisque l'instance PostgreSQL peut être sensible à la casse au niveau du nom des objets.

La solution que je propose est de ne récupérer que le nom du schema dans le nom d'objet sans le nom du catalog (en espérant que ça réponde bien à vos attentes).


Pour cela, il suffit de remplacer ./tech:physicalName() par ./tech:schemaName()
L'avantage, c'est que xDI n'ajoutera pas de guillemets. Dans votre exemple vous obtiendrez donc une table de rejet nommée "DEVDWH"."ALIM"."R_ALIM_WRK_DWHV3_D_MTF_RET"


Attention, si vous souhaitez appliquer des masques de nom d'objet au niveau des tables (donc à un niveau inférieur à celui de votre schéma), il faudra utiliser cette syntaxe ../tech:schemaName() (.. au lieu de . avant le /tech) pour spécifier à xDI d'aller chercher le nom de schema du niveau supérieur.


Je vous laisse tester, n'hésitez pas à revenir vers moi si besoin ou pour confirmer que c'est bien fonctionnel.

Bon courage. 


Bonjour,


La documentation décrit les différents attributs qu'il est possible d'utiliser dans les masques des éléments temporaires (table de chargement, intégration ou rejet) : https://www.semarchy.com/doc/semarchy-xdi/xdi/2024.1/Design/data/metadata/database.html#tname-masks


Il est aussi possible d'utiliser les attributs suivants :

  • [shortMapId] ou [MapID] qui permettent notamment de positionner l'identifiant du mapping qui alimente la table cible,
  • [sessionTimestampName] qui permet de récupérer une identifiant propre à chaque session.

Ces autres attributs permettent d'avoir une unicité dans le nom des éléments temporaires. Cela peut s'avérer utile dans le cas où une table est alimentée par plusieurs mappings, voire plusieurs sessions, exécutés en parallèle.


Par rapport à votre question, il ne sera donc pas possible via ce genre d'attribut de nommer vos éléments temporaires avec le nom du schema cible. 

Néanmoins, vous pouvez utiliser une fonction xPath, dans le masque, afin de récupérer le nom du schema.

Pour cela, vous pouvez utiliser les syntaxes suivantes :

  • au niveau du schema (exemple pour les rejets) : R_[TargetName]_%x{./tech:physicalName()}x%
  • au niveau de la table (même exemple) : R_[TargetName]_%x{./ref:schema()/tech:physicalName()}x%
Vous constaterez la différence entre les deux syntaxes : à partir du schema c'est très simple, xDI va simplement récupérer le physicalName() du schema. Et à partir de la table, il est nécessaire de "remonter" au niveau du schema (via le ref:schema()) puis de récupérer le physicalName() de celui ci comme dans l'exemple précedent.

Attention à la longueur des noms des éléments tolérée par les SGBD. En cas de doute, vous pouvez modifier le paramètre "Object Truncation Size" à la valeur souhaitée pour limiter le nom d'objet qui sera généré.

Je vous laisse tester de votre côté, n'hésitez pas à faire un retour.
Bon courage et bonne journée.

Bonjour Romain,


Merci pour votre réponse rapide, j'ai pu avoir l'occasion de tester de mon côté aujourd'hui. Je fais fasse à quelques problèmes en passant directement par le xpath. 

Imaginons une table DWH.D_PRD, je souhaiterai que la table générée soit 

En passant par l'utilisation de R_%x{./tech:physicalName()}x%_[TargetName]  le résultat obtenu est "R_"DEVDWH"."DWH"_D_PRD"


Le point et les guillemets étant gênant pour la création de ma table j'ai pensé utilisé une variable %{VARIABLE}% ou ${VARIABLE}$ mais là sans succès.


Je suis preneur de pistes supplémentaires.


Bonne journée à vous,


Axel

Bonjour Axel,


Pourriez-vous partager une capture de votre metadata (l'écran de paramétrage du schema) s'il vous plaît ?

Bonjour Romain,


Dans le schéma ALIM j'ai fait quelques tests parmi lesquels j'ai ajouté du xpath dans le nom comme ci-dessous :

image


Une fois cela fait j'ai testé l'un de mes flux contenant des rejets :

image


Le résultat obtenu est le suivant pour la table de rejets de la table WRK_DWHV3_D_MTF_RET

create table "DEVDWH"."ALIM"."R_"DEVDWH"."ALIM"_WRK_DWHV3_D_MTF_RET"


Je suis preneur de quelconque solution, je vous remercie pour votre réactivité.


Axel




Bonjour Axel,


En fait, je demandais de partager l'écran de paramétrage de la metadata du schema (onglet Standard) afin de voir comment les attributs Name et Schema Name étaient alimentés.

(exemple sur une de mes metadata en PostgreSQL) :

image


Cela me permettra de proposer une solution qui correspond bien à votre attente.

Bonjour Romain,


Désolé pour cette réponse tardive, après avoir profité du beau soleil de juillet voici la capture d'écran : 


image


Je reste à votre disposition pour tout besoin complémentaire.


Axel

Answer

Bonjour Axel,


Je comprends donc bien le problème.


En effet, en allant récupérer ./tech:physicalName() dans votre metadata (au niveau d'un schema), xDI va substituer cette fonction en concaténant le nom du catalog avec le schema. 
En plus de ça, les noms de ces objets contenant des caractères majuscules, xDI va forcer leur conservation en entourant avec des guillemets puisque l'instance PostgreSQL peut être sensible à la casse au niveau du nom des objets.

La solution que je propose est de ne récupérer que le nom du schema dans le nom d'objet sans le nom du catalog (en espérant que ça réponde bien à vos attentes).


Pour cela, il suffit de remplacer ./tech:physicalName() par ./tech:schemaName()
L'avantage, c'est que xDI n'ajoutera pas de guillemets. Dans votre exemple vous obtiendrez donc une table de rejet nommée "DEVDWH"."ALIM"."R_ALIM_WRK_DWHV3_D_MTF_RET"


Attention, si vous souhaitez appliquer des masques de nom d'objet au niveau des tables (donc à un niveau inférieur à celui de votre schéma), il faudra utiliser cette syntaxe ../tech:schemaName() (.. au lieu de . avant le /tech) pour spécifier à xDI d'aller chercher le nom de schema du niveau supérieur.


Je vous laisse tester, n'hésitez pas à revenir vers moi si besoin ou pour confirmer que c'est bien fonctionnel.

Bon courage. 

Bonjour Romain,


Merci pour cette solution et vos explications, cela a parfaitement fonctionné !


Bonne journée à vous,


Axel

Login to post a comment