Ciao, ti rispondo a grandi linee perché ho avuto qualche difficoltà ad utilizzare iReports su Netbeans per cui in caso di utenti più fortunati, lascio il campo a spiegazioni specifiche e dettagliate.
Ammesso che tu abbia compilato il tuo modello di report e che quindi tu abbia a disposizione sia il file .jrxml che il .jasper, non ti resta che creare le classi per popolare il report.
Ti lascio traccia di quanto ho fatto io:
codice:
import java.util.*;
import java.io.*;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.*;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
/**
*
* @author Andrea
*/
public class report {
public static void main (String[] args) throws Exception {
Constants c = new Constants(new String[]{"E:/Documents/Netbeans Projects/IText/"});
//AccessDatabase ad = new AccessDatabase();
File reportModel = new File(Constants.jasperreports, "test_enav.jrxml");
InputStream is = new FileInputStream(reportModel);
Map parameters = new HashMap();
DataBeanMaker dbm = new DataBeanMaker();
//ArrayList<ReportBean> dataBeanList = dbm.getDataBeanList();
JRResultSetDataSource rsDataSource = new JRResultSetDataSource(dbm.getDefaultBeanList());
//JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataBeanList, false);
JasperDesign jasperDesign = JRXmlLoader.load(is);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
//JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, beanColDataSource);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, rsDataSource);
JasperExportManager.exportReportToPdfFile(jasperPrint, Constants.jasperreports+"/pdfReport.pdf");
}
}
codice:
import java.sql.*;
import java.util.*;
import database.*;
/**
*
* @author Andrea
*/
public class DataBeanMaker {
public ResultSet getDefaultBeanList() throws Exception {
AccessDatabase ad = new AccessDatabase();
Connection conn = ad.getConnection();
String query = "SELECT * FROM TEMP_NOTAMS";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(query);
return rs;
}
public ArrayList<ReportBean> getDataBeanList() throws Exception {
ArrayList<ReportBean> list = new ArrayList<ReportBean>();
AccessDatabase ad = new AccessDatabase();
Connection conn = ad.getConnection();
String query = "SELECT NotamLocator, NotamSeries, NotamClass, FieldA FROM TEMP_NOTAMS";
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(query);
while (rs.next()) {
String NotamLocator = rs.getString("NotamLocator");
int NotamClass = rs.getInt("NotamClass");
String NotamSeries = rs.getString("NotamSeries");
String FieldA = rs.getString("FieldA");
ReportBean bean = produce(NotamLocator, NotamSeries, FieldA, NotamClass);
System.out.println(bean);
list.add(bean);
}
return list;
}
private ReportBean produce(String NotamLocator, String NotamSeries, String FieldA, int NotamClass) {
ReportBean reportBean = new ReportBean();
reportBean.setNotamSeries(NotamSeries);
reportBean.setNotamLocator(NotamLocator);
reportBean.setFieldA(FieldA);
reportBean.setNotamClass(NotamClass);
return reportBean;
}
}
codice:
public class ReportBean {
private String notamLocator;
private String notamSeries;
private String fieldA;
private int notamClass;
public void setNotamLocator (String NotamLocator) {
this.notamLocator = NotamLocator;
}
public void setNotamSeries(String NotamSeries) {
this.notamSeries = NotamSeries;
}
public void setFieldA (String FieldA) {
this.fieldA = FieldA;
}
public void setNotamClass (int NotamClass) {
this.notamClass = NotamClass;
}
public String getNotamLocator() {
return this.notamLocator;
}
public String getNotamSeries() {
return this.notamSeries;
}
public String getFieldA() {
return this.fieldA;
}
public int getNotamClass() {
return this.notamClass;
}
public String toString() {
StringBuffer buf = new StringBuffer();
buf.append(getNotamLocator());
buf.append(", ");
buf.append(getNotamClass());
buf.append(", ");
buf.append(getNotamSeries());
buf.append(", ");
buf.append(getFieldA());
return buf.toString();
}
}
In altre parole, ho 3 classi:
un bean che mi modellizza il record
una classe che mi prepara la collezione di record (bean) da sparare nel report
una classe che mette insieme il report stesso.
Tralasciando le costanti specifiche del mio progetto, ho seguito più o meno la traccia fornita su internet (credo che nell'esempio che avevo trovato io partissero da un file XML, ma poco cambia, l'importante è fornire al report builder la collezione o le collezioni di record da inserire.
Mi fermo qui perché sono ancora piuttosto ignorante in materia di subreports e altre nozioni "avanzate".
PS: a livello visuale, ho trovato più facile da utilizzare il tool creato per Eclipse (c'è pure una versione stand-alone scaricabile dal progetto jasperreports stesso basato su una release strippata di tutto di Eclipse), poi mi sono ricopiato i file necessari in Netbeans ed ho utilizzato quello. Nè da Eclipse né su Netbeans sono stato in grado di "bindare" risorse provenienti da Database (via tool visuale), per cui nella definizione di un datasource di prova, ho utilizzato un file XML. Ripeto, solo a scopo "vedi quel che stai facendo". Poi come hai visto dal codice, sono passato al database nella versione finale.