Как передать ArrayList в JasperReports?
Я новичок в JasperReports
. Я хочу передать ArrayList
в вложенный отчет вложенного отчета.
У меня есть главный отчет, который содержит один вложенный отчет1, и этот вложенный отчет1 инкапсулирует один
вложенный отчет 2 внутри.
Теперь как передать arrayList в subreport2?
Как MasterReport -> SubReport -> SubReport
Примечание: я использую iReport
для создания шаблона jasper и передачи datalist в jasper из моего класса DAO java.
Ниже приведен мой класс фасоли формы
public class CollatReportData extends BaseItem {
private List<CusipData> listCusipData = null;
private String dealerID = null;
private String tripID = null;
private String loanNo = null;
private String dealerName = null;
private String tripDealerLoan = null;
public CollatReportData() {
super();
}
public List<CusipData> getListCusipData() {
return listCusipData;
}
public void setListCusipData(List<CusipData> listCusipData) {
this.listCusipData = listCusipData;
}
public String getDealerID() {
return dealerID;
}
public void setDealerID(String dealerID) {
this.dealerID = dealerID;
}
public String getTripID() {
return tripID;
}
public void setTripID(String tripID) {
this.tripID = tripID;
}
} // and so on for other variables..
Мой класс DAO java находится ниже
public List<Object> getCollatData(String custName, String ctripid,
String dealerid, String userID) {
final Connection conn = super.getCurrentConnection();
String sqlQueryTrip = null;
ResultSet rsCollat = null;
String tripID = null;
String dealerID = null;
String cusSysID = null;
String loanNo = null;
String txnNo = null;
String cusipNo = null;
String cusipStatus = null;
String parVal = null;
String tripDealerLoan = null;
String OldtripDealerLoan = "";
String NewtripDealerLoan = "";
CollatReportData reportData = null;
CusipData cusipData = null;
List listCusip = new ArrayList<Object>();
List CollatList = new ArrayList<Object>();
try {
PreparedStatement pstmtTrip;
sqlQueryTrip = "SELECT iscl_sys_id, iscl_trip_id, iscl_trip_dealer_id, "
+ "iscl_cus_sys_id, iscl_bankref_cd, iscl_bdas_db_cd, "
+ "iscl_loan_no, iscl_txn_no, iscl_cusip_no, iscl_status_cd, "
+ "iscl_sec_de_tx, iscl_par_val_am, iscl_market_val_am, "
+ "scl_pri_source_cd, iscl_colla_mar_val_am, iscl_mature_dt, "
+ "iscl_sec_ty, iscl_sec_rt, iscl_sec_price_am, iscl_sec_factor, "
+ "iscl_sec_margin, iscl_sec_accrued_am "
+ "FROM BDS_DBA.INVCONF_SHELL_COLLAT "
+ "WHERE iscl_cus_sys_id='" + custName + "'";
pstmtTrip = conn.prepareStatement(sqlQueryTrip);
rsCollat = pstmtTrip.executeQuery();
if (rsCollat != null) {
while (rsCollat.next()) {
tripID = rsCollat.getString("iscl_trip_id");
dealerID = rsCollat.getString("iscl_trip_dealer_id");
loanNo = rsCollat.getString("iscl_loan_no");
tripDealerLoan = tripID + dealerID + loanNo;
cusipData = new CusipData();
cusipData.setTripID(tripID);
cusipData.setCusipNo(cusipNo);
cusipData.setTripDealerLoan(tripDealerLoan);
listCusip.add(cusipData);
} // end rsCollat
} // end if
CusipData cusipData1 = new CusipData();
List CusipList = new ArrayList<Object>();
for (int io = 0; io < listCusip.size(); io++) {
cusipData1 = (CusipData) listCusip.get(io);
NewtripDealerLoan = cusipData1.getTripDealerLoan();
tripID = cusipData1.getTripID();
dealerID = cusipData1.getDealerID();
loanNo = cusipData1.getLoanNo();
if (NewtripDealerLoan.equalsIgnoreCase(OldtripDealerLoan) || OldtripDealerLoan.equalsIgnoreCase("")) {
CusipList.add(cusipData1);
}
if (!NewtripDealerLoan.equalsIgnoreCase(OldtripDealerLoan)) {
reportData = new CollatReportData();
reportData.setTripID(tripID);
reportData.setTripDealerLoan(NewtripDealerLoan);
reportData.setListCusipData(CusipList);
//and so on
//........
CollatList.add(reportData);
CusipList = null;
}
OldtripDealerLoan = NewtripDealerLoan;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Inside LoanDetailDAO:strTripQuery:Exception" + sqlQueryTrip + e);
}
return CollatList;
}
Приведенный выше класс DAO возвращает список и передает этот Arraylist
в шаблон Jasper через HashMap Param.
Ниже приведен мой образец шаблона Master jasper, отсюда я передаю ArrayList в вложенный отчет, как
<parameter name="list" isForPrompting="false" class="java.util.List"/>
<detail>
<band height="100" isSplitAllowed="true" >
<subreport isUsingCache="true">
<reportElement
x="30"
y="20"
width="170"
height="40"
key="subreport-1"/>
<dataSourceExpression><![CDATA[new JRBeanCollectionDataSource( $P{list})]]></dataSourceExpression>
<subreportExpression class="java.lang.String"><![CDATA[$P{SUBREPORT_DIR} + "Collateral_SubReport1.jasper"]]></subreportExpression>
</subreport>
</band>
</detail>
Где $p{list}
- это ArrayList
. и используйте этот список для печати в subReport1 asusual
Во время выполнения кода я получаю следующую ошибку:
Error retrieving field value from bean : tripID
Заранее благодарю за помощь.
3 ответа:
Это делается путем передачи источника данных коллекции:
new BeanCollectionDataSource(yourArrayList);
И затем получить объект
JasperPrint
:JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, dataSource);
Чтобы перейти к вложенному отчету, у вас есть два варианта:
- Если это вложенный отчет на строку, просто имейте массив как свойство Боба. То есть
List<Something>
, гдеSomething
имеет свойство видаList<AnotherThing>
- если он один для всего отчета, передайте его в качестве параметра (
params
выше).
Шаг: 1 Определите поле типа
Шаг: 2 Используйте это выражение внутри вашего суб-отчета dataSourceExpression
имя поля= "listCusipData" и класс= " java.утиль.ArrayList "
новая сеть.sf.Джаспер докладывает.двигатель.данные.JRBeanCollectionDataSource($F{listCusipData}, false)
Это можно сделать с помощью списков и / или вложенных отчетов, источников данных и JRBeanCollectionDatasource.
Проверьте этот пример:
Http://siempredesdeelcurro.blogspot.com.es/2013/06/jasper-reports-crear-report-utilizando.html
Это на испанском, но по вашему имени, я думаю, вы сможете прочитать его ;)
Для не говорящих на испанском языке вы все еще можете использовать его, так как в конце учебника вы можете найти XML с шаблонами jrxml.