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 :

Génerer un rapport page par page


Sujet :

BIRT

  1. #1
    Membre régulier
    Profil pro
    dev
    Inscrit en
    Novembre 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Novembre 2008
    Messages : 86
    Points : 72
    Points
    72
    Par défaut Génerer un rapport page par page
    Bonjour, j'aimerais génerer une rapport page par page. je genere au préalable le rptdocument bien sûr, mais ce que j'aimerais savoir, c'est si pour le rendu, je peux utiliser un RenderTask créer une fois, ou pour chaque page, je dois créer un RenderTask à partir du ReportEngine et le fermer à la fin et puis recommencer.
    Si je pose la question, c'est parceque, j'ai dans mon code utilisé un seul RenderTask, de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
         reportDocument = reportEngine.openReportDocument(documentPath);
      		HTMLRenderOption htmlOption = new HTMLRenderOption();
    			htmlOption.setOutputFormat(IRenderOption.OUTPUT_FORMAT_HTML);
    			htmlOption.setEmbeddable(false);
    			htmlOption.setImageDirectory(session.getImageFolder());
    			htmlOption.setSupportedImageFormats("PNG;GIF;JPG;BMP");
    			htmlOption.setHtmlPagination(true);
    			htmlOption.setMasterPageContent(true);
    			htmlOption.setImageHandler(new HTMLServerImageHandler());
    			htmlOption.setBaseImageURL(imageUrl);
          renderTask = reportEngine.createRenderTask(reportDocument);
    			for (int j = 1; j <= pageCount; j++) {
    				htmlOption.setOutputFileName(session.getReportPath(j));
    				renderTask.setPageNumber(j);
    				renderTask.setRenderOption(htmlOption);
    				renderTask.render();
    			}
        reportDocument.close();
        renderTask.close();
    mais parfois dans mes logs, j'obtiens de message d'erreur inattendus lors de l'exécution de l'instruction IRenderTask.render(). J'aimerais savoir cela peut être dû à l'utilisation d'un seul IRenderTask.
    J'ai modifié mon code de la manière suivante, mais je suis entrain de le tester.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    			HTMLRenderOption htmlOption = new HTMLRenderOption();
    			htmlOption.setOutputFormat(IRenderOption.OUTPUT_FORMAT_HTML);
    			htmlOption.setEmbeddable(false);
    			htmlOption.setImageDirectory(session.getImageFolder());
    			htmlOption.setSupportedImageFormats("PNG;GIF;JPG;BMP");
    			htmlOption.setHtmlPagination(true);
    			htmlOption.setMasterPageContent(true);
    			htmlOption.setImageHandler(new HTMLServerImageHandler());
    			htmlOption.setBaseImageURL(imageUrl);
    			// renderTask.setLocale(ServerTools.getLocale(locale));
    			for (int j = 1; j <= pageCount; j++) {
    				reportDocument = reportEngine.openReportDocument(documentPath);
    				renderTask = reportEngine.createRenderTask(reportDocument);
    				htmlOption.setOutputFileName(session.getReportPath(j));
    				renderTask.setPageNumber(j);
    				renderTask.setRenderOption(htmlOption);
    				renderTask.render();
    				reportDocument.close();
    				renderTask.close();
    			}
    J'aimerais avoir des observations sur ces deux méthodes.

    Merçi.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 143
    Points : 1 353
    Points
    1 353
    Par défaut besoin
    Vous voulez générer les pages comment?

    1 rptdocument pour chaque page? 1 pdf pour chaque page?

  3. #3
    Membre régulier
    Profil pro
    dev
    Inscrit en
    Novembre 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Novembre 2008
    Messages : 86
    Points : 72
    Points
    72
    Par défaut
    je génere un seul rptdocument, mais pour le rendu, je voudrais le faire page par page, c'est un rendu en html et non en pdf

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2008
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 1 143
    Points : 1 353
    Points
    1 353
    Par défaut ?
    Le Viewer Web de BIRT fait ça nativement.

    Vous voulez "paginer" dans une appli Java à la place d'une appli Web?

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2009
    Messages
    529
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2009
    Messages : 529
    Points : 836
    Points
    836
    Par défaut
    La deuxième méthode fonctionnera à coup sûr, et la première est en effet plus suspecte, perso je n'ai pas encore rencontré d'exemples où on enchaine plusieurs "render" avec le même IRenderTask. A la limite externaliser l'ouverture et la fermeture du document en dehors de la boucle devrait fonctionner, mais n'apportera pas de gain de performance significatif, les render seront tout de même très rapides avec la 2eme méthode puisque le rptdocument est dans tous les cas créé une fois pour toutes.

    Pour le reste je suis un peu surpris je rejoins l'avis de Stephan, si l'idée est d'obtenir un contenu déconnecté, un PDF serait la solution la plus simple et la plus performante. J'en déduis que tu souhaites générer les pages en une seule fois pour ne pas avoir à générer à nouveau le rptdocument si les utilisateurs naviguent d'une page à une autre dans ton appli? Si c'est le cas ça fonctionnera mais il y a peut être une meilleure solution, en reproduisant plus où moins ce que fait le web viewer: il faut garder le rptdocument courant un certain temps sur le disque, disons 20mn, avec un nom "thread safe" lié à l'identifiant de session, et générer les pages à la demande à partir de ce document.

  6. #6
    Membre régulier
    Profil pro
    dev
    Inscrit en
    Novembre 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Novembre 2008
    Messages : 86
    Points : 72
    Points
    72
    Par défaut
    Merçi de vos indications et vos conseils, mais si je génère tous les fichiers html d'un seul coup, c'est parceque c'est nécessaire pour l'application, car je ne veux pas réaliser un viewer, mais afficher le rapport en forme de diaporama dans mon application web. A intervalle régilier de temps, je dis donc re-générer les rapports pour las afficher de nouveau en diaporama.

    Le soucis que j'avais donc est que j'obtenais des erreurs inattendus lorsque de l'exécution du render avec la première méthode. j'ai même posté une erreur obtenue sur ce même forum.

    J'ai donc modifié mon approche pour adopté celle que je présente dans mon second exemple. J'ai lancé des tests sur le serveur et je verrais les résultats en début de semaine.

    Merçi encore pour votre aide.

  7. #7
    Membre régulier
    Profil pro
    dev
    Inscrit en
    Novembre 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Novembre 2008
    Messages : 86
    Points : 72
    Points
    72
    Par défaut
    J'ai résolu mon problème,

    En fait mon application faisait que deux IrenderTask pouvait utiliser le même fichier rptdocument pour générer des rapports sous le format HTML dans un même répertoire et tout cela simultanément. Ainsi donc, une exception était levée et malgré le fait que je fasse des "close" sur les IRenderTask et les rptdocuments, la mémoire n'était pas vidée. Si quelqu'un pouvait d'ailleurs me l'expliquer, j'ai hâte de l'écouter.

    Merçi à tous de votre aide.

  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
    Bonjour,

    Ce ne serait pas tes appels qui se chevauchent ? N'hésitent pas à faire des blocs synchronized pour éviter ce genre de problèmes.

  9. #9
    Membre régulier
    Profil pro
    dev
    Inscrit en
    Novembre 2008
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Novembre 2008
    Messages : 86
    Points : 72
    Points
    72
    Par défaut
    Bonjour BiM,
    En fait je travaille sur une application web. Des appels de service qui sont exécuté simultanément peuvent donc utiliser un même modèle de rapport et même génerer des rptdocument ou des rapports au format html dans des répertoires identiques. Et c'est donc cette collision qui je crois génère des exceptions. Je ne connais pas exactement la raison, mais je conjecture que il doit y avoir une perturbation qui se crée dans les flux utilisé dans le code interne de BIRT et qui mène donc aux Exceptions que je connais. Si tu as de pus précises explications, j'aimerais bien les avoir.

    Merçi.

  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
    Ce problème est connu, certaines librairies dont BIRT dépend ne supportent pas les accès multiples, d'où des exceptions. On suggère dans ce cas de gérer une file d'attente et d'utiliser le mot clef synchronized sur les méthodes d'appel à BIRT. D'autre part, si tu veux vraiment faire plusieurs traitements simultanés, il va falloir dupliquer plusieurs fois BIRT et que tes services gèrent chacun l'accès à l'une des instances de BIRT.

    L'autre soucis, si tu n'as qu'un seul service non synchronisé pour faire l'opération c'est qu'une première génération crée le rptdocument correspondant à X.rptdesign et qu'une deuxième génération fasse de même et écrase le rptdocument précédent. D'où l'important de bien synchronisé quand c'est nécessaire. Tu peux aussi donner un nom aléatoire à chaque rptdocument, ce qui peut t'éviter des écrasements.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL] Script d'affichage page par page
    Par x2thez dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/05/2006, 15h48
  2. [MySQL] Affichage page par page et requêtes du type $sql .=
    Par carelha dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 06/04/2006, 17h12
  3. [Tableaux] PB liens apres affichage page par page
    Par x2thez dans le forum Langage
    Réponses: 16
    Dernier message: 15/03/2006, 16h58
  4. [MySQL] afficher plusieurs enregistrements par page par page à la volée
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/03/2006, 12h22
  5. [struts] afficher page par page une liste d'élément
    Par BurningPat dans le forum Struts 1
    Réponses: 6
    Dernier message: 27/09/2005, 11h09

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