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 22/06/2011, 10h18   #1
Candidat au titre de Membre du Club
 
Femme
Développeur Web
Inscription : avril 2005
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 42
Points : 12
Points : 12
Envoyer un message via MSN à Elianora la blanche
Par défaut Accessibiltés des variables globales

Bonjour,

je maîtrise encore mal Talend et ne connais que très peu Java.

En début de job (après un tPrejob), je déclares une variable globale "nom_fichier" vide (dans un tSetGlobalVar)

plus loin dans mon traitement, je définis cette variable dans un tJavaRow par globalMap.put("nom_fichier", nom_fichier);
dans ce même tJavaRow, je transmets également la variable avec output_row.nom_fichier = nom_fichier; pour avoir la valeur qui doit être enregistrée en base

je parcours plusieurs provenant d'une base de données, et chaque ligne génère un nom_fichier différent
en sortie de mon tMysqlInput, j'ai mis un tFlowToIterate pour traiter chaque ligne séparément

en fin de traitement, je dois écrire dans un fichier qui, vous l'aurez deviné, doit s'appeler du nom se trouvant dans la variable
j'ai donc créé un tFileOutputDelimited et indiqué "B" + (String)globalMap.get("nom_fichier") + ".txt" dans le paramètre "Nom de fichier" mais la variable n'a pas de valeur à ce moment-là (mon fichier s'appelle juste B.txt) alors que la valeur passée par output_row est correcte
à la ligne suivante, la variable a une valeur mais c'est celle de la ligne d'avant (et ainsi de suite)

est-ce que la valeur est affectée seulement en fin de traitement du sous-job où elle est définie ?
je ne comprends pas pourquoi ça fait ça, d'autant que l'affectation fonctionne puisque la valeur devient disponible plus tard (mais trop tard)

merci d'avance de m'éclairer, je nage lamentablement là
Elianora la blanche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 10h47   #2
Nouveau Membre du Club
 
Inscription : février 2010
Messages : 24
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 24
Points : 34
Points : 34
Bonjour,

Pourrais-tu faire un imprimé écran de ton job ?
Ton problème est simple, mais l'orchestration des différents éléments n'est pas très claire en lisant ton texte.


Julien
kojuo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 11h30   #3
Candidat au titre de Membre du Club
 
Femme
Développeur Web
Inscription : avril 2005
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 42
Points : 12
Points : 12
Envoyer un message via MSN à Elianora la blanche
voilà, c'est dans tJavaRow_3 que je fais globalMap.put("nom_fichier", nom_fichier); et output_row.nom_fichier = nom_fichier;

tous les fileOutput fonctionnent sur le même principe, c'est juste pour écrire différentes lignes

le prejob est avant
le bout de flèche qu'on voit en haut à gauche qui arrive sur le tMysqlInput vient du tMysqlConnection
Images attachées
Type de fichier : jpg talend.jpg (105,2 Ko, 22 affichages)
Elianora la blanche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/06/2011, 15h12   #4
Nouveau Membre du Club
 
Inscription : février 2010
Messages : 24
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 24
Points : 34
Points : 34
D'accord je vois mieux.

1) Remarque pas très importante mais j'informe quand même : Le tSetGlobalVar que tu as positionné au niveau de ton prejob n'a pas d'utilité.
En fait le code qui est généré derrière ce composant est identique à celui que tu as mis au niveau de ton tJavaRow_3, c'est à dire que tSetGlobalVar{paramètres : "nom_fichier",""} <=> globalMap.put("nom_fichier", "");

Tu comprendras donc qu'utiliser ce composant pour "initialiser" la clé n'a, à priori, pas vraiment d'intérêt.


2) Dans un flux, peu importe le nombre de composants, la sortie est "ouverte" avant l'entrée (cf wiki de talend open studio). Cela veut donc dire qu'à chaque itération de ton flux, les chemins de tes fichiers de sortie sont initialisés avant le "démarrage" du flux.
C'est pourquoi ton composant tJavaRow_3 affecte "nom_fichier" avec un train de retard...

Pour résoudre ton problème il faut donc que tu te débrouilles pour que la valeur de ta clé "nom_fichier" soit affectée à priori de l'execution du flux (qui commence à tJava_1 et se termine avec les sorties de tMap_2).
Donc juste avant le tFlowToIterate_1, si tu as moyen de déterminer le nom du fichier à ce moment là.


J'espère que ça répond à ton problème.

J.
kojuo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/06/2011, 15h47   #5
Candidat au titre de Membre du Club
 
Femme
Développeur Web
Inscription : avril 2005
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 42
Points : 12
Points : 12
Envoyer un message via MSN à Elianora la blanche
merci !!
en déplaçant le code dans un tjavaRow en sortie du tMysqlInput, ça fonctionne (au moins pour le nom de fichier, pour le reste de mon job, c'est moins sûr ^^)
Elianora la blanche est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 12h00   #6
Nouveau Membre du Club
 
Inscription : février 2010
Messages : 24
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : février 2010
Messages : 24
Points : 34
Points : 34
Citation:
Envoyé par Elianora la blanche Voir le message
Bonjour

je continue de développer le même job et j'ai de nouveau des problèmes d'accès aux valeurs de variables globales (ou plutôt des problèmes du fait qu'elles ne sont pas encore définies au moment où je veux les utiliser)

dans tJavaRow6 je définie une variable telle que globalMap.put("increment_id", input_row.increment_id); et dans tWebServiceInput_1 (webservice sugarcrm), je tente d'en récupérer la valeur par String order_inc_id = (String)globalMap.get("increment_id"); mais à ce niveau, ça me renvoi null...

comment puis-je organiser mes composants pour avoir les bonnes valeurs bien définies dans les bonnes variables ?
NB : j'ai absolument besoin de lier la sortie du webservice dans un tMap avant tJavaRow_3 pour faire des traitements dedans

merci d'avance, je nage lamentablement là...
Bonjour,

Est-ce vous avez testé que tWSI_1 vous renvoie bien un résultat, indépendamment du job, en renseignant une valeur d'ID en dur par exemple ?

La valeur de increment_id est-elle liée à la sortie du traitement ?

Quelles options de lookup utilisez-vous pour tWSI_1 ?
kojuo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 12h01   #7
Candidat au titre de Membre du Club
 
Femme
Développeur Web
Inscription : avril 2005
Messages : 42
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2005
Messages : 42
Points : 12
Points : 12
Envoyer un message via MSN à Elianora la blanche
oui le webservice renvoi bien qqch si je mets une valeur en dur

cela dit, cela va être traité autrement, la question ne se pose donc plus (pour le moment ^^)

merci
Elianora la blanche 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 23h05.


 
 
 
 
Partenaires

Hébergement Web