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

BIRT Discussion :

Comment passer des paramètres dans une requête XPATH


Sujet :

BIRT

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut Comment passer des paramètres dans une requête XPATH
    Bonjour,

    J'ai un data set XML qui pointe vers un fichier XML qui ne contient pas d'attributs (que des éléments). J'aimerais passer un paramètre dans la requête XPATH afin de filtrer les données avant de les afficher dans une table.

    Pour cela j'ai vu qu'on pouvait utiliser cette syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /categorie[@id={?param_id?}]/produits/produit
    Dans l'onglet "parameters", j'ai bien une ligne param_id que je mets en Integer et je lui assigne un id par défaut présent dans mon XML. Lorsque je clique sur "Preview Results", j'ai une erreur "The filter definition is invalid".
    J'ai aussi essayé sans le @. Je n'obtiens plus l'erreur mais cela ne me retourne aucune donnée.

    (J'utilise BIRT 2.5.2 mais j'ai testé avec la version 2.6.0 et le problème persiste)

    J'ai longuement cherché mais en vain. Quelqu'un a-t-il déjà rencontré ce genre de problème ?

  2. #2
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Bonjour,

    J'ai l'impression que les paramètres dans les Data Set XML ne servent pas à grand chose... parce que BIRT ne veut pas valider une expression XPath avec des [] (Je trouve ça bête aussi).

    Tu peux cependant utiliser la fonctionnalité Filters de ton DataSet.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    En fait, si dans mon XML j'avais mis mon <id> en tant qu'attribut, la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /categorie[@id="2"]/produits/produit
    fonctionne bien. Mais le problème c'est que mon XML ne possède pas d'attribut.

    Pour ce qui est de la fonction filter ça ne va pas car j'ai un système de Maitre/détail dans mon rapport. C'est à dire que je vais avoir une table qui va contenir la liste de mes id de catégorie et que pour chaque ligne, je vais afficher plusieurs tables qui vont retourner des données (comme des produits ou autre chose). Ces sous-tables doivent être filtrées par l'id de la categorie (de la table parent). Le fait d'utiliser les filters du dataset ne fonctionne pas car la valeur du paramètre change à chaque itération. J'avais essayé aussi d'utiliser les filters des sous-tables mais le soucis c'est que mon XML peut faire 50 000 lignes et là le temps d'exécution est excessivement long.

  4. #4
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Je ne comprends pas ce que tu veux faire. Peux-tu décrire ton problème avec un exemple stp ?

    D'autre part, dans mon cas, je n'arrive absolument pas à mettre des crochets dans une expression XPAth, il m'envoie complètement ballader.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    Ci-joint, un exemple du resultat final qu'il doit y avoir (test.xml est la source de données et report.xml est le rapport (j'ai juste changé l'extension pour que ça passe ici)).

    Le but est d'éviter de faire un filter sur chaque sous-table car quand la source xml fait plus de 10 000 lignes ça devient très long de tout calculer.
    C'est pour cela qu'on m'a suggéré d'utiliser des paramètres à envoyer au dataset lors de chaque itération de catégorie (par le biais du bouton "Dataset parameter biding" dans l'onglet "binding" d'une sous-table).

    La syntaxe XPATH est plutôt clair pour filtrer sur les données :
    tuto XPATH (rubrique "Le conditions logiques" mais lorsque ce que j'applique à la lettre ceci dans ma requête XPATH, cela ne me retourne rien du tout...
    Fichiers attachés Fichiers attachés

  6. #6
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Le Data Set n'est exécuté qu'une seule fois, d'ailleurs, je pense que c'est plus consommateur d'exécuter un DataSet 1000 fois que de filtrer un DataSet 1000 fois.

    Les tables imbriqués sont effectivement déconseillées.

    Il y a deux solutions, pas jolies mais normalement efficaces :
    Faire deux Linked Data Set (un pour machin, un pour produit qui contiennent aussi les données de la catégorie)
    Faire deux Data Set dès le début (un pour machin un pour produit, qui contiennent les données de la catégorie).

    Au choix...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    Si le dataset n'est exécuté qu'une fois, alors pourquoi peut-on envoyer un paramètre (en le bindant) directement depuis une table ? (j'ai testé avec une source de données jdbc et ça fonctionne).

    Dans mon exemple j'ai déjà un dataset pour produit et un autre pour machin.
    Chacun de ces dataset contient l'id de la catégorie (mais je pourrais y rajouter le nom).
    Comment faire alors ? Grouper chacun par la catégorie ? Oui possible mais visuellement ça se sera pas aligné car pour une catégorie il y n'y a pas forcément le même nombre de produits et le même nombre de machins (d'où le principe du maitre / détail qui aligne bien pour que visuellement on puisse bien voir ce qui appartient à chaque catégorie).

  8. #8
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Ah, peut être alors...

    Bon par contre, je n'arrive toujours pas à mettre des conditions dans les expressions XPath de BIRT (je suis en 2.6).

    Mais sinon, tu peux essayer comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /items/categories/categorie[id=$nom_parametre]/produits

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    Ta syntaxe me provoque un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Illegal group reference

  10. #10
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    C'est les crochet pour la condition qui me provoque cette erreur tout simplement.

    Mais, tu as essayé de mettre un filtre dans le Data Set directement ?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    Ben chez moi c'est le $ qui me provoque l'erreur car ce n'est pas du XPATH (donc normal). Filtrer directement dans le dataset n'est pas une bonne idée car la valeur du filtre change pour chaque itération de catégorie (d'où la nécessité de binder le paramètre depuis la table).

    Je me suis installé le plugin XPath Checker pour firefox afin de tester mes requêtes XPATH :

    /items/categories/categorie[id=2] => Fonctionne dans XPath Checker mais pas dans BIRT 2.6.0 (malgré un copier/coller, cela me retourne ni erreur, ni valeur...)

  12. #12
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Citation Envoyé par SyLvErStOrM Voir le message
    Ben chez moi c'est le $ qui me provoque l'erreur car ce n'est pas du XPATH (donc normal). Filtrer directement dans le dataset n'est pas une bonne idée car la valeur du filtre change pour chaque itération de catégorie (d'où la nécessité de binder le paramètre depuis la table).

    Je me suis installé le plugin XPath Checker pour firefox afin de tester mes requêtes XPATH :

    /items/categories/categorie[id=2] => Fonctionne dans XPath Checker mais pas dans BIRT 2.6.0 (malgré un copier/coller, cela me retourne ni erreur, ni valeur...)
    On doit pas faire le filtre au même endroit et je ne comprends absolument pas comment tu fais du coup...

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    La requête XPATH se fait lors de la création / modification du dataset dans l'onglet "Row mapping"

  14. #14
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    C'est bien le même dont on parle. Donc je ne vois pas pourquoi il y aurait une différence entre le moment où est appelé filters (dans l'édition du DataSet, pas de la Table !!!) et le Row Mapping.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    Ben en fait, dans le filter du dataset, on filtre une seule fois les données avant de les afficher. Ce n'est pas ce que je veux puisque je dois filtrer autant de fois qu'il y a de categorie.

    Si je prends l'exemple des produits, je veux afficher les produits groupés par catégorie (sans faire de groupe dans le composant table puisque qu'il faudra faire la même chose avec machin). Si je mets un filtre au niveau du dataset, je vais filtrer quoi ? (l'équivalent de "where produit.cat_id = ?") et le "?" je le remplace par quoi ? Quelle catégorie ? Ce n'est pas possible.

    C'est pourquoi, dans l'exemple que je t'ai envoyé, le filtre se situe au niveau du composant table qui affiche la liste des produits. On va pouvoir faire un filtre du genre (where produit.cat_id = l'id de la catégorie de la table parent)

    Le problème de mettre le filtre à cet endroit, signifie qu'on charge tous les produits pour chaque catégorie et qu'on affiche que ceux qui corresponde. Ceci implique un temps d'exécution très long quand on a beaucoup de lignes dans la source xml.

    Tu me suis ?

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par BiM Voir le message
    C'est bien le même dont on parle. Donc je ne vois pas pourquoi il y aurait une différence entre le moment où est appelé filters (dans l'édition du DataSet, pas de la Table !!!) et le Row Mapping.
    La différence est très simple, c'est que dans le Row mapping, je peux lui passer un paramètre depuis le composant table (par le biais du bouton "Dataset parameter biding") alors que le filtre non.

    (J'avais pas bien compris ta question lors de ma précédente réponse dsl : /)

  17. #17
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Après, il peut ne pas être dans l'Expression Builder mais être disponible quand même. Ca se teste.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    Je ne te suis pas...

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 92
    Points : 45
    Points
    45
    Par défaut
    J'ai partiellement résolu mon problème. Etant donné que je n'ai toujours pas trouvé le moyen de filtrer sur un élément xml en XPATH en tapant cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /categories/categorie[id=2]/produits/produit
    J'ai donc décidé de modifier mon algorithme XML pour passer l'id en attribut de mon élément categorie. J'ai donc modifier la requête XPATH comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /categories/categorie[@id="{?param?}"]/produits/produit
    Techniquement parlant, cela fonctionne bien.

    A la base, je voulais utiliser cette méthode pour réduire au maximum le temps d'exécution du rapport. Malheureusement, celui-ci est toujours beaucoup trop élevé: 2min30 environ pour parser un fichier XML de 10 000 lignes (affichant 32 pages en pdf environ).

    Une idée pour réduire ce temps ?

Discussions similaires

  1. Comment passer des paramètres dans une EL ?
    Par verbose dans le forum JSF
    Réponses: 1
    Dernier message: 01/09/2011, 11h35
  2. Réponses: 2
    Dernier message: 11/10/2006, 13h37
  3. Réponses: 1
    Dernier message: 21/03/2006, 14h29
  4. [SQL server] Comment Fusionner des données dans une requête
    Par MoTUmBo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2005, 15h24

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