# Probleme mit JasperReports



## LosPaFFos (10. Januar 2007)

hi folks,

Ich habe ein Problem meinen Report mit Daten aus einer DB zu füllen. Selbst wenn ich einen Report mit iReport erstelle ( dann natürlich den queryString raus)  geht es nicht. Genau der selbe Report lässt sich aber mit der selben Datenverbindung in iReport korrekt erstellen. Wenn ich es selbst in der java-app mache behauptet er der Bericht hätte keine Seiten ( ob nun bei Betrachtung von JasperViewer oder dann als PDF ) . Was mache ich nur falsch?

Hier der Code


```
...
String query = "select id from _USER;";
 // Verbindung zur Datenbank herstellen    
          Class.forName("com.mysql.jdbc.Driver").newInstance(); // Load
          //Class.forName("com.mysql.jdbc.Driver");

          connection = DriverManager
              .getConnection("jdbc:mysql://xxxx:xxx/projectbase_java","xxx","xxxx");

          s = connection.createStatement();
          rs = s.executeQuery(query);
              JasperCompileManager.compileReportToFile("reports/classic.jrxml");
              System.out.println("Done!");
                           JRResultSetDataSource rsds = new JRResultSetDataSource(rs);                     
              JasperFillManager.fillReportToFile("reports/classic.jasper",
              new HashMap(), rsds);
```



Das Problem scheint irgendwie rsds zu sein. Rs beinhaltet das richtige ( kann ich mir ja auf der Konsole ausgeben lassen) . 

Greetz and thanks for help


----------



## TheLightning (10. Januar 2007)

Einen konkreten Fehler kann ich direkt nicht erkennen. Die vorgehensweise mit dem zwischenspeichern eines Jasperfiles finde ich allerdings ein wenig unsinnig. Entweder du kompilierst VORHER und lädtst die Japserfile direkt (kannst du über iReport vorher kompilieren), oder aber du verwendest 
	
	
	



```
JasperReport report =JasperCompileManager.compileReport("reports/classic.jrxml");  
System.out.println("Done!");
JRResultSetDataSource rsds = new JRResultSetDataSource(rs);                     
JasperFillManager.fillReportToFile(report,new HashMap(), rsds);
```

Zum Resultset..


> JRDataSource rsds = (JRDataSource)new JRResultSetDataSource(rs);


wäre in sofern etwas sauberer als das du später leichter auf andere Datenquellen umbasteln kannst... sollte aber kein riesen Problem darstellen.

Ob es an der Datenbestückung liegt könntest du auch testen in dem du mal das SQL-Statement in den Report einbettest und nur die Connection übergibst.

MfG 
Dominik

P.S. ich weiß... JasperReports ist alles andere als geschwätzig, aber hast du eine Fehlermeldung oder nur einen leeren Report bekommen?


----------



## LosPaFFos (10. Januar 2007)

Also wenn ich deinen Vorschlag einfüge, kommt eine Fehlermeldung:

Die Methode fillReportToFile(JasperReport, String, Map) im Typ JasperFillManager ist für die Argumente nicht anwendbar (JasperReport, HashMap, JRResultSetDataSource)
Bei dieser Zeile:
JasperFillManager.fillReportToFile(report,new HashMap(), rsds); 


Und nein es gibt keine Fehlermeldung sondern die Meldung das der Bericht keine Seiten hat wenn ich ihn mit JasperViewer öffne.

Und ja irgendwas scheint bei mir im argen zu sein, wenn ich die Query einbaue , also in die JRXML und es dann versuche ( natürlich mit  con anstatt rsds ) gib es folgenden Fehler beim Ausführen:

Exception in thread "main" java.lang.NoClassDefFoundError: com/mysql/jdbc/PreparedStatement$ParseInfo

Und das obwohl mysql.jar in Eclipse eingebunden wurde. Das lustige ist ja auch das ich mir die Ergebnisse meine Query auch selber schön in der Konsole ausgeben kann und ich somit eigentlich eine funktionierende Datenbankverbindung habe...oh mann das ist echt knifflig...


----------



## TheLightning (10. Januar 2007)

Caste bitte mal dein resultset nach JRDataSource.. wundert mich das er wenn er jetzt meckert vorher nicht darüber gemeckert hat dass er JRResultSetDataSource als Argument nicht kennt. 

Hier die entsprechende Methode aus der API:


> *static void 	fillReportToFile(JasperReport jasperReport, java.lang.String destFileName, java.util.Map parameters, JRDataSource dataSource)*
> Fills the compiled report design received as the first parameter and places the result in the file specified by the second parameter.



Gnarf.. gerade noch gesehen.. dann musst du natürlich noch den String für die Filedestination angeben... oder aber du lässt dir einen Printer zurückgeben und verwertest diesen.

Würde mich mal interessieren wie du dein Statement in die jrxml eingebastelt hast.


----------



## LosPaFFos (10. Januar 2007)

Allso z.B. so:


```
<?xml version="1.0" encoding="UTF-8"  ?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="Example2">

 <queryString><![CDATA[SELECT id FROM _USER]]></queryString>

 <field name="id" class="java.lang.String"/>

 <detail>
  <band height="50">
   <textField >
    <reportElement x="0" y="0" width="80" height="25" />      
    <textElement><font size="12"/></textElement>
    <textFieldExpression class="java.lang.String"><![CDATA[$F{id}]]></textFieldExpression>
   </textField>          
  </band>
 </detail>
 
</jasperReport>
```


Diese Datei lässt sich im iReport zusammenbauen, nur wie gesagt per JavaApp klappt es bei mir nicht ob nun eingebettet in die JRML oder ebend dynamisch so wie ich es oben versucht habe


----------



## TheLightning (10. Januar 2007)

Das is soweit ich das nachvollziehen kann auch korrekt.

Hier mal ein wenig verkürzt die Ausschnitte aus meinem ReportService für meine aktuelle J2EE Applikation(Struts). Ich speichere die Reports halt nicht lokal sondern erzeuge einen Outputstream. Ich musste mich vom JasperRunManager verabschieden um auch XLS exporte ermöglichen zu können.


```
Connection connection = dbconn.getConnection(); //wirst du wohl neu erzeugen
ServletOutputStream servletOutputStream = response.getOutputStream();
InputStream reportStream = getServlet().getServletConfig().getServletContext().getResourceAsStream("reports/compdur.jasper");

//Exporter je nach wunsch.. in diesem Fall pdf
JRExporter exporter = (JRExporter)new JRPdfExporter();
response.setContentType("application/pdf");
Map parameters = (Map)new HashMap() ; //letztendlich wird irgendeine map erwartet
JasperPrint jasperPrint = JasperFillManager.fillReport(reportStream, parameters, connection);
exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint);
exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,servletOutputStream);
exporter.exportReport();
    
servletOutputStream.flush();
servletOutputStream.close();
```

Evtl. hilft dir das ja weiter...

Gruß
Dominik


----------



## LosPaFFos (10. Januar 2007)

Danke für deine Hilfe ich werds gleich mal ausprobieren!

Mache erst seit zwei Tagen damit rum, und mein Quellcode ist eigentlich nur aus dem (einzigen) Buch über Jasperreports entstanden. Und eigentlich recht simple...ich verstehe nicht wieso es nicht geht


----------



## LosPaFFos (10. Januar 2007)

Also ich habe jetzt quasi deine Änderungsvorschläge beherzigt und anhand dessen alles neu gemacht. Mein selbst manipuliertes Beispiel geht zwar immer noch nicht aber dieses neu aufbauend auf deinen Anregungen GEHT!  

  Also lange Rede, kurzer Sinn. Vielen Dank für deine Hilfe


----------



## TheLightning (10. Januar 2007)

Kein Problem... ich häng zwar auch erst seit knapp nem Monat abzüglich Weihnachtszeit dran. Aber wenn ich die Zeit finde und die API noch ein wenig tiefer durchschaut habe kann ich ja mal ein Tutorial für die grundsätzlichen Funktionen schreiben.

Schön wenn ich dir helfen konnte 
Viel Spaß mit den Reports,
Dominik


----------



## LosPaFFos (11. Januar 2007)

Hi nochmal,

hab noch eine kleine Frage.

Und zwar wenn ich einen Bericht in RTF exportiere gibts Probleme mit dem deutschen Sonderzeichen ("ü", "ß" etc. ) Beim PDF-export ist das natürlich kein Problem.

Wie löse ich das ? ( Ich arbeite unter Suse 9 ).

mit 

exporter.setParameter(JRExporterParameter.CHARACTER_ENCODING," UTF-8");

Geht es leider nicht, welchen Zeichensatz muss ich den benutzen? iReport macht es natürlich wieder richtig


----------



## TheLightning (15. Januar 2007)

Startet deine jrxml auch hiermit? 

```
<?xml version="1.0" encoding="UTF-8"  ?>
```

Der RTF Support von JasperReports ist tatsächlich der schwächste soweit ich das nachlesen konnte. Grund ist das RTF nicht wirklich das fähigste Format ist und sowieso die Formatierungen zerschossen werden (Abstände etc.)

Gruß
Dominik


----------



## LosPaFFos (15. Januar 2007)

Ja sie fängt so an. Hmm ich konnte auch nicht rausfinden wie iReport das macht...so ein Mist.

Danke aber auf jeden Fall, wenn du noch ne Idee hast, sag bescheid 


Weisst du ansonsten ob man so dynamische Gliederungen ala 1.) einfügen kann, und ob Felder nicht nur in der Höhe sondern auch in der Breite "gestreckt" werden können, falls die Daten nicht reinpassen,

Gruss

PaFFy


----------



## LosPaFFos (17. Januar 2007)

weiß es ansonsten jemand anders?


----------



## LosPaFFos (23. Januar 2007)

*push* ...........


----------



## LosPaFFos (23. Januar 2007)

hmm weiß denn vielleicht einer wie man einen rahmen ( frame um bestimmte objekte zieht? ) in iReport ( Version 1.3.0 oder 1.2.8 geht es nicht :-(((


----------

