Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > ETL > Talend
Talend Forum d'entraide sur Talend (Talend Open Studio, ...). Avant de poster --> FAQ Talend, Tutoriels Talend
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/05/2011, 16h07   #1
Candidat au titre de Membre du Club
 
Justine Dreyfus
Inscription : juin 2010
Messages : 109
Détails du profil
Informations personnelles :
Nom : Justine Dreyfus

Informations forums :
Inscription : juin 2010
Messages : 109
Points : 14
Points : 14
Par défaut Colonnes dynamiques de même type mais dont le nombre varie suivant l'enregistrement dans la table

Bonjour

Je suis en train de créer un fichier plat (.txt ou .csv), à partir de certaines tables d'une base de données Oracle (avec Talend version 4.1.2).

J'ai une table CONTRAT avec un identifiant (CONTRAT_IDENT) et une table PRIX avec un identifiant (PRIX_IDENT). Un contrat correspond à plusieurs prix (1..n). J'ai donc dans ma table PRIX, une clé étrangère pointant vers CONTRAT (PRIX_IDENTCONTRAT).

Mon objectif :
Créer dans le fichier, pour chaque enregistrement de contrat, autant de colonnes que de prix associés (avec aussi les valeurs des autres champs de la table CONTRAT, nécessairement).

Comment puis-je m'y prendre au niveau du design à mettre en œuvre, ainsi que de la requête à réaliser?

Merci!
justinedr71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 12h25   #2
Membre émérite
 
Homme Nicolas Saumande
Architecte Décisionnel
Inscription : février 2008
Messages : 693
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Saumande
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Architecte Décisionnel

Informations forums :
Inscription : février 2008
Messages : 693
Points : 879
Points : 879
Bonjour,

Je pense que le composant tDenormalize devrait répondre à ton besoin.
Il permet de regrouper sur une ligne des informations présentes sur plusieurs lignes.

Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h02   #3
Candidat au titre de Membre du Club
 
Justine Dreyfus
Inscription : juin 2010
Messages : 109
Détails du profil
Informations personnelles :
Nom : Justine Dreyfus

Informations forums :
Inscription : juin 2010
Messages : 109
Points : 14
Points : 14
Bonjour

Le problème avec tDenormalize est que je ne souhaite pas regrouper toutes mes données dans un unique champs, mais au contraire, avoir autant de champs que de données.

Le fait est que pour chaque CONTRAT je n'ai pas le même nombre de PRIX, et je dois avoir une colonne pour chaque PRIX correspondant à mon CONTRAT...
justinedr71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h08   #4
Membre émérite
 
Homme Nicolas Saumande
Architecte Décisionnel
Inscription : février 2008
Messages : 693
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Saumande
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Architecte Décisionnel

Informations forums :
Inscription : février 2008
Messages : 693
Points : 879
Points : 879
A priori, il suffit de définir le même délimiteur dans ton denormalize que celui de ton fichier.

Du coup, tu auras autant de colonne que de pris. Mais tu auras aussi chaque ligne avec un nombre différent de colonne.

C'est ce que tu souhaites ?

Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h23   #5
Candidat au titre de Membre du Club
 
Justine Dreyfus
Inscription : juin 2010
Messages : 109
Détails du profil
Informations personnelles :
Nom : Justine Dreyfus

Informations forums :
Inscription : juin 2010
Messages : 109
Points : 14
Points : 14
Oui c'est exactement ce que je veux!

Avec :
nombre_colonnes_prix_total = nombre_max_prix_par_contrat
Et les cellules laissées vides pour les CONTRATS ayant moins de PRIX que d'autres...

Je vais essayer cela!
Merci bien
justinedr71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h29   #6
Candidat au titre de Membre du Club
 
Justine Dreyfus
Inscription : juin 2010
Messages : 109
Détails du profil
Informations personnelles :
Nom : Justine Dreyfus

Informations forums :
Inscription : juin 2010
Messages : 109
Points : 14
Points : 14
Ça marche très bien!

Le seul truc est que j'aimerai pouvoir répercuter mon titre de colonne sur toutes les colonnes PRIX, et pouvoir aussi continuer les enregistrements derrière, comme le schéma qui suit :

Pièce jointe 77921

Avec éventuellement par la suite, continuer de rajouter des colonnes qui seront elles fixées et non dynamiques.
justinedr71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 09h33   #7
Membre émérite
 
Homme Nicolas Saumande
Architecte Décisionnel
Inscription : février 2008
Messages : 693
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Saumande
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Architecte Décisionnel

Informations forums :
Inscription : février 2008
Messages : 693
Points : 879
Points : 879
Alors pour les noms des colonnes, tu as éventuellement la possibilité de définir un schéma pour ton fichier qui contiendrait une liste exhaustive des champs que tu peux avoir (par exemple 10 colonnes prix, si tu sais que tu peux en avoir au maximum 10).

Pour pouvoir avoir plusieurs colonnes gérées de la même façons, je pense que le mieux est de concaténer tous les champs avant le tDenormalize dans un seul champs, toujours avec le même délimiteur.
Ainsi tu dénormalises sur ce champs concaténé, et tu as ce que tu souhaites en sortie.

Pour pouvoir ajouter des colonnes fixes à la fin de la ligne, c'est un peu plus compliqué puisqu'il faudrait que tu aies le même nombre de délimiteurs avant (sinon ces champs fixes vont se balader selon le nombre de colonnes prix que tu as).
La solution pourrait être de tester le nombre de délimiteurs que tu as dans le champ en sortie du tDenormalize et d'en rajouter pour arriver à ce nombre max de délimiteurs.
Ainsi tu te retrouves avec toujours le même nombre de champs prix, avec les derniers qui sont vides.

Mais bon, ça complique pas mal ta solution tout ça...

Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 16h05   #8
Candidat au titre de Membre du Club
 
Justine Dreyfus
Inscription : juin 2010
Messages : 109
Détails du profil
Informations personnelles :
Nom : Justine Dreyfus

Informations forums :
Inscription : juin 2010
Messages : 109
Points : 14
Points : 14
Citation:
Alors pour les noms des colonnes, tu as éventuellement la possibilité de définir un schéma pour ton fichier qui contiendrait une liste exhaustive des champs que tu peux avoir (par exemple 10 colonnes prix, si tu sais que tu peux en avoir au maximum 10).
=> Ca peut être une solution en effet, mais le fait est que je ne peux pas nommer toutes les colonnes pareil... et la colonne sur laquelle je base mon tDenormalize DOIT exister en sortie. En gros, j'ai renommé mes PRIX : PRIX1 ... PRIXn, mais du coup je n'ai plus la variable PRIX en sortie, du coup je suis aussi obligée de la renommer aussi en entrée pour qu'elle apparaisse dans la liste déroulante de choix de colonnes pour le tDenormalize... (Je ne sais pas si je suis très claire ^^).

Citation:
Pour pouvoir avoir plusieurs colonnes gérées de la même façons, je pense que le mieux est de concaténer tous les champs avant le tDenormalize dans un seul champs, toujours avec le même délimiteur.
Ainsi tu dénormalises sur ce champs concaténé, et tu as ce que tu souhaites en sortie.
=> Comment concaténer les champs? Lors du select, avec une requête qui va bien? Ou bien en passant par une tMap? (La deuxième solution est un peu lourde non?)
justinedr71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 17h33   #9
Candidat au titre de Membre du Club
 
Justine Dreyfus
Inscription : juin 2010
Messages : 109
Détails du profil
Informations personnelles :
Nom : Justine Dreyfus

Informations forums :
Inscription : juin 2010
Messages : 109
Points : 14
Points : 14
J'ai essayé avec cette requête :

Code SQL :
1
2
3
4
"select CONTRAT, PRIX, USER
from F_CONTRAT, F_PRIX, F_USER
where CONTRAT_IDENT = PRX_PTRCONID (+)
and CONTRAT_USER = USR_PTRCONID (+)"

Sans dénormaliser j'obtiens la table suivante :

CONTRATS PRIX USER
356 100,00 Marc
356 200,00 JP
356 250,00 Nico
356 125,00 Marie
356 230,00 Charlotte
356 245,00 Tony
354 565,00 Hubert
354 580,00 Sarah
354 430,00 Georges
354 290,00 Pauline

Afin d'obtenir ce que je souhaite, j'essaye de dénormaliser sur les deux colonnes : PRIX et USER (avec le ";" comme séparateur).

Mes schémas :
  • tDenormalize
    • tOracleInput (Input)
    • tDenormalize (Output)
  • tFileOutPutDelimited
    • tDenormalize (Input)
    • tFileOutPutDelimited (Output)

Sont exactement les mêmes :
1 colonne CONTRAT
max colonnes PRIX
max colonnes USER

Cependant, dans mon résultats, j'obtiens bien mes entêtes :
Contrat Prix1 Prix2 Prix3 .. Prixn User1 User2 User3 .. Usern

Seulement, mes résultats sont séparés par un écart de 7 cases vides... Pour les deux contrats, j'ai :

ma valeur contrat
mes valeurs prix à la suite
7 cases vides
mes valeurs user

Pourquoi cet écart de 7 cases entre les deux valeurs normalisées?
justinedr71 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 17h56   #10
Membre émérite
 
Homme Nicolas Saumande
Architecte Décisionnel
Inscription : février 2008
Messages : 693
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Saumande
Âge : 36
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Architecte Décisionnel

Informations forums :
Inscription : février 2008
Messages : 693
Points : 879
Points : 879
Pour la concaténation, tu peux le faire avec le select ou dans un tMap effectivement.
Les 2 solutions m'ont l'air bien.

Je pense que les 7 cases vides viennent des champs prix2... prix8 que tu as dû déclarer en entrée. Du coup il te les fait suivre dans la sortie.

En sortie, tu dois avoir ces données dans la première ligne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Contrat = 356
Prix1 = 100;200;250;125;230;245
Prix2 = 
Prix3 = 
Prix4 = 
Prix5 = 
Prix6 = 
Prix7 = 
Prix8 = 
User 1 = Marc;JP;Nico;Marie;Charlotte;Tony
User 2 = 
User 3 = 
User 4 = 
User 5 = 
User 6 = 
User 7 = 
User 8 =
D'où les 7 champs vides...
Je dirais que les champs supplémentaires n'était peut-être pas une bonne idée...

Si tu tiens vraiment à avoir un entête, tu peux éventuellement ajouter une ligne en début de fichier via un sous-job qui génère la ligne que tu souhaites insérer avec un tFixedFlowInput ?

Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h14.


 
 
 
 
Partenaires

Hébergement Web