|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
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 :
/categorie[@id={?param_id?}]/produits/produit 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 ? |
|
|
00
|
|
|
#2 |
![]() ![]() Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT Inscription : janvier 2005 Messages : 7 299 ![]() |
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. |
|
|
00
|
|
|
#3 |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
En fait, si dans mon XML j'avais mis mon <id> en tant qu'attribut, la syntaxe
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. |
|
|
00
|
|
|
#4 |
![]() ![]() Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT Inscription : janvier 2005 Messages : 7 299 ![]() |
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. |
|
|
00
|
|
|
#5 |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
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... |
|
|
00
|
|
|
#6 |
![]() ![]() Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT Inscription : janvier 2005 Messages : 7 299 ![]() |
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... |
|
|
00
|
|
|
#7 |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
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). |
|
|
00
|
|
|
#8 |
![]() ![]() Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT Inscription : janvier 2005 Messages : 7 299 ![]() |
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 :
/items/categories/categorie[id=$nom_parametre]/produits |
|
|
00
|
|
|
#9 |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
Ta syntaxe me provoque un
|
|
|
00
|
|
|
#10 |
![]() ![]() Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT Inscription : janvier 2005 Messages : 7 299 ![]() |
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 ? |
|
|
00
|
|
|
#11 |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
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...) |
|
|
00
|
|
|
#12 | |
![]() ![]() Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT Inscription : janvier 2005 Messages : 7 299 ![]() |
Citation:
|
|
|
|
00
|
|
|
#13 |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
La requête XPATH se fait lors de la création / modification du dataset dans l'onglet "Row mapping"
|
|
|
00
|
|
|
#14 |
![]() ![]() Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT Inscription : janvier 2005 Messages : 7 299 ![]() |
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.
|
|
|
00
|
|
|
#15 |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
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 ? |
|
|
00
|
|
|
#16 | |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
Citation:
(J'avais pas bien compris ta question lors de ma précédente réponse dsl : /) |
|
|
|
00
|
|
|
#17 |
![]() ![]() Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT Inscription : janvier 2005 Messages : 7 299 ![]() |
Après, il peut ne pas être dans l'Expression Builder mais être disponible quand même. Ca se teste.
|
|
|
00
|
|
|
#18 |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
Je ne te suis pas...
|
|
|
00
|
|
|
#19 |
|
Membre à l'essai
![]() Inscription : juin 2007 Messages : 88 ![]() |
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 :
/categories/categorie[id=2]/produits/produit Code :
/categories/categorie[@id="{?param?}"]/produits/produit 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 ? |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com