|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 21 ![]() |
Bonjour,
Voila, je débute avec Talend Open Studio et je voudrais svoir s'il y a moyen de rajouter des variables globales personnalisées (concernant la totalité d'un projet ou à l'intérieur d'un seul job) à la liste de variables globales Système (que l'on peut afficher en appyuant sur Ctrl+Space). Et ça dans le but de les utiliser dans différents composants du job. Merci d'avance. |
|
|
00
|
|
|
#2 |
|
Membre éclairé
![]() |
Bonjour,
je ne pense pas qu'il soit possible de faire des variables globales à tout un projet. Par contre, au niveau du job les variables sont stockées dans la variable globalMap. Mais il n'y aura pas d'accès avec Ctrl + Space. Il vaut mieux utiliser des paramètres dans le contexte du job qui sont, au final, des variables globales au job et qui seront accessibles avec l'auto-complétion. |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 21 ![]() |
Bonjour,
Merci pour la réponse, mais si vous pourriez être un peu plus clair par rapport à l'auto-complétion. Quand on déclare un paramètre contexte, comment peut-on accéder à ce paramètre comme étant une variable globale? Merci encore une fois. |
|
|
00
|
|
|
#4 | ||
|
Membre éclairé
![]() |
Et bien en Java, si il y a un paramètre toto, il suffit de presser Ctrl+Space et dans la liste qui s'ouvre alors il y aura context.toto .
En choisissant context.toto, alors Talend va écrire (si toto est de type Double): Code :
Double.parseDouble(((String)context.getProperty("toto"))) Pour affecter une valeur à toto il faudrait faire : Code :
|
||
|
|
00
|
|
|
#5 |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 21 ![]() |
Bonjour,
Voila je vais vous expliquer en détails mon problème : j'effectue en ce moment une mise à jour d'une table qui contient 5 Millions de lignes. Lors de la mise à jour, je ne supprime pas les lignes qui ont été modifiées, en fait j'ai rajouté un champ (Flag) qui indique si la ligne est valide ou pas ('O' pour dire Valide et 'N' pour dire Non Valide). Ce que je fait est donc une sorte d'historisation afin de garder un historique des modifications de chaque ligne. J'ai aussi deux champs : "Date_Debut" et "Date-Fin" qui indique la période sur laquelle la ligne est valide. Mon job s'effectue sur deux étapes : Première étape : je cherche les lignes qui ont été modifiées et j'effectue une mise à jour simple de ma table en insérant 'N' au champ Flag correspondant à la ligne modifiée et j'insère aussi la date courante du système(1) dans le champ "Date_Fin". Deuxième étape : j'insère les nouvelles lignes avec 'O' comme Flag et la date courante du système (2) dans le champ 'Date_Debut". le problème est le suivant : comme j'utilise une table qui contient 5 Millions de lignes, j'obtient un décalage entre la 'date courante du système (1)' et la 'date courante du système (2)' j'ai pensé donc à déclarer une variable globale de type Date, de l'affecter au début du job avec la date courante du système (1) et de faire appel à cette variable dans la deuxième étape du job. Dites moi ce que vous pensez de cette solution, est-elle réalisable à votre avis? auriez-vous sinon une autre solution au problème? Merci Beaucoup pour l'effort. |
|
|
00
|
|
|
#6 |
|
Membre éclairé
![]() |
Cette solution est réalisable : c'est celle que je l'utilise également.
Au tout début de mon job, je stocke la date courante dans mon paramètre afin d'avoir le même date tout le long du projet et éviter des décalages de 15 minutes voire plus. |
|
|
00
|
|
|
#7 |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 21 ![]() |
j'ai déclaré un paramètre 'date2' de type Date, talend écris alors :
(java.util.Date)((String)context.getProperty("date2")) dans le même job, j'essaye d'utiliser ma variable 'date2' dans un composant tMap en l'affectant à un champ date. Talend alors n'accepte pas cette affectation dans le composant tMap et me génère ce messag ed'erreur : 'Error on (java.util.Date)((String)context.getProperty("date2")) => Cannot cast from String to Date' J e voudrais donc juste savoir comment vous avez fait pour déclarer votre paramètre Date et pour l'utiliser plus tard? et dans quelle composant faut-il écrire la commande qui sert à insérer une valeur dans la paramètre? Merci beaucoup |
|
|
00
|
|
|
#8 | ||||
|
Membre éclairé
![]() |
Bonjour,
pour lire le paramètre date, il faut créer une instance de Date : Le plus rapide est de faire : Code :
Code :
Pour affecter une valeur au paramètre, j'utilise le composant tJava. |
||||
|
|
00
|
|
|
#9 | |
|
Membre éclairé
![]() |
Citation:
Il suffit de créer une routine qui contient des variables publiques statiques. Ainsi ces variables sont accessibles dans tous les jobs du projet. En plus, cela permet d'avoir des variables de tout type possible en Java, notamment des tableaux etc... [EDIT] Je viens de tester et ça ne fonctionne pas |
|
|
|
00
|
|
|
#10 |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 21 ![]() |
Bonjour,
j'ai essayé votre solution en mettant une date fixe comme valeur par défaut du paramètre et ça marche. le problème est que quand j'essaye de mettre la date courante du système (TalendDate.getCurrentDate()) comme valeur par défault du paramètre, Talend me renvoie un message d'erreur lors de l'exécution : Exception in component tMap_1 java.text.ParseException: Unparseable date: "TalendDate.getCurrentDate()" Je n'arrive pas à affecter le date courante à mon paramètre. c'est la solution à votre avis? Merci beaucoup pour votre aide précieuse. |
|
|
00
|
|
|
#11 |
|
Membre éclairé
![]() |
Si vous avez mis TalendDate.getCurrentDate() dans la case Default dans l'onglet Contexts où vous déclarez votre paramètre, il est normal d'obtenir une erreur car on ne peut mettre qu'une valeur fixe à cet endroit.
Pour affecter une valeur à l'exécution, il faut faire dans un composant tJava : Code :
context.setProperty("date2",TalendDate.getDate("YYYYMMDD")); |
|
|
00
|
|
|
#12 |
|
Invité régulier
![]() Inscription : juin 2007 Messages : 21 ![]() |
Merci infinément pour toutes ces informations précieuses.
le problème de décalage est résolu. Je vais réfléchir sur la possibilité d'avoir une variable globale pour tout le projet. Tenez moi au courant si vous trouvez une solution. Merci encore une fois.:merci |
|
|
00
|
|
|
#13 |
|
Nouveau Membre du Club
![]() Inscription : juin 2006 Messages : 109 ![]() |
Bonjour,
J'essaye aussi d'insérer dans une table Oracle "Journal" la date et l'heure de début et fin de chaque job. J'ai relié un "tjava" à mon t_map avec dedans : context.setProperty("date_debut",TalendDate.getDate("YYYYMMDD")); Puis dans un tOracleRow j'ai mis l'update : update journal set date_debut= " + new SimpleDateFormat("YYYYMMDD").parse((String)context.getProperty("date_debut")) +" where FONCTION ='CHARGEMENT' and TRAITEMENT='CATALOGUE_INTERVENTION'" il me fait une erreur: java.lang.IllegalArgumentException: Illegal pattern character 'Y'. Il n'a pas l'air d'aimer les dates.... Vous sauriez d'où ça vient? |
|
|
00
|
|
|
#14 | ||
|
Membre éclairé
![]() |
Bonjour,
il faut utiliser 'y' et non 'Y' avec un objet SimpleDateFormat. Votre reqûete deviendrait : Code :
|
||
|
|
00
|
|
|
#15 |
|
Nouveau Membre du Club
![]() Inscription : juin 2006 Messages : 109 ![]() |
Je n'ai plus la même erreur:
Exception in component tOracleRow_1 java.lang.RuntimeException: Execution failure, there might be an error in your SQL syntax. Je me dit que ce format de date: SimpleDateFormat("yyyyMMdd") n'est peut être pas compatible avec mes dates Oracle. Sous oracle ce sont juste des formats date toute simple, aujourd'hui ce qu'il y a dedans est: 17/07/2007 11:37:06 Quand je vais directement dans mon toad : update journal set date_debut= '17072007' where FONCTION ='CHARGEMENT' and TRAITEMENT='CATALOGUE_INTERVENTION' cela fonctionne bien, il me met ensuite 17/07/2007 dans ma variable date_debut |
|
|
00
|
|
|
#16 |
|
Nouveau Membre du Club
![]() Inscription : juin 2006 Messages : 109 ![]() |
J'ai relié mon tmap avec mon tjava par un lien "main" order3, est ce que ce ne serai pas encore ça le problème?
car le tOracleRow est relié au tOracleOutput qui est relié par un "main order 1" au tmap. Je ne sais pas dans quel ordre il execute les composants. |
|
|
00
|
|
|
#17 |
|
Membre éclairé
![]() |
Je ne suis pas certain que le problème vienne de cela.
Mais une manière plus propre de procéder est d'enlever le lien entre le tMap et le tJava puis de créer un lien Run if Ok depuis le tJava jusqu'au PostgreSqlInput. |
|
|
00
|
|
|
#18 |
|
Nouveau Membre du Club
![]() Inscription : juin 2006 Messages : 109 ![]() |
Alors j'ai créé le lien "run if ok" depuis le tjava vers le tPostgreSqlInput.
Je viens d'afficher : new SimpleDateFormat("YYYYMMDD").parse((String)context.getProperty("date_debut")) dans une fenêtre tSystem et cela donne : "Tue Jul 17 00:00:00 CEST 2007" Je pense que c'est le format de date qui bloque je vais essayer de travailler là dessus. |
|
|
00
|
|
|
#19 | ||
|
Membre éclairé
![]() |
Il suffit de faire :
Code :
Je viens seulement de le voir alors que c'est évident pourtant |
||
|
|
00
|
|
|
#20 |
|
Nouveau Membre du Club
![]() Inscription : juin 2006 Messages : 109 ![]() |
Merci, on y était presque.
Sous toad, il doit faire une conversion implicite de ma chaine de caractère en to_date. J'ai eu un éclair tout à coup! donc il fallait que je mette: "update journal set date_debut= to_date('" + (String)context.getProperty("date_deb") + "','DDMMYYYY') where FONCTION ='CHARGEMENT' and TRAITEMENT='CATALOGUE_INTERVENTION'" et ça fonctionne! merci en fait c'était un problème de conversion entre talend et Oracle. Bonne journée bouvda |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com