Probleme mit JasperReports

LosPaFFos

Grünschnabel
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

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
 
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
Code:
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?
 
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...
 
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.
 
Zuletzt bearbeitet:
Allso z.B. so:

PHP:
<?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
 
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.

Code:
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
 
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 :mad:
 
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! :eek:

:-) Also lange Rede, kurzer Sinn. Vielen Dank für deine Hilfe
 
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
 
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 ;)
 
Zurück