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 24/01/2011, 14h27   #1
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Par défaut Lier une table standard avec une table de paramétrage (contenu variable)

Bonjour,

Je suis actuellement sur un projet de reprise d'historique pour une gestion d'archivage. le job sur lequel je dois travailler consiste à générer un fichier csv qui servira au paramétrage d'un logiciel (nouveau logiciel de gestion d'archive).

J'ai un gros problème dans mon job car je dois me baser sur un fichier de paramétrage à croiser avec mon fichier de reprise d'historique.

Je m'explique :
Voici mon fichier de paramétrage (REPRISE.JPG) et mon fichier de paramétrage (PARAM.JPG).

Ma question est simple (et je pense que vous avez compris ce que je veux faire) c'est de récupérer donc les champs correspondant au paramétrage dans la table de reprise (en fonction de ce qui correspond à tel ou tel code_archive).

Est ce possible avec Talend ?

Ne faites pas attention au nombre (c'est aléatoire) c'est juste pour montrer le principe : je dois récupérer du contenu de la même table mais en rapport avec le contenu du paramétrage (qui est en fait le nom des champs à récupérer).

C'est tordu mais bon.
Images attachées
Type de fichier : jpg REPRISE.JPG (22,6 Ko, 6 affichages)
Type de fichier : jpg PARAM.JPG (23,0 Ko, 5 affichages)
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h02   #2
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
Yes we can !
Je le voie comme ca:

row1 : reprise
row2 : param

Un tMap dans lequel tu fais une jointure
Code :
row1.CODEARCH.equals(row1.CODEARCH)
et pour chaque champs tu met cet expression :

Code :
row2.param01.equals("CHAMPS1")?row1.CHAMPS1:(row2.param01.equals("CHAMPS2")?row1.CHAMPS2:(row2.param01.equals("CHAMPS3")?row1.CHAMPS3:(etc....)))
Je sais l'instruction peut paraitre barbare mais c'est l'equivalent d'un case when en java.

Code :
(Expr_bool)?Res_true:Res_false
kisskool45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h05   #3
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Citation:
Envoyé par kisskool45 Voir le message
Yes we can !
Je le voie comme ca:

row1 : reprise
row2 : param

Un tMap dans lequel tu fais une jointure
Code :
row1.CODEARCH.equals(row1.CODEARCH)
et pour chaque champs tu met cet expression :

Code :
row2.param01.equals("CHAMPS1")?row1.CHAMPS1:(row2.param01.equals("CHAMPS2")?row1.CHAMPS2:(row2.param01.equals("CHAMPS3")?row1.CHAMPS3:(etc....)))
Je sais l'instruction peut paraitre barbare mais c'est l'equivalent d'un case when en java.

Code :
(Expr_bool)?Res_true:Res_false
Ouais j'me suisi dis au début que j'allais de voir faire la totale "en dur" mais je pensais qu'il y avait une autre poissibilité.
Le problème c'est que mon fichier de paramétrage va surement changer alors je ne sais pas si cette solution sera la meilleure mais bon.

En partant du principe que mon fichier de reprise sera certainement figé je pourrais faire un truc comme ça...
Faut voir..

En tout cas merci je vais tenter ça. Ça n'empêche pas d'autres idées de la part de quelqu'un d'autre.
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h28   #4
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
Qu'est ce qui risque de changer exactement ?
kisskool45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 15h31   #5
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Citation:
Envoyé par kisskool45 Voir le message
Qu'est ce qui risque de changer exactement ?
Bah en fait non j'ai dit n'importe quoi à ce sujet là.
Effectivement si je vois ça au plus large c'est à dire une expression de ton style pour tous les champs possible dans mon fichier de reprise : ça marchera très bien.
Mais (car il y a toujours un "mais") j'ai 85 champs dans cette table. Donc la construction de cette expression et surtout la compilation et l'exécution vont être bien lourdes.
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 16h55   #6
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Est ce que c'est possible de créer une fonction qui aurait en entrée un chaine )ou autre je ne sais pas bien), qui ferait cette expression ?
en gros qui me rendrait le 'row2.<monchamps>' et qui prendrait en paramètre le nom du champs.
au moins j'économiserai de la saisie.
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h30   #7
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
Oui c possible mais ça te renverrai un String
Ça ne serais pas interprétable en Java.
On ne peut pas avoir de nom de variable variable en java.

Par contre si tu n'est pas allergique au Java j'ai une solution
Tu fais passer ton flow reprise par un tJavaFlex
Ou tu utilise un Object HashMap ou tu y met tous les éléments CHAMPS01,VALEUR
Ton schéma en sorti du TjavaFlex :
map Objet
code_ARCH String

ensuite dans ton tmap tu fera tjrs la jointure avec CODE_ARCH
et tu utilise cet expression :
Code :
(String)((HashMap) map).get(row2.param01)
Tu comprend le principe ?
kisskool45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 17h42   #8
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Citation:
Envoyé par kisskool45 Voir le message
Oui c possible mais ça te renverrai un String
Ça ne serais pas interprétable en Java.
On ne peut pas avoir de nom de variable variable en java.

Par contre si tu n'est pas allergique au Java j'ai une solution
Tu fais passer ton flow reprise par un tJavaFlex
Ou tu utilise un Object HashMap ou tu y met tous les éléments CHAMPS01,VALEUR
Ton schéma en sorti du TjavaFlex :
map Objet
code_ARCH String

ensuite dans ton tmap tu fera tjrs la jointure avec CODE_ARCH
et tu utilise cet expression :
Code :
(String)((HashMap) map).get(row2.param01)
Tu comprend le principe ?
Ca ne va pas fonctionner : je dois avoir une nouvelle instance de mon objet (de type hashmap) par ligne de mon fichier param.
Cet objet aura pour chaque colonne une association clé/valeur du genre : param1,champs7 ou param4,champs2 etc...

Et puis avec cette méthode je ne vais pas récupérer le contenu du champs de reprise ayant le nom : (String)((HashMap) map).get(row2.param01)
Je vais juste lui donner cette valeur
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2011, 18h01   #9
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
oui tu aura un HashMap par ligne de reprise et alors ?
Ca va pas exploser ta JVM à moins que tu est des millions de ligne à traiter
Et dans la méthode que je te donne je te dis de faire passer ton ancien fichier dans la HashMap pas ton fichier param

Citation:
Et puis avec cette méthode je ne vais pas récupérer le contenu du champs de reprise ayant le nom : (String)((HashMap) map).get(row2.param01)
Je vais juste lui donner cette valeur
....
méthode put pour donner la valeur
méthode get pour prendre la valeur
...
la clé est un String....
si la clé est "Champ1" valeur "VALEUR1", "Champ2" valeur "VALEUR2"

(String)((HashMap) map).get(row2.param01) retourne "VALEUR1" si row2.param01="Champ1"
retourne "VALEUR2" si row2.param01="Champ2" etc....
kisskool45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2011, 09h57   #10
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Citation:
Envoyé par kisskool45 Voir le message
oui tu aura un HashMap par ligne de reprise et alors ?
Ca va pas exploser ta JVM à moins que tu est des millions de ligne à traiter
Et dans la méthode que je te donne je te dis de faire passer ton ancien fichier dans la HashMap pas ton fichier param


....
méthode put pour donner la valeur
méthode get pour prendre la valeur
...
la clé est un String....
si la clé est "Champ1" valeur "VALEUR1", "Champ2" valeur "VALEUR2"

(String)((HashMap) map).get(row2.param01) retourne "VALEUR1" si row2.param01="Champ1"
retourne "VALEUR2" si row2.param01="Champ2" etc....
D'accord j'ai bien saisi.
Par contre si tu pouvais me résumer ce que tu me proposes car j'ai du mal à comprendre le post où tu décris la méthode à utiliser.

En fait c'est surtout que je ne vois aps dans mon tmap comment je vais pouvoir lui faire comprendre de récupérer, non pas le contenu de la variable, mais le champs correspondant au contenu de cette variable (car c'est ça que je cherche).

Merci encore.
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 10h50   #11
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Je n'arrive pas à récupérer les valeurs de mon flux dans mon tjavaflex...
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 14h52   #12
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Bon j'ai réussi.

Merci pour ton aide c'est parfait. Je n'aurais pas penser faire cela.
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 10h17   #13
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Bon, en fait j'ai un autre soucis.

J'ai paramétré mon job pour qu'il puisse récupérer les noms des champs de manière dynamique pour que je n'ai pas à écrire pour chacun des champs :

Code :
map.put("champ",row.champ);
de ce fait j'arrive à récupérer le nom du champs mais malheureusement pas la valeur, j'ai fait comme ça :

Code :
1
2
3
4
5
6
7
FOR (java.lang.reflect.FIELD FIELD : row1.getClass().getDeclaredFields())  
{      
    IF (!FIELD.getName().equalsIgnoreCase("commonByteArrayLock") && !FIELD.getName().equalsIgnoreCase("commonByteArray")) 
    { 
       COLUMN = FIELD.getName();
    } 
}
Et donc ma variable column contient bien le nom du champs mais je voudrais récupérer la valeur correspondante pour pouvoir faire un truc du genre :

Code :
map.put(COLUMN,<qqch_recup_val_associe_a_column>);
Un idée ?
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 11h36   #14
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
alors j'ai reussi a retrouver la valeur depuis un fiels grace à cet source :
- http://download.oracle.com/javase/6/...a.lang.Object)

Code :
1
2
3
4
5
6
7
8
9
10
 
FOR (java.lang.reflect.FIELD FIELD : row1.getClass().getDeclaredFields())  
{      
    IF (!FIELD.getName().equalsIgnoreCase("commonByteArrayLock") && !FIELD.getName().equalsIgnoreCase("commonByteArray")) 
    { 
       COLUMN = FIELD.getName();
       VALUE=(String) FIELD.get(row1);
       map.put(COLUMN,VALUE);
    } 
}
kisskool45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 11h42   #15
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Citation:
Envoyé par kisskool45 Voir le message
alors j'ai reussi a retrouver la valeur depuis un fiels grace à cet source :
- http://download.oracle.com/javase/6/...a.lang.Object)

Code :
1
2
3
4
5
6
7
8
9
10
 
FOR (java.lang.reflect.FIELD FIELD : row1.getClass().getDeclaredFields())  
{      
    IF (!FIELD.getName().equalsIgnoreCase("commonByteArrayLock") && !FIELD.getName().equalsIgnoreCase("commonByteArray")) 
    { 
       COLUMN = FIELD.getName();
       VALUE=(String) FIELD.get(row1);
       map.put(COLUMN,VALUE);
    } 
}
Ah merci, tu es mon sauveur !

J'me suis permis de changer un truc : en fait j'en connais un peu en java...
Code :
1
2
3
4
5
6
7
8
9
10
FOR (java.lang.reflect.FIELD FIELD : row1.getClass().getDeclaredFields())  
{      
    IF (!FIELD.getName().equalsIgnoreCase("commonByteArrayLock") && !FIELD.getName().equalsIgnoreCase("commonByteArray")) 
    { 
       COLUMN = FIELD.getName();
       VALUE=String.valueOf(FIELD.get(row1));
       map.put(COLUMN,VALUE);
    } 
}
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 11h47   #16
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
bah tu moment que tu est sur du type de ton objet
Le résultat est le même ^^
ça va je gère aussi un peu en java. même si avec talend on y touche beaucoup moins, mais cool de voir qq qui est pas effrayé par qq lignes de codes ^^
kisskool45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 11h50   #17
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Citation:
Envoyé par kisskool45 Voir le message
bah tu moment que tu est sur du type de ton objet
Le résultat est le même ^^
ça va je gère aussi un peu en java. même si avec talend on y touche beaucoup moins, mais cool de voir qq qui est pas effrayé par qq lignes de codes ^^
Ah bin carrément pas effrayé par java.
Avant j'étais dev java sur un progiciel (en J2EE) et j'aimais bien, là c'est du talend, BDD que je fais mais c'est bien ça me fait du bien de coder de temps en temps.
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h02   #18
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
Du coup je viens de penser à une solution....

mettre tout simplement l'expression :
Code :
1
2
 
(String) row1.getClass().getDeclaredField(row2.param01).get(row1)
Dans le tMap.....
kisskool45 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h04   #19
Invité de passage
 
Romain ALCARAZ
Inscription : novembre 2010
Messages : 24
Détails du profil
Informations personnelles :
Nom : Romain ALCARAZ

Informations forums :
Inscription : novembre 2010
Messages : 24
Points : 4
Points : 4
Citation:
Envoyé par kisskool45 Voir le message
Du coup je viens de penser à une solution....

mettre tout simplement l'expression :
Code :
1
2
 
(String) row1.getClass().getDeclaredField(row2.param01).get(row1)
Dans le tMap.....
je vais tenter ça et si ça marche c'est parfait !
getdeclaredfield peut prendre un argument alors ?
romain.alcaraz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/01/2011, 16h09   #20
Membre actif
 
Consultant informatique
Inscription : mars 2003
Messages : 130
Détails du profil
Informations personnelles :
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2003
Messages : 130
Points : 181
Points : 181
Oui
cf :
http://download.oracle.com/javase/6/...a.lang.String)
kisskool45 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 04h11.


 
 
 
 
Partenaires

Hébergement Web