|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
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! |
|
|
00
|
|
|
#2 |
|
Membre émérite
![]() Nicolas SaumandeArchitecte Décisionnel Inscription : février 2008 Messages : 693 ![]() |
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 |
|
|
00
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
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... |
|
|
00
|
|
|
#4 |
|
Membre émérite
![]() Nicolas SaumandeArchitecte Décisionnel Inscription : février 2008 Messages : 693 ![]() |
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 |
|
|
00
|
|
|
#5 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
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 |
|
|
00
|
|
|
#6 |
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
Ç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. |
|
|
00
|
|
|
#7 |
|
Membre émérite
![]() Nicolas SaumandeArchitecte Décisionnel Inscription : février 2008 Messages : 693 ![]() |
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 |
|
|
00
|
|
|
#8 | ||
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#9 | ||
|
Candidat au titre de Membre du Club
![]() Justine Dreyfus Inscription : juin 2010 Messages : 109 ![]() |
J'ai essayé avec cette requête :
Code SQL :
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 :
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? |
||
|
|
00
|
|
|
#10 | ||
|
Membre émérite
![]() Nicolas SaumandeArchitecte Décisionnel Inscription : février 2008 Messages : 693 ![]() |
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 :
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 |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com