Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > BIRT
BIRT Forum d'entraide sur BIRT (Business Intelligence and Reporting Tools). Avant de poster --> FAQ BIRT,Tutoriels BIRT
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 27/04/2011, 10h55   #1
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
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 :
/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 ?
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 11h08   #2
BiM
Modératrice
 
Avatar de BiM
 
Femme
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
Inscription : janvier 2005
Messages : 7 299
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
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 299
Points : 8 650
Points : 8 650
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.
__________________
__~{@ BiM - Modératrice "Business Intelligence" @}~
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
___________.~{@ Lapine crétine @}~
BiM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 11h17   #3
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
En fait, si dans mon XML j'avais mis mon <id> en tant qu'attribut, la syntaxe
Code :
/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.
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 11h32   #4
BiM
Modératrice
 
Avatar de BiM
 
Femme
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
Inscription : janvier 2005
Messages : 7 299
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
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 299
Points : 8 650
Points : 8 650
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.
__________________
__~{@ BiM - Modératrice "Business Intelligence" @}~
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
___________.~{@ Lapine crétine @}~
BiM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 11h54   #5
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
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
Type de fichier : xml test.xml (1,1 Ko, 4 affichages)
Type de fichier : xml report.xml (27,5 Ko, 2 affichages)
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h04   #6
BiM
Modératrice
 
Avatar de BiM
 
Femme
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
Inscription : janvier 2005
Messages : 7 299
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
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 299
Points : 8 650
Points : 8 650
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...
__________________
__~{@ BiM - Modératrice "Business Intelligence" @}~
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
___________.~{@ Lapine crétine @}~
BiM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h15   #7
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
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).
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h25   #8
BiM
Modératrice
 
Avatar de BiM
 
Femme
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
Inscription : janvier 2005
Messages : 7 299
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
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 299
Points : 8 650
Points : 8 650
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
__________________
__~{@ BiM - Modératrice "Business Intelligence" @}~
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
___________.~{@ Lapine crétine @}~
BiM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h33   #9
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
Ta syntaxe me provoque un
Code :
Illegal group reference
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 12h47   #10
BiM
Modératrice
 
Avatar de BiM
 
Femme
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
Inscription : janvier 2005
Messages : 7 299
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
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 299
Points : 8 650
Points : 8 650
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 ?
__________________
__~{@ BiM - Modératrice "Business Intelligence" @}~
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
___________.~{@ Lapine crétine @}~
BiM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h37   #11
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
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...)
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h52   #12
BiM
Modératrice
 
Avatar de BiM
 
Femme
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
Inscription : janvier 2005
Messages : 7 299
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
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 299
Points : 8 650
Points : 8 650
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...
__________________
__~{@ BiM - Modératrice "Business Intelligence" @}~
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
___________.~{@ Lapine crétine @}~
BiM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 14h02   #13
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
La requête XPATH se fait lors de la création / modification du dataset dans l'onglet "Row mapping"
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 14h27   #14
BiM
Modératrice
 
Avatar de BiM
 
Femme
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
Inscription : janvier 2005
Messages : 7 299
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
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 299
Points : 8 650
Points : 8 650
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.
__________________
__~{@ BiM - Modératrice "Business Intelligence" @}~
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
___________.~{@ Lapine crétine @}~
BiM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 14h34   #15
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
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 ?
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 14h44   #16
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
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 : /)
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 14h51   #17
BiM
Modératrice
 
Avatar de BiM
 
Femme
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
Inscription : janvier 2005
Messages : 7 299
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 26
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 299
Points : 8 650
Points : 8 650
Après, il peut ne pas être dans l'Expression Builder mais être disponible quand même. Ca se teste.
__________________
__~{@ BiM - Modératrice "Business Intelligence" @}~
Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
___________.~{@ Lapine crétine @}~
BiM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 14h53   #18
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
Je ne te suis pas...
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 11h08   #19
Membre à l'essai
 
Inscription : juin 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 88
Points : 21
Points : 21
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
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 :
/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 ?
SyLvErStOrM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h09.


 
 
 
 
Partenaires

Hébergement Web