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 30/11/2006, 16h32   #1
Membre confirmé
 
Avatar de iubito
 
Homme
Développeur informatique
Inscription : janvier 2003
Messages : 376
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 376
Points : 244
Points : 244
Par défaut ça rame, et je galère (temps chargement Platform, data source classe)

Salut, je découvre BIRT, mais je trouve l'aide et les quelques tutoriaux trouvés sur internet pas assez poussés

Première chose, grâce à l'exemple de servlet j'ai réussi à afficher un état de test fourni sur le site de BIRT : SalesInvoice.rptdesign

Je sais que je n'a pas une machine hyper puissante (P4 1,6 GHz, 768 Mo de RAM) mais quand même...
  • Platform.startup et la création de l'objet IReportEngine, ça prend 20 secondes !
  • La première génération après chaque redémarrage de la platform (arrêt/démarre avec mon tomcat) de l'état met 1 minute !
Au deuxième lancement de l'état et suivants, ça met 3 à 4 secondes.
Le format HTML ou PDF, c'est kif kif

Ces temps me paraissent extrêmement longs, surtout que mon chef veut que les pages s'affichent en 1 seconde

J'ai déjà utilisé JasperReports et j'ai des temps de réponse très rapide (les états qui rament, c'est que mes données sont longues à calculer).

Constatez-vous le même genre de lenteurs avec BIRT ?

Autre chose, je veux utiliser des classes Java déjà faite (y'aurait plus qu'à les adapter à l'interface de BIRT, mais laquelle ?), et je vois dans les tutos qu'il faut une DataSource de type script, et qu'on peut utiliser une classe Java au lieu du javascript, mais je n'ai pas trouvé de tutos expliquant comment et avec des exemples !
Tout retour d'expérience à ce sujet me serait d'un grand intérêt, parce que là, franchement, je galère.
__________________
Compatibilité CSS | Hacks CSS IE | IE7

Lé SMS cé kom lé ognon, sa pike lé yeu
iubito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2006, 16h51   #2
Membre Expert
 
Avatar de moritan
 
Homme
Développeur Java
Inscription : juin 2005
Messages : 657
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 32
Localisation : France, Manche (Basse Normandie)

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : juin 2005
Messages : 657
Points : 1 050
Points : 1 050
Citation:
Envoyé par iubito
Salut, je découvre BIRT, mais je trouve l'aide et les quelques tutoriaux trouvés sur internet pas assez poussés

Première chose, grâce à l'exemple de servlet j'ai réussi à afficher un état de test fourni sur le site de BIRT : SalesInvoice.rptdesign

Je sais que je n'a pas une machine hyper puissante (P4 1,6 GHz, 768 Mo de RAM) mais quand même...
  • Platform.startup et la création de l'objet IReportEngine, ça prend 20 secondes !
  • La première génération après chaque redémarrage de la platform (arrêt/démarre avec mon tomcat) de l'état met 1 minute !
Au deuxième lancement de l'état et suivants, ça met 3 à 4 secondes.
Le format HTML ou PDF, c'est kif kif

Ces temps me paraissent extrêmement longs, surtout que mon chef veut que les pages s'affichent en 1 seconde

J'ai déjà utilisé JasperReports et j'ai des temps de réponse très rapide (les états qui rament, c'est que mes données sont longues à calculer).

Constatez-vous le même genre de lenteurs avec BIRT ?

Autre chose, je veux utiliser des classes Java déjà faite (y'aurait plus qu'à les adapter à l'interface de BIRT, mais laquelle ?), et je vois dans les tutos qu'il faut une DataSource de type script, et qu'on peut utiliser une classe Java au lieu du javascript, mais je n'ai pas trouvé de tutos expliquant comment et avec des exemples !
Tout retour d'expérience à ce sujet me serait d'un grand intérêt, parce que là, franchement, je galère.
Le moteur de Birt nécessite d'être initialisé c'est pour ça que le premier rapport est long.

Pour la datasource c'est possible mais j'ai pas d'exemple concret à te donner, désolé.
moritan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2006, 17h38   #3
Membre confirmé
 
Avatar de iubito
 
Homme
Développeur informatique
Inscription : janvier 2003
Messages : 376
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 376
Points : 244
Points : 244
Ce qui m'inquiète le plus, c'est que ça met 1 minute pour la première génération de l'état après démarrage du serveur. Alors est-ce l'état SalesInvoice de démo qui est lent, ou est-ce le fonctionnement de BIRT, mais si les premiers utilisateurs qui visualisent les états doivent attendre 1 minute... ça ne fait pas très sérieux (surtout si c'est un client sur un extranet )
__________________
Compatibilité CSS | Hacks CSS IE | IE7

Lé SMS cé kom lé ognon, sa pike lé yeu
iubito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2006, 17h13   #4
Membre du Club
 
Inscription : avril 2004
Messages : 116
Détails du profil
Informations personnelles :
Âge : 30

Informations forums :
Inscription : avril 2004
Messages : 116
Points : 60
Points : 60
Envoyer un message via AIM à mediateur59 Envoyer un message via MSN à mediateur59 Envoyer un message via Yahoo à mediateur59
Je pense que tu peux mettre un thread au demarrage du tomcat qui va initialiser l'engine de BIRT et tu pourra à tout moment l'appelé dans tes servlets...
Sinon peux tu detaillais ton idées de réutiliser du code existant que veux tu faire ?
je debute aussi dans Birt donc vas y
mediateur59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2007, 14h43   #5
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
Salut !

Personnellement j'ai résolu le problème principal de lenteur qui est en effet dû au démarrage du serveur. Il faudrait que tu crées un singleton qui isole le moteur (engine) :
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
import java.util.ArrayList;
import java.util.Locale;
 
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineException;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.RenderOptionBase;
import org.eclipse.birt.report.engine.api.ReportEngine;
 
public class EditionPDF {
 
	private static EditionPDF m_Instance = null;
	private ReportEngine engine;
	private String realPath;
	private RenderOptionBase option;
	private String etat;
	private String chemin;
	private ArrayList parametres;
 
	private EditionPDF()
	{
		EngineConfig config = new EngineConfig();
		realPath = "C:/Jakarta/webapps/TestBIRT/";
		config.setResourcePath(realPath+"/WEB-INF/classes/ressources/");
		config.setEngineHome(realPath+"/WEB-INF/ReportEngine");	//endroit où se trouvent les librairies du Runtime
		engine = new ReportEngine(config);		//engine permet de connaitre et de modifie le fichier .rptdesign
		option = new RenderOptionBase();
		option.setOutputFormat(RenderOptionBase.OUTPUT_FORMAT_PDF);	//Format du fichier de sortie
	}
 
	public static EditionPDF getInstance()
	{
		if (m_Instance == null)
			m_Instance = new EditionPDF();
		return m_Instance;
	}
 
	public void init(String etat, String chemin, ArrayList parametres)
	{
		this.etat = etat;
		this.chemin = chemin;
		this.parametres = parametres;
	}
 
	public void run()
	{
		try
		{
			IReportRunnable design = engine.openReportDesign(realPath+"/WEB-INF/etats/"+etat+".rptdesign");
			IRunAndRenderTask task = engine.createRunAndRenderTask(design);		//Crée une tâche afin d'éxécuter le rapport
			task.setParameterValue("chemin",realPath);
			for (int i=0;i<parametres.size();i++)
			{
				ParametreEditionPDF param = (ParametreEditionPDF)parametres.get(i);
				task.setParameterValue(param.getCle(),param.getValeur());
			}
			task.setParameterValue("realPath", realPath);
			/* Création PDF */
			option.setOutputFileName(chemin);	//Nom du fichier de sortie
			task.setRenderOption(option);		//Chargement du fichier
			/* Fin création PDF */
			task.run();							//Création du fichier
		}
		catch (EngineException e)
		{
			System.out.println(e.getMessage());
		}
	}
 
	public void destructeur()
	{
		engine.destroy();
	}
}
Sachant que ParametreEdition ressemble à un Bean :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ParametreEditionPDF {
	private String cle;
	private Object valeur;
 
	public ParametreEditionPDF(String cle, Object valeur)
	{
		this.cle = cle;
		this.valeur = valeur;
	}
 
	public String getCle() {
		return cle;
	}
 
	public Object getValeur() {
		return valeur;
	}
}
La première classe te permets de créer le moteur que tu réutiliseras et de l'initialiser ainsi que de le lancer. La deuxième classe te permet de passer des paramètres à ton rptDesign de façon propre.

Je te donne un exemple d'utilisation :
Code :
1
2
3
4
5
6
List parametres = new ArrayList();
parametres.add(new ParametreEditionPDF("personnes",lesPersonnes);
parametres.add(new ParametreEditionPDF("structures",lesStructures);
EditionPDF edition = EditionPDF.getInstance();
edition.init("MonRapport", "MonRapport.pdf", (ArrayList)parametres);
edition.run();
Ce code crée la liste des paramètres à passer au rptdesign puis récupère l'instance en cours de l'engine. Si l'instance n'est pas lancée, il le fait (donc premier lancement plus long). Ensuite, il initialise les options principales :
- Nom du rptdesign
- Nom du fichier de sortie
- Liste des paramètres
Enfin, l'édition est lancée.
__________________
__~{@ 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 03/01/2007, 12h08   #6
Membre du Club
 
Développeur Java
Inscription : juillet 2004
Messages : 204
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : juillet 2004
Messages : 204
Points : 69
Points : 69
Oui j'ai aussi fait un singleton pour l'engine
tiboudchou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2007, 11h08   #7
Membre confirmé
 
Avatar de iubito
 
Homme
Développeur informatique
Inscription : janvier 2003
Messages : 376
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 376
Points : 244
Points : 244
Pour le singleton, je l'ai fait un peu de cette manière, mais dans une servlet.

moritan, (et les autres aussi), avez-vous vu un exemple de DataSource en java ?

je donne un exemple fictif.
une classe CompteBancaire qui contient plusieurs fonctions qui retournent des "lignes" d'opérations réalisées sur le compte. (collection de LigneOperation)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class CompteBancaire {
 
  public CompteBancaire(String numCompte) {
    this.numCompte = numCompte;
  }
 
  /**
   * Retourne les opérations effectuées entre debut et fin
   * @return Collection de LigneOperation
   */
  public Collection getOperations(Date debut, Date fin) {
    Collection ret = getToutesLesOperations();
    Iterator it = ret.iterator();
    while (it.hasNext()) {
      LigneOperation lo = (LigneOperation) it.next();
      if (lo.getDate().before(debut) || lo.getDate().after(fin))
        it.remove();
    }
    return ret;
  }
}
LigneOperation :
- getDate, getLibelle, getDebit, getCredit

et là avec JasperReport je faisais une classe datasource qui implémente JrDataSource avec un constructeur prenant en paramètre ma collection, une méthode next() qui passe à la ligne suivante, et getFieldValue qui retourne la valeur demandée pour un champ, du genre
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
 
/** DataSource sur des opérations d'un compte bancaire */
public class OperationsDataSource implements JrDataSource {
 
  private Iterator itOperations;
  private LigneOperation current; // Ligne en cours d'affichage
  public OperationsDataSource(Collection c) {
    this.itOperations = c.iterator();
  }
 
  //Ici la méthode appelée par JR pour savoir s'il existe encore une ligne à afficher
  public boolean next() {
    boolean ret = itOperations.hasNext();
    if (ret)
      current = (LigneOperation) itOperations.next();
    return ret;
  }
 
  //Ici la méthode appelée par JR pour demander une valeur d'une zone
  public Object getFieldValue(String nomDuChamp) {
    if( nomDuChamp.equals("date"))
      return current.getDate();
    else if (nomDuChamp.equals("libelle"))
      return current.getLibelle();
    //...débit...crédit
  }
}
Sur un écran je peux demander les dates souhaitées, et fournir le PDF en utilisant la datasource suivante :
Code :
1
2
3
4
5
 
DataSource ds = new OperationsDataSource(
  new CompteBancaire("0123456")
    .getOperations(1er janvier 2007, 10 janvier 2007)
);
Ici c'est un exemple très simple avec un filtrage tout bête sur des dates, mais mes cas réels sont un tantinet plus compliqués..., mes infos sont affichées ne sont pas forcément toutes tirées d'une base de données, elles peuvent être calculées de manière complexe.

Je cherche donc ZE solution pour créer une data source en java pur, ou un minimum de code javascript, mais auquel je passe des collections d'objets bean triés, filtrés...

Merci d'avance
__________________
Compatibilité CSS | Hacks CSS IE | IE7

Lé SMS cé kom lé ognon, sa pike lé yeu
iubito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2007, 11h15   #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
Comme tu l'as vu dans des sujets différents, on peut passer un DataSource en paramètre, donc le fait de créer un DataSource en Java, tu as l'air de les avoir déjà, il ne reste plus qu'à le passer.

Tu n'auras, en principe, pas à refaire tes objets.
__________________
__~{@ 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 29/01/2007, 11h30   #9
Membre confirmé
 
Avatar de iubito
 
Homme
Développeur informatique
Inscription : janvier 2003
Messages : 376
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 376
Points : 244
Points : 244
Merci, j'suis en train de lire tout le forum pour trouver l'exemple... Si tu en as un en tête, je crois que j'ai vu un sujet mais où ça ne marche pas.

/me retourne lire tout le forum...
__________________
Compatibilité CSS | Hacks CSS IE | IE7

Lé SMS cé kom lé ognon, sa pike lé yeu
iubito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2007, 11h36   #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
http://www.developpez.net/forums/sho...d.php?t=262247

Il n'y a pas d'exemples complets mais tu as des pistes au moins
__________________
__~{@ 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 29/01/2007, 11h51   #11
Membre confirmé
 
Avatar de iubito
 
Homme
Développeur informatique
Inscription : janvier 2003
Messages : 376
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 376
Points : 244
Points : 244
Je suis justement tombé sur ce topic, mais j'arrive pas à trouver la doc de task.setDataSource(...) et le seul exemple fait juste une modification de la requête SQL.
__________________
Compatibilité CSS | Hacks CSS IE | IE7

Lé SMS cé kom lé ognon, sa pike lé yeu
iubito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2007, 12h09   #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 iubito
Je suis justement tombé sur ce topic, mais j'arrive pas à trouver la doc de task.setDataSource(...) et le seul exemple fait juste une modification de la requête SQL.
C'est parce que la doc sur cette méthode n'existe pas.

Je pense que tu devrais poser la question sur le newsgroup (en anglais bien sûr) et si tu obtiens la réponse, de la poster ici
__________________
__~{@ 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 30/01/2007, 09h08   #13
Membre confirmé
 
Avatar de iubito
 
Homme
Développeur informatique
Inscription : janvier 2003
Messages : 376
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 376
Points : 244
Points : 244
D'après les sources, le setDataSource attend une archive, un report en quelque sorte

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void setDataSource( IDocArchiveReader dataSource )
{
	// try to open the dataSource as report document
	try
	{
		ReportDocumentReader document = new ReportDocumentReader( engine,
			dataSource );
		Map values = document.getParameterValues( );
		Map texts = document.getParameterDisplayTexts( );
		setParameterValues( values );
		setParameterDisplayTexts( texts );
		document.close( );
	}
	catch ( EngineException ex )
	{
		log.log( Level.WARNING,
			"failed to load the paremters in the data source", ex );
	}
 
	executionContext.setDataSource( dataSource );		
}
J'ai commencé à regarder la piste suggérée par le code ici, mais là je met ce projet en stand by, y'a plus urgent, j'y reviendrai plus tard
__________________
Compatibilité CSS | Hacks CSS IE | IE7

Lé SMS cé kom lé ognon, sa pike lé yeu
iubito 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 13h36.


 
 
 
 
Partenaires

Hébergement Web