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 22/05/2008, 17h52   #1
Invité régulier
 
Inscription : mai 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 24
Points : 7
Points : 7
Par défaut [BIRT] Création d'un group header de façon dynamique ?

Bonjour,

Voici mon problème :

J'ai réalisé un report sous BIRT qui m'affiche des données ordonnées par niveau.

exemple :

niveau 1 : pays
niveau 2 : ville
Lorsqu'on arrive au dernier niveau, on affiche la liste des destinataires associés à ce niveau.

Actuellement je peux afficher le dernier niveau et les destinataires :

Rennes :
dest 1
dest 2
...

Nantes :
dest 3
dest 4
...

...

Je peux afficher le premier niveau :
France
Rennes :
dest 1
dest 2
...

Nantes :
dest 3
dest 4
...

...

Mais il arrive parfois que le nombre de niveaux ne se limite pas à 2 mais à plus.
Et c'est là que mon problème se pose.

Je peux compter mon nombre de niveaux mais comment faire pour ajouter autant de lignes dans mon élément table qu'il y a de niveaux ?
Existe-t-il un moyen d'ajouter, par du code, des header group ?

Merci d'avance.

Suolan.
suolan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 17h33   #2
Invité régulier
 
Inscription : mai 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 24
Points : 7
Points : 7
Bonjour,

Vu qu'il n'y a pas de réponse de proposée, je suppose mon problème est impossible à résoudre.
Ou alors personne n'a compris mon problème...

Je laisse encore quelques jours avant de clôturer le sujet, on ne sait jamais

Bon week end.

Suolan.
suolan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2008, 17h42   #3
Membre Expert
 
Inscription : avril 2008
Messages : 1 053
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 1 053
Points : 1 156
Points : 1 156
Par défaut C'est possible

C'est possible de coder ceci , mais je ne suis pas assez technique pour vous fournir le code exact.

Dans le principe , vous pouvez même créer tout en tableau rien que par du code.

Mon astuce :

1) créer un objet caché qui vous compte les valeurs de chaque groupe ( ou un champs calculé dans votre SQL )

2) coder sur le tableau ( sur le onRender du tableau je pense ) qqch du style si champs dans xyz , alors newGroupHeader etc.
Stefan C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2008, 11h31   #4
Invité régulier
 
Inscription : mai 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 24
Points : 7
Points : 7
Bonjour,

Merci pour la réponse.
Je sais maintenant que c'est possible.

Dans un livre sur BIRT, j'ai vu qu'on pouvait ajouter des group dans le onPrepare de la Table.

Le code est le suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
if (params["codeClassification"] != null){
    importPackage( Packages.org.eclipse.birt.report.engine.api.script.element);
 
    var groupCondition = StructureScriptAPIFactory.createGroup();
 
    groupCondition.setKeyExpr("row[\"A\"]");
 
    groupCondition.setSortDirection("asc");
    groupCondition.setSortType("asc");
 
    this.addGroup(sortCondition);
}
1) le import est OK, il est reconnu par BIRT
2) var groupCondition = StructureScriptAPIFactory.createGroup(); => la fonction createGroup() pour la classe StructureScriptAPIFactory est inconnue. J'ai vérifé dans l'API.
3) this.addGroup(sortCondition); => d'où sort le 'sortCondition' ?

J'en arrive à la conclusion que c'est faisable mais que même les livres sur le sujet ne savent pas comment faire (les auteurs ne savent pas coder ou je ne sais pas lire).

Même ici, le sujet n'est pas fréquent voire inexistant.

Le seul moyen est de créer le report entièrement par du code mais à partir de JAVA et non de BIRT. Ce que je ne veux pas faire.

La manipulation de l'API BIRT n'est pas simple.
Si jamais quelqu'un s'y aventure, je suis toujours intéressée car j'aimerais trouver une solution à mon problème.

Merci d'avance.

Suolan.
suolan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2008, 16h06   #5
Membre Expert
 
Inscription : avril 2008
Messages : 1 053
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 1 053
Points : 1 156
Points : 1 156
Par défaut Question passée

J'ai passée cette question à un développeur Actuate BIRT.

Par ailleurs , si vous etes sur Paris , je peux vous emprunter le bouquin de formation API BIRT officiel ( celui d'Actuate... )

Stefan C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2008, 16h11   #6
Invité régulier
 
Inscription : mai 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 24
Points : 7
Points : 7
Merci pour votre aide (ça fait bizarre d'être vouvoyée quand même).

Et non, je ne suis pas sur Paris
suolan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/06/2008, 18h06   #7
Invité régulier
 
Inscription : mai 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 24
Points : 7
Points : 7
Bonjour,

J'ai abandonné l'idée d'ajouter un header group par du code.

Mais j'ai une autre idée et par conséquent une autre question

Est-il possible d'ajouter dynamiquement un champ Dynamic Text ?

J'arrive maintenant à afficher ma hiérarchie.
Pour le faire, j'ai créé 8 dynamic text (car je connais maintenant le nombre maximal de niveau dans une hiérarchie) contenant le libellé de mes niveaux. (config["lib1"] par exemple).

Ce qui me donne de manière très moche pour une hiérarchie à 2 niveaux :
France







Rennes

En blanc dans le report...

Alors voilà, comment faire pour ne plus avoir ces blancs ?
Je pense donc qu'il serait bien de créer des dynamic text que lorsqu'on en a besoin, mais comment faire ?

Et si c'est possible comment ajouter ensuite la valeur que je souhaite afficher dans ces Dynamic Text créés ?

Ou alors à l'inverse comment supprimer les dynamic text qui sont en trop et qui ont une valeur = "" (ou null si c'est plus pratique).

J'espère avoir été claire et surtout qu'une réponse existe

Merci d'avance et bonne soirée.

Suolan.
suolan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 11h25   #8
Invité régulier
 
Inscription : mai 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 24
Points : 7
Points : 7
Bonjour,

J'ai trouvé comment faire
J'ai spécifié les tailles des colonnes de mon tableau en pourcentage et je n'ai plus de blanc qui s'affiche... Simple en fait !

Mon rapport fonctionne très bien. Ma hiérarchie est nickel mais j'ai une super exception :

Caused by: org.eclipse.birt.data.engine.core.DataException: A BIRT exception occurred: Error evaluating Javascript expression. Script engine error: TypeError: La valeur par défaut de l'objet est introuvable (DataSet[Niveaux].__bm_onFetch#2)
Script source: DataSet[Niveaux].__bm_onFetch, line: 1, text:
__bm_onFetch(). See next exception for more information.


Je pense savoir d'où vient le problème mais je ne sais pas comment le résoudre.

Pour faire ma hiérarchie j'ai créé deux dataSet : DataTable et Niveaux
Ces dataSet sont utilisés dans des Tables : table1 et table2

table2 est "imbriquée" dans table1.

J'ai besoin de certaines informations de la table1 dans le on Fetch de la table2.
J'ai donc créé dans les propriétés Binding de table2 des colonnes pointant sur celles de table1.

Ce qui me donne pour le binding de table2 :
nom de colonne : ID_MER_NIV
expression : row._outer["ID_MER"]

Dans le on Fetch de table2, je fais appel à la colonne ID_MER_NIV de la manière suivante :

Code :
 if (dataSetRow["ID_C1"] == row["ID_MER_NIV"])
Et je pense que c'est cette ligne-là qui me génère l'exception.
Les autres n'étant que du genre :

Code :
 config["lib1"] = dataSetRow["L_C1"];
Ce que je trouve bizarre c'est que mon report fonctionne comme il faut.

Savez-vous pourquoi j'ai cette erreur ?
Comment faut-il utiliser récupérer ma colonne ID_MER_NIV si ce que j'ai fait n'est pas correct ?

Merci d'avance.
Suolan.

PS : Je suis toujours sur le même report mais le problème ne correspond plus au titre du sujet. Merci de me dire s'il faut que je clos celui-ci et que j'en rouvre un autre
suolan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/06/2008, 11h47   #9
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,

Est-ce possible d'avoir le contenu COMPLET de ton OPEN et FETCH s'il te plaît ?
__________________
__~{@ 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 26/06/2008, 11h54   #10
Invité régulier
 
Inscription : mai 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 24
Points : 7
Points : 7
BiM,

Je n'ai rien dans le Open et dans le Fetch j'ai ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
if (dataSetRow["ID_C1"] == row["ID_MER_NIV"] && dataSetRow["ID_C1"] != null)
{
   config["lib1"] = dataSetRow["L_C1"];
   config["lib2"] = null; 
   config["lib3"] = null; 
   config["lib4"] = null;
   config["lib5"] = null;
   config["lib6"] = null;
   config["lib7"] = null;
   config["lib8"] = null;
}
if (dataSetRow["ID_C2"] == row["ID_MER_NIV"] && dataSetRow["ID_C2"] != null)
{
   config["lib1"] = dataSetRow["L_C1"];
   config["lib2"] = dataSetRow["L_C2"];
   config["lib3"] = null; 
   config["lib4"] = null;
   config["lib5"] = null;
   config["lib6"] = null;
   config["lib7"] = null;
   config["lib8"] = null;
}
if (dataSetRow["ID_C3"] == row["ID_MER_NIV"] && dataSetRow["ID_C3"] != null)
{
   config["lib1"] = dataSetRow["L_C1"];
   config["lib2"] = dataSetRow["L_C2"]; 
   config["lib3"] = dataSetRow["L_C3"]; 
   config["lib4"] = null;
   config["lib5"] = null;
   config["lib6"] = null;
   config["lib7"] = null;
   config["lib8"] = null;
}
if (dataSetRow["ID_C4"] == row["ID_MER_NIV"] && dataSetRow["ID_C4"] != null)
{
   config["lib1"] = dataSetRow["L_C1"];
   config["lib2"] = dataSetRow["L_C2"]; 
   config["lib3"] = dataSetRow["L_C3"]; 
   config["lib4"] = dataSetRow["L_C4"];
   config["lib5"] = null;
   config["lib6"] = null;
   config["lib7"] = null;
   config["lib8"] = null;
}
if (dataSetRow["ID_C5"] == row["ID_MER_NIV"] && dataSetRow["ID_C5"] != null)
{
   config["lib1"] = dataSetRow["L_C1"];
   config["lib2"] = dataSetRow["L_C2"]; 
   config["lib3"] = dataSetRow["L_C3"]; 
   config["lib4"] = dataSetRow["L_C4"];
   config["lib5"] = dataSetRow["L_C5"];
   config["lib6"] = null;
   config["lib7"] = null;
   config["lib8"] = null;
}
if (dataSetRow["ID_C6"] == row["ID_MER_NIV"] && dataSetRow["ID_C6"] != null)
{
   config["lib1"] = dataSetRow["L_C1"];
   config["lib2"] = dataSetRow["L_C2"]; 
   config["lib3"] = dataSetRow["L_C3"]; 
   config["lib4"] = dataSetRow["L_C4"];
   config["lib5"] = dataSetRow["L_C5"];
   config["lib6"] = dataSetRow["L_C6"];
   config["lib7"] = null;
   config["lib8"] = null;
}
if (dataSetRow["ID_C7"] == row["ID_MER_NIV"] && dataSetRow["ID_C7"] != null)
{
   config["lib1"] = dataSetRow["L_C1"];
   config["lib2"] = dataSetRow["L_C2"]; 
   config["lib3"] = dataSetRow["L_C3"]; 
   config["lib4"] = dataSetRow["L_C4"];
   config["lib5"] = dataSetRow["L_C5"];
   config["lib6"] = dataSetRow["L_C6"];
   config["lib7"] = dataSetRow["L_C7"];
   config["lib8"] = null;
}
if (dataSetRow["ID_C8"] == row["ID_MER_NIV"] && dataSetRow["ID_C8"] != null)
{
   config["lib1"] = dataSetRow["L_C1"];
   config["lib2"] = dataSetRow["L_C2"]; 
   config["lib3"] = dataSetRow["L_C3"]; 
   config["lib4"] = dataSetRow["L_C4"];
   config["lib5"] = dataSetRow["L_C5"];
   config["lib6"] = dataSetRow["L_C6"];
   config["lib7"] = dataSetRow["L_C7"];
   config["lib8"] = dataSetRow["L_C8"];
 
}
Bon je sais c'est barbare

Merci,
Suolan.
suolan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2008, 17h48   #11
Invité régulier
 
Inscription : mai 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 24
Points : 7
Points : 7
Bonjour,

J'ai fait quelques essais dans mon on Fetch.
J'ai enlevé les lignes que l'on peut voir dans le post ci-dessus.

J'ai mis ceci :

Code :
1
2
3
4
 
i = row._outer["ID_MER"];(row._outer["ID_MER"] = colonne de DataTable)
config["id"] = dataSetRow["ID_C1"];
config["id2"] = i;
i a été déclaré dans initialize, valeur par défaut = 0;
Je remarque dans le preview que la valeur row._outer["ID_MER"] est affichée et peut bien être utilisée dans mon on Fetch.
C'est pareil si j'utilise : row["ID_MER_NIV"] (colonne de Niveaux) qui est égale à row._outer["ID_MER"].

Si j'ajoute une condition :

Code :
1
2
3
4
5
6
7
8
 
i = row._outer["ID_MER"];
config["id"] = dataSetRow["ID_C1"];
config["id2"] = i;
if (i == 47)
{
    config["lib1"] = "coucou";
}
coucou s'affiche bien, config["id"] et config["id2"] aussi.
Mais j'obtiens toujours cette erreur-ci :

Caused by: org.eclipse.birt.data.engine.core.DataException: A BIRT exception occurred: Error evaluating Javascript expression. Script engine error: TypeError: La valeur par défaut de l'objet est introuvable (DataSet[Niveaux].__bm_onFetch#13) Script source: DataSet[Niveaux].__bm_onFetch, line: 1, text:__bm_onFetch(). See next exception for more information.Error evaluating Javascript expression. Script engine error: TypeError: La valeur par défaut de l'objet est introuvable (DataSet[Niveaux].__bm_onFetch#13) Script source: DataSet[Niveaux].__bm_onFetch, line: 1, text:__bm_onFetch() at org.eclipse.birt.data.engine.core.DataException.wrap(DataException.java:114) at org.eclipse.birt.data.engine.script.ScriptEvalUtil.evaluateJSAsExpr(ScriptEvalUtil.java:552) at org.eclipse.birt.data.engine.script.JSMethodRunner.runScript(JSMethodRunner.java:79) at org.eclipse.birt.report.engine.script.internal.DtEScriptExecutor.handleJS(DtEScriptExecutor.java:71) ... 97 more


Apparemment je ne peux pas faire de condition sur ce champ sans avoir d'erreur.
Si qui est bien dommage car il me faut ces conditions.

Y-a-t-il une astuce, un truc qu'il faudrait faire ?

Merci d'avance.

Suolan.
suolan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 11h34   #12
Invité régulier
 
Inscription : mai 2005
Messages : 24
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 24
Points : 7
Points : 7
Bonjour,

Finalement j'ai réussi à faire ce que je voulais sans passer par mes config.

J'ai réuni mes deux requêtes en une seule (avec des difficultés), ce qui fait que j'avais toutes les données qu'il me fallait dans une seule table.

J'ai ensuite fait 9 groupes basés sur les 9 ID de mes niveaux.

Ces groupes sont cachés si l'ID associé est null.

Et c'est tout.
J'ai galéré pour rien en fait, tout n'était que question de requête.

Merci pour votre aide.

Suolan.

PS : est-ce que je mets le sujet à "résolu" même si la solution n'a plus de rapport avec ce que j'ai demandé à l'origine (création dynamique des header group) ?
suolan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 11h56   #13
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
Ca reste une création dynamique de header. Enfin, c'est comme ça que je les fait également.

Donc, oui, tu peux mettre ton sujet à
__________________
__~{@ 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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h27.


 
 
 
 
Partenaires

Hébergement Web