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 23/01/2012, 11h33   #1
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 48
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 48
Points : 10
Points : 10
Par défaut Probleme Avec jointure

Bonjour,

Je rencontre un petit problème que je vais essayer de vous exposer clairement:

2 tables Sources (A&B)(postgresql)
1 tmap
1 table destination (C) (Sql 2005)

Structure des tables :
1ere table (A):
Id_Contrat|NomContrat|Total

2eme Table(B):
id|f_idContrat|TypeFin|NbInd|NbColl

3eme Table (C) :
Id_contrat|Type1|Type2|Type3| Type4|Nb1|Nb2|Nb3|Nb4

Exemple de données :
Table A :

3030|Titi|45
3245|Toto|36
3438|Tata|60

Table B :

112|3030|1|0|45
113|3245|1|12|0
114|3245|2|24|0
234|3438|1|0|46
452|3438|2|0|2
963|3438|3|0|12

Et le but du « jeu » c’est de mettre à jour la table C avec les données provenant de la table B & A en fonction de Id_contrat (A):
C.Id_Contrat = A.Id_Contrat
C.type1=B.TypeFin
C.type2= B.TypeFin
C.Type3= B.TypeFin
C.Type4= B.TypeFin
C.nb1= NbInd ou NbColl (si l’un est égal à 0 prendre l’autre)
C.nb2= NbInd ou NbColl(si l’un est égal à 0 prendre l’autre)
C.nb3= NbInd ou NbColl(si l’un est égal à 0 prendre l’autre)
C.nb4= NbInd ou NbColl(si l’un est égal à 0 prendre l’autre)

Voici ce que j’ai fait :

Mes 2 tables(A+B) en entrée reliées au Tmap,
le tmap relié à ma table (C) en sortie
Jointure entre A & B de : A.Id_Contrat=B.F_idContrat ==> Toutes les Correspondances + InnerJoin

Je n’arrive pas à remplir ma table (C) de cette manière :

Id_contrat|Type1|Type2|Type3| Type4|Nb1|Nb2|Nb3|Nb4
3438|1|2|3|Null|46|2|12|null
3030|1|null| null| null|45| null| null| null
3245|1|2|null|null|12|24|null|null

Etc..

Est-il possible d’arriver à ce résultat ? et si oui quelle est la méthodologie pour y parvenir.

Merci à vous.
jp_____ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 12h29   #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,

Tu pourrais utiliser un tDenormlizeRow après ton tMap afin de récupérer sur la même ligne tous les types et valeurs d'un même contrat.
(Dénormalisation sur les champs type et nb)

Ensuite pour remplir les champs typen et nbn de ta table, il suffit de parser les 2 champs que tu as récupérés de la dénormalisation.

Nicolas
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 15h14   #3
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 48
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 48
Points : 10
Points : 10
Merci de ta réponse mais je ne comprends pas tout. Il doit manquer un Tmap apres le Tdenormlize car je dois faire un Update sur la table sur des champs bien spécifiques.

Tpostgresqlinput1--Main------>
Tmap -->Tdenormalize ---> TmssqlOutput
Tpostgresqlinput2-Lookup----->

lorsque je fais ça j'ai un message d'erreur de compilation "Impossible de convertir String en Integer. Pourtant tout est en INTEGER.
Bref admettons, j'ai tout transformé en String et j'ai mis dans tlogRow :

id_contrat|B.typeFin|B.NbInd|NbColl
3438|1;3;5
==> Apres comment je fais pour lui dire que la valeur :
1 -> C.type1
3 -> C.type2
5 -> C.Type3

etc.

Peux tu m'eclairer
merci d'avance
jp_____ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 15h59   #4
Membre habitué
 
Etienne Menuet
Inscription : mai 2010
Messages : 75
Détails du profil
Informations personnelles :
Nom : Etienne Menuet
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2010
Messages : 75
Points : 103
Points : 103
Bonjour,

Le tDenormalize ne prend que des colonnes de type String.
Donc quand tu lis ton fichier tu dois typer tes colonnes en String.

Tu rajoutes le composant tConvertType en mode conversion automatique avant d'insérer en base pour avoir des Integer a la fin.
emenuet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 17h14   #5
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
Et donc une fois que tu as réglé tes problèmes de conversion, tu peux utiliser la méthode split pour récupérer chaque valeur :

Code :
1
2
3
MonChamp.split(",")[0] pour la première valeur
MonChamp.split(",")[1] pour la deuxième valeur
...
Il faudra bien sûr gérer les cas où il n'y a pas 4 valeurs pour éviter les erreurs du type array index out of bounds.
DevNico est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 17h52   #6
Candidat au titre de Membre du Club
 
Inscription : août 2009
Messages : 48
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 48
Points : 10
Points : 10
ca y est ça fonctionne ...

merci à tous les 2 pour votre aide.

au final ça donne :

tPostgresqlInput1(A) & tPostgresqlInput2(B) --> Tmap --> Tdenormalize--> Tmap-->TmssqlOutput(C)

Dans le TmssqlOutput sur les champs concernés :

Code :
1
2
3
4
 
((row1.NbColl).split(";").length == 0)?(((row1.NbInd).split(";").length >= 1)?(row1.NbInd).split(";")[0]:""):(((row1.NbColl).split(";").length >= 1)?(row1.NbColl).split(";")[0]:"")   ==> C.Nb1
((row1.NbColl).split(";").length == 0)?(((row1.NbInd).split(";").length >= 2)?(row1.NbInd).split(";")[1]:""):(((row1.NbColl).split(";").length >= 2)?(row1.NbColl).split(";")[1]:"") ==>C.Nb2
etc...
Merci encore
jp_____ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h49.


 
 
 
 
Partenaires

Hébergement Web