Bonjour à tous,

Depuis quelques temps, je fais des recherches pour trouver une manière de générer un ResultSet (Collection d'objets, plus précisemment des value objects) et l'envoyer à un rapport JasperReport dessiné avec l'outil opensource iReport.

Présentement, nous utilions des user defined functions dans DB2 afin de retourner les données vers l'engin de rapport JasperReport. Ceci est très lourd et nous rend dépendant envers DB2.

Nous aimerions réutiliser la même méthode que nous avons dans notre Facade Bean afin de pouvoir envoyer la Collection vers le rapport et ainsi éviter de toujours faire le travail en double.

Voici un exemple pour vous aider à mieux comprendre ce que je recherche :
Disons que nous avons un écran de liste de voitures dans une application Web J2EE. Cet écran liste des voitures, tout dépendant de la marque sélectionnée. Le résultat est affiché à l'écran dans un datagrid via une JSP ayant été alimentée au préalable par Struts et EJB (Modèle Vue Controleur). Chaque ligne du datagrid affiche le nom de la voiture, la marque, et quatre boutons de contrôle : ajouter, modifier, supprimer et consulter.

Donc, disons que j'ai un bouton dans le haut du datagrid qui permet d'imprimer toutes les voitures dans un rapport PDF ou XLS. Mon problème se situe ici. Présentement, nous avons une fontions définie par l'utilisateur dans DB2 qui s'occupe de faire le SELECT nécessaire pour retourner la liste de voitures. Par contre, il serait beaucoup plus logique de réutiliser la méthode que j'ai programmée pour mon écran de liste des voitures alors que le résultat attendu est exactement le même... C'est ce que je voulais dire par "travailler en double". Le fait d'utiliser une UDF est totalement inutile.

Je sais qu'il existe une façon de le faire, mais j'ai pas encore trouvé d'exemple concret pour orienter mon développement.

Voici le code que j'utilise présentement pour générer mes rapports à partir de Struts :
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
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
 
public ActionForward showCarsRpt(ActionMapping mapping,
			ActionForm form, HttpServletRequest request,
			HttpServletResponse response) throws ParseException, SQLException {
 
		ServletContext context = servlet.getServletConfig().getServletContext();
 
        CarRptFilterForm carRptFilterForm = (CarRptFilterForm) form;            
 
		reportFile = new File(context.getRealPath("/reports/car/cars.jasper"));
 
 
		if (!reportFile.exists()) {
			throw new JRRuntimeException("File car.jasper not found. The report design must be compiled first.");
		}
 
		Map parameters = new HashMap();
		parameters.put("ReportTitle", "Car Report");
		parameters.put("BaseDir", reportFile.getParent() + "\\");          
		parameters.put("REPORT_LOCALE", request.getSession().getAttribute("org.apache.struts.action.LOCALE"));
		parameters.put("strLang", getLocale(request).getLanguage());
		parameters.put("intBrandId", Integer.valueOf(carRptFilterForm.getStrCentreCoutId()));
 
		Connection con = null;
 
		try {
          InitialContext ctx = new InitialContext();
          DataSource ds = (DataSource) ctx.lookup("java:/myDataSource");
          con = ds.getConnection();
          con.setReadOnly(true);
		} catch (Exception e) {
			e.printStackTrace();
		}
 
      try {
          ReportTools.exportReportToPDF(reportFile, parameters, con, response);
      } catch (JRException e) {
          e.printStackTrace();
      } catch (SQLException e) {
          e.printStackTrace();
      } finally {
    	  con.close();
      }
 
      return null;	
	}
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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
public static void exportReportToPDF(File reportFile, Map parameters,
        Connection con, HttpServletResponse response)
        throws JRException, SQLException {
 
        File destFile = new File(JasperRunManager.runReportToPdfFile(reportFile.getPath(), parameters, con));
        con.close();
 
        response.setContentType("application/pdf");
 
        response.setHeader("Content-Disposition", "attachment; filename=\"" + destFile.getName() + "\";)");
 
        java.io.FileInputStream fileInputStream = null;
 
        try {
            fileInputStream = new java.io.FileInputStream(destFile.getPath());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
 
        try {
            ServletOutputStream outputStream;
 
            int i;
 
            outputStream = response.getOutputStream();
 
            while ((i = fileInputStream.read()) != -1) {
                outputStream.write(i);
            }
 
            outputStream.flush();
 
            fileInputStream.close();
            outputStream.close();
        } catch (IOException e) {
        }
    }
En vous remerciant à l'avance

Charles M.