PDA

View Full Version : مشکل در پر کردن گزارش با jasper report



esshahab
پنج شنبه 25 تیر 1388, 11:34 صبح
با سلام
من فایل jrxml زیر را ساختم و بعد کامپایل کردم بعدش بدون هیچ مشکلی با متد fill پرش کردم و آخر کار با jasperViewer نمایشش دادم.



<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN" "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport name="DbReport">
<queryString>
<![CDATA[select name, last, code from object]]>
</queryString>
<field name="name" class="java.lang.String" />
<field name="last" class="java.lang.String" />
<field name="code" class="java.lang.String" />
<pageHeader>
<band height="30">
<staticText>
<reportElement x="0" y="0" width="69" height="24" />
<textElement verticalAlignment="Bottom" />
<text>
<![CDATA[Name: ]]>
</text>
</staticText>
<staticText>
<reportElement x="140" y="0" width="79" height="24" />
<text>
<![CDATA[Last Name: ]]>
</text>
</staticText>
<staticText>
<reportElement x="280" y="0" width="69" height="24" />
<text>
<![CDATA[Code: ]]>
</text>
</staticText>
</band>
</pageHeader>
<detail>
<band height="30">
<textField>
<reportElement x="0" y="0" width="69" height="24" />
<textFieldExpression class="java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x="140" y="0" width="69" height="24" />
<textFieldExpression class="java.lang.String">
<![CDATA[$F{last}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x="280" y="0" width="69" height="24" />
<textFieldExpression class="java.lang.String">
<![CDATA[$F{code}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>



اما بعد خواستم که قالبی را که تو فایل jrxml بود با کد درش بیارم (آخه فایل jrxml حالت پویایی را که من می خواهم را نداره مانند اضافه کردن نام ستون). به صورت زیر.

esshahab
پنج شنبه 25 تیر 1388, 11:35 صبح
public class test {
public static void main(String[] args) {
Connection connection;

try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

connection = DriverManager
.getConnection("jdbc:odbc:db");

JasperDesign jasperDesign = new JasperDesign();

jasperDesign.setName("DbReport");

//query
JRDesignQuery query = new JRDesignQuery();
query.setText("select name, last, code from object");
JRDesignField field = new JRDesignField();
field.setName("name");
field.setValueClassName("java.lang.String");
jasperDesign.addField(field);
field.setName("last");
field.setValueClassName("java.lang.String");
jasperDesign.addField(field);
field.setName("code");
field.setValueClassName("java.lang.String");
jasperDesign.addField(field);
jasperDesign.setQuery(query);

//Page Header
JRDesignBand headerBand = new JRDesignBand();
headerBand.setHeight(30);
JRDesignStaticText staticText = new JRDesignStaticText();
staticText.setX(0);
staticText.setY(0);
staticText.setWidth(69);
staticText.setHeight(24);
staticText.setText("Name");
headerBand.addElement(staticText);
staticText = new JRDesignStaticText();
staticText.setX(140);
staticText.setY(0);
staticText.setWidth(69);
staticText.setHeight(24);
staticText.setText("Last Name");
headerBand.addElement(staticText);
staticText = new JRDesignStaticText();
staticText.setX(280);
staticText.setY(0);
staticText.setWidth(69);
staticText.setHeight(24);
staticText.setText("Code");
headerBand.addElement(staticText);
jasperDesign.setPageHeader(headerBand);

//detail
JRDesignBand detailBand = new JRDesignBand();
detailBand.setHeight(100);
JRDesignTextField textField = new JRDesignTextField();
JRDesignExpression expression = new JRDesignExpression();
textField.setX(0);
textField.setY(0);
textField.setWidth(69);
textField.setHeight(24);
expression.setValueClassName("java.lang.String");
expression.setText("$F{name}");
detailBand.addElement(textField);
textField.setX(140);
textField.setY(0);
textField.setWidth(69);
textField.setHeight(24);
expression.setValueClassName("java.lang.String");
expression.setText("$F{last}");
detailBand.addElement(textField);
textField.setX(280);
textField.setY(0);
textField.setWidth(69);
textField.setHeight(24);
expression.setValueClassName("java.lang.String");
expression.setText("$F{code}");
detailBand.addElement(textField);
jasperDesign.setDetail(detailBand);

//compile Report
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

//fill Report
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), connection);

//show Report
JasperViewer.viewReport(jasperPrint);
} catch (SQLException ex) {
Logger.getLogger(test.class.getName()).log(Level.S EVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(test.class.getName()).log(Level.S EVERE, null, ex);
} catch (JRException ex) {
Logger.getLogger(test.class.getName()).log(Level.S EVERE, null, ex);
}
}
}


اما بعد از اجرای برنامه هنگام پر کردن گزارش خطای زیر را میده.



Jul 16, 2009 10:40:46 AM bookExample.three.test main
SEVERE: null
net.sf.jasperreports.engine.JRException: Unable to get value for field 'code' of class 'java.lang.String'
at net.sf.jasperreports.engine.JRResultSetDataSource. getFieldValue(JRResultSetDataSource.java:317)
at net.sf.jasperreports.engine.fill.JRFillDataset.set OldValues(JRFillDataset.java:802)
at net.sf.jasperreports.engine.fill.JRFillDataset.nex t(JRFillDataset.java:766)
at net.sf.jasperreports.engine.fill.JRBaseFiller.next (JRBaseFiller.java:1402)
at net.sf.jasperreports.engine.fill.JRVerticalFiller. fillReport(JRVerticalFiller.java:111)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill (JRBaseFiller.java:888)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill (JRBaseFiller.java:791)
at net.sf.jasperreports.engine.fill.JRFiller.fillRepo rt(JRFiller.java:63)
at net.sf.jasperreports.engine.JasperFillManager.fill Report(JasperFillManager.java:402)
at bookExample.three.test.main(test.java:119)
Caused by: java.sql.SQLException: No data found
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java :7138)
at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.j ava:3907)
at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Jdbc OdbcResultSet.java:5698)
at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbc ResultSet.java:354)
at net.sf.jasperreports.engine.JRResultSetDataSource. getFieldValue(JRResultSetDataSource.java:239)
... 9 more



که انگار تو خط

Unable to get value for field 'code' of class 'java.lang.String'
منظورش اینه که نمی تونه اطلاعات را به فیلد code بفرسته.
این خطا فقط مربوط به فیلد code نیست اگر بیام و خطوط مربوط به فیلد code را پاک کنم به فیلد last گیر میده.

خیلی ممنون می شم راهنمایی ام کنید.

با تشکر

esshahab
پنج شنبه 25 تیر 1388, 21:37 عصر
سلام مجدد
خودم تونستم مشکلم را حل کنم. یکم توی کدم دستکاری کردم درست شد. باز می زارمش.


public class test {
public static void main(String[] args) {
Connection connection;

try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

connection = DriverManager
.getConnection("jdbc:odbc:db");

JasperDesign jasperDesign = new JasperDesign();
jasperDesign.setName("DbReport");
//query
JRDesignQuery query = new JRDesignQuery();
query.setText("select name, last, code from object");
JRDesignField field;
field = new JRDesignField();
field.setName("name");
field.setValueClassName("java.lang.String");
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("last");
field.setValueClassName("java.lang.String");
jasperDesign.addField(field);
field = new JRDesignField();
field.setName("code");
field.setValueClassName("java.lang.String");
jasperDesign.addField(field);
jasperDesign.setQuery(query);

//Page Header
JRDesignBand headerBand = new JRDesignBand();
headerBand.setHeight(30);
JRDesignStaticText staticText = new JRDesignStaticText();
staticText.setX(0);
staticText.setY(0);
staticText.setWidth(69);
staticText.setHeight(24);
staticText.setText("Name");
headerBand.addElement(staticText);
staticText = new JRDesignStaticText();
staticText.setX(140);
staticText.setY(0);
staticText.setWidth(69);
staticText.setHeight(24);
staticText.setText("Last Name");
headerBand.addElement(staticText);
staticText = new JRDesignStaticText();
staticText.setX(280);
staticText.setY(0);
staticText.setWidth(69);
staticText.setHeight(24);
staticText.setText("Code");
headerBand.addElement(staticText);
jasperDesign.setPageHeader(headerBand);

//detail
JRDesignBand detailBand = new JRDesignBand();
detailBand.setHeight(100);
JRDesignTextField textField;
JRDesignExpression expression;
textField = new JRDesignTextField();
expression = new JRDesignExpression();
textField.setX(0);
textField.setY(0);
textField.setWidth(69);
textField.setHeight(24);
expression.setValueClassName("java.lang.String");
expression.setText("$F{name}");
textField.setExpression(expression);
detailBand.addElement(textField);
textField = new JRDesignTextField();
expression = new JRDesignExpression();
textField.setX(140);
textField.setY(0);
textField.setWidth(69);
textField.setHeight(24);
expression.setValueClassName("java.lang.String");
expression.setText("$F{last}");
textField.setExpression(expression);
detailBand.addElement(textField);
textField = new JRDesignTextField();
expression = new JRDesignExpression();
textField.setX(280);
textField.setY(0);
textField.setWidth(69);
textField.setHeight(24);
expression.setValueClassName("java.lang.String");
expression.setText("$F{code}");
textField.setExpression(expression);
detailBand.addElement(textField);
jasperDesign.setDetail(detailBand);
//compile Report
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

//fill Report
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap(), connection);

//show Report
JasperViewer.viewReport(jasperPrint);
} catch (SQLException ex) {
Logger.getLogger(test.class.getName()).log(Level.S EVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(test.class.getName()).log(Level.S EVERE, null, ex);
} catch (JRException ex) {
Logger.getLogger(test.class.getName()).log(Level.S EVERE, null, ex);
}
}
}


با تشکر

ykarajj
یک شنبه 21 آبان 1391, 14:38 عصر
با سلام
مشکل از font هست . موقع طراحی تو jasper از هر مونتی که استفاده می کنی اگر برنامهت تحت وب هست باید اون فونت هارو در bin وب سرور هم داشته باش.می تونی از پوشه windows/fonts کپی کنی