Как передать 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 6

3 ответа:

Это делается путем передачи источника данных коллекции: new BeanCollectionDataSource(yourArrayList);

И затем получить объект JasperPrint:

JasperPrint jasperPrint = 
      JasperFillManager.fillReport(jasperReport, params, dataSource);

Чтобы перейти к вложенному отчету, у вас есть два варианта:

  • Если это вложенный отчет на строку, просто имейте массив как свойство Боба. То есть List<Something>, где Something имеет свойство вида List<AnotherThing>
  • если он один для всего отчета, передайте его в качестве параметра (params выше).

Шаг: 1 Определите поле типа
имя поля= "listCusipData" и класс= " java.утиль.ArrayList "

Шаг: 2 Используйте это выражение внутри вашего суб-отчета dataSourceExpression
новая сеть.sf.Джаспер докладывает.двигатель.данные.JRBeanCollectionDataSource($F{listCusipData}, false)

Это можно сделать с помощью списков и / или вложенных отчетов, источников данных и JRBeanCollectionDatasource.

Проверьте этот пример:

Http://siempredesdeelcurro.blogspot.com.es/2013/06/jasper-reports-crear-report-utilizando.html

Это на испанском, но по вашему имени, я думаю, вы сможете прочитать его ;)

Для не говорящих на испанском языке вы все еще можете использовать его, так как в конце учебника вы можете найти XML с шаблонами jrxml.