Welcome Guest! Log in
×

Notice

The forum is in read only mode.
Stambia versions 2.x, 3.x, S17, S18, S19 and S20 are reaching End of Support January, 15th, 2024. Please consider upgrading to the supported Semarchy xDI versions. See Global Policy Support and the Semarchy Documentation.

The Stambia User Community is moving to Semarchy! All the applicable resources have already been moved or are currently being moved to their new location. Read more…

Topic-icon Question Réutilisation d'une table dans un mapping

More
05 Jul 2018 09:11 #1 by Benjamin M.
Réutilisation d'une table dans un mapping was created by Benjamin M.
Bonjour,

Je voudrais savoir s'il est possible, dans un mapping, de récupérer les lignes que l'on vient d'insérer, et uniquement celles-là, afin de les utiliser plus loin dans le même mapping.

En effet, j'ai une table qui a pour PK un ID auto-incrémenté (BIGINT IDENTITY(1,1)). J'insère dans cette table une ou plusieurs lignes et je souhaite, dans le même mapping, récupérer l'ID créé afin de l'insérer dans d'autres tables en tant que FK.

Voici un exemple du besoin :

Dans ce mapping, j'insère dans la table DEST1 les lignes présentent dans SRC ce qui me génère X PK. Ensuite, je souhaite repartir de la table DEST1 afin d'utiliser la colonne PK et alimenter les colonnes FK_INTER dans les tables DEST2 et DEST3. Actuellement, le mapping reprend l'ensemble des données présentes dans DEST1 et pas uniquement celles insérées/mises à jour :



Voici les tables et leur contenu :
CREATE TABLE dbo.SRC
(
    KEY_1 INT
    , KEY_2 INT
    , DATA_1 VARCHAR(10)
    , DATA_2 VARCHAR(10)
)

CREATE TABLE dbo.DEST1
(
    PK INT IDENTITY(1, 1) NOT NULL
    , KEY_1 INT
    , KEY_2 INT
    , LIB	  VARCHAR(20)
)

CREATE TABLE dbo.DEST2
(
    FK_INTER INT
    , KEY_1 INT
    , KEY_2 INT
    , DATA_1 VARCHAR(10)
)

CREATE TABLE dbo.DEST3
(
    FK_INTER INT
    , KEY_1 INT
    , KEY_2 INT
    , DATA_2 VARCHAR(10)
)


INSERT INTO dbo.SRC(KEY_1, KEY_2, DATA_1, DATA_2)VALUES(1, 1, 'Ligne1', 'Colonne1')
INSERT INTO dbo.SRC(KEY_1, KEY_2, DATA_1, DATA_2)VALUES(2, 1, 'Ligne2', 'Colonne1')
INSERT INTO dbo.SRC(KEY_1, KEY_2, DATA_1, DATA_2)VALUES(1, 2, 'Ligne1', 'Colonne2')
INSERT INTO dbo.SRC(KEY_1, KEY_2, DATA_1, DATA_2)VALUES(2, 2, 'Ligne2', 'Colonne2')

TRUNCATE TABLE dbo.SRC

INSERT INTO dbo.SRC(KEY_1, KEY_2, DATA_1, DATA_2)VALUES(3, 3, 'Ligne3', 'Colonne3')

Lors de la première exécution, les 4 lignes sont insérées dans DEST1 puis dans DEST2 et DEST3.

Lors de la seconde exécution, après le TRUNCATE TABLE dbo.SRC, on insère certes bien 1 seule ligne mais la table d'intégration contient les 5 lignes de SRC. Il serait possible de faire une jointure entre DEST1 et SRC pour ne conserver qu'une seule ligne mais je souhaite savoir si Stambia permet de faire autrement car ce n'est pas toujours aussi simple (requête d'alimentation complexe donc il faudrait passer par un stage ...).


Mon besoin réel porte en réalité sur une seule ligne à la fois car la source est un fichier XML mais le besoin pour plusieurs lignes est intéressant aussi.

Merci d'avance.
Benjamin
Attachments:
More
02 Aug 2018 11:26 #2 by Thomas BLETON
Replied by Thomas BLETON on topic Réutilisation d'une table dans un mapping
Effectivement un Mapping fonctionne par ensembles de données indépendants. Il ne faut pas le voir comme une succession d'étapes par lesquelles transitent un ensemble de données.
Pour cibler le même ensemble de données, une solution est d'ajouter des filtres en se basant sur une colonne qui identifie les lignes chargées au départ. Par exemple une colonne qui contiendrait le Session Id.

Remarque : le fonctionnement de certains templates permet de ne mettre en table d'intégration que les données qui n'existent pas dans la cible ou qui ont été modifiées. A voir en fonction des technos utilisées et du besoin fonctionnel...

Remarque2 : pourquoi faire passer les lignes de la source XML une par une ? Pourquoi ne pas constiture un ensemble de données, l'enrichir via des stages, et le charger dans les cibles ? C'est souvent plus efficace que de répéter le traitement pour chaque ligne.
More
13 Aug 2018 10:36 #3 by Benjamin M.
Replied by Benjamin M. on topic Réutilisation d'une table dans un mapping
Bonjour Thomas et merci pour ton retour que je n'avais pas vu.

Je vais regarder au niveau des templates ce qui peut se faire, j'ai du XML en entrée que j'importe dans des bases MS SQL.

C'est finalement ce vers quoi je me suis dirigé, faire un filtrage sur une/des colonnes dont la donnée est unique et connue.

Pour ce qui est d'importer une seule ligne, j'entends par cela le fait que pour un fichier XML, j'ai une seule ligne de type en-tête qui me donne une PK puis en fonction des différents nœuds, plusieurs lignes dans les autres tables que je veux lier à cette PK inconnue. Enfin, je traite fichier par fichier car 2 fichiers différents peuvent insérer/mettre à jour la même donnée et je dois donc conserver la séquence afin de m'assurer d'avoir la bonne donnée finale. Sauf erreur, je ne peux donc pas, sauf traitement complexe (et encore), faire un traitement global de mes fichiers.

Je sais que l'on peut requêter directement tous les fichiers plats d'un répertoire mais je ne crois pas que l'on puisse le faire pour du XML, sauf intégrer tous les fichiers puis requêter la table temporaire non supprimée contenant tous les fichiers ... mais cela ne répondrait pas à mon besoin malgré tout.

Je parlais du côté intéressant sur plusieurs lignes mais pas forcément pour du XML ou mon exemple, plus par questionnement.

Cordialement,
Benjamin
More
17 Aug 2018 08:27 - 17 Aug 2018 11:27 #4 by Benjamin M.
Replied by Benjamin M. on topic Réutilisation d'une table dans un mapping
Bonjour,

Je viens de voir qu'il était en réalité bien possible de lire l'ensemble des fichiers XML d'un répertoire, d'une façon différente des CSV : http://www.stambia.org/doc/66-technology-articles/xml/429-reading-multiple-xml-files

Je vais regarder si je peux tirer parti de cela (pour un autre process, cela m'est déjà bien utile).

Edit : Est-il possible de récupérer le nom du fichier associé à la donnée que l'on importe via la méthode indiquée en lien ?

Edit 2 : Je me suis souvenu des properyFields qui correspondent exactement à ce que je cherchais :) : http://www.stambia.org/doc/66-technology-articles/xml/425-using-xml-property-fields

Bonne journée.
Benjamin
Last edit: 17 Aug 2018 11:27 by Benjamin M..