IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement de jobs Discussion :

Lier une table standard avec une table de paramétrage (contenu variable)


Sujet :

Développement de jobs

  1. #1
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    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 Images attachées   

  2. #2
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199
    Par défaut
    Yes we can !
    Je le voie comme ca:

    row1 : reprise
    row2 : param

    Un tMap dans lequel tu fais une jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    row1.CODEARCH.equals(row1.CODEARCH)
    et pour chaque champs tu met cet expression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    (Expr_bool)?Res_true:Res_false

  3. #3
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    row1.CODEARCH.equals(row1.CODEARCH)
    et pour chaque champs tu met cet expression :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    (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.

  4. #4
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199
    Par défaut
    Qu'est ce qui risque de changer exactement ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    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.

  6. #6
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    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.

  7. #7
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    (String)((HashMap) map).get(row2.param01)
    Tu comprend le principe ?

  8. #8
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    (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

  9. #9
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199
    Par défaut
    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

    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....

  10. #10
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    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.

  11. #11
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Je n'arrive pas à récupérer les valeurs de mon flux dans mon tjavaflex...

  12. #12
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Bon j'ai réussi.

    Merci pour ton aide c'est parfait. Je n'aurais pas penser faire cela.

  13. #13
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    map.put(column,<qqch_recup_val_associe_a_column>);
    Un idée ?

  14. #14
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199
    Par défaut
    alors j'ai reussi a retrouver la valeur depuis un fiels grace à cet source :
    - http://download.oracle.com/javase/6/...a.lang.Object)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
        } 
    }

  15. #15
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
        } 
    }

  16. #16
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199
    Par défaut
    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 ^^

  17. #17
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    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.

  18. #18
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199
    Par défaut
    Du coup je viens de penser à une solution....

    mettre tout simplement l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (String) row1.getClass().getDeclaredField(row2.param01).get(row1)
    Dans le tMap.....

  19. #19
    Futur Membre du Club
    Inscrit en
    Novembre 2010
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 24
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par kisskool45 Voir le message
    Du coup je viens de penser à une solution....

    mettre tout simplement l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  20. #20
    Membre habitué
    Profil pro
    Consultant informatique
    Inscrit en
    Mars 2003
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2003
    Messages : 132
    Points : 199
    Points
    199

Discussions similaires

  1. [AC-2003] Creation de table dynamique avec une requete action création de table
    Par Jeanpierre71 dans le forum IHM
    Réponses: 3
    Dernier message: 24/10/2011, 15h56
  2. Réponses: 2
    Dernier message: 10/07/2007, 10h04
  3. Réponses: 1
    Dernier message: 13/06/2006, 18h57
  4. Faire une procédure stockée avec deux tables
    Par mister3957 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/03/2006, 13h54
  5. pb avec display:table-row d'une <tr> sous ie
    Par bibile dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 13/02/2006, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo