2010-09-02 2 views
6

Я новичок в JasperReports. Я хочу передать ArrayList в подзаголовок подзаголовка.Как передать ArrayList в JasperReports?

У меня есть основной отчет, который содержит один подрепортаж1, и этот подзадача1 заключает в себе один
subreport2 внутри.

Теперь, как передать массивList в subreport2?

Как MasterReport -> SubReport -> SubReport

Примечание: Я использую iReport создать шаблон яшмы и прохождение DataList Джаспера из моего 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.

Ниже мой пример шаблона Мастер яшмы, отсюда я передаю ArrayList в SubReport как

 <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

Спасибо за вашу помощь заранее.

+0

Кстати, вы действительно должны больше узнать о дженериках Java - вы не используете их должным образом. – Bozho

+0

эта проблема решена? Я расстроен, так как у меня такая же проблема. Объект списка массива имеет другой объект списка массива и другой объект списка массива. У меня 3 уровня. – 2011-01-19 18:42:39

ответ

9

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

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

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

перейти к подотчету, у вас есть два варианта:

  • Если это subreport-per-row, просто получите массив как свойство bean-компонента. То есть List<Something>, где Something имеет имущество типа List<AnotherThing>
  • Если это один отчет за весь отчет, передайте его как параметр (params выше).
+0

да, я это знаю. но как пройти его. вы можете кратко привести мне пример примерного кода. Я могу передать массивList для первого вложенного отчета, но не могу перейти к supreport2 из subreport1 (master-sureport1-subreport2). subreport2 находится внутри subreport1 – Manu

+0

ну, вы сначала показываете некоторый код - как вы получаете свой отчет в Java-коде. – Bozho

+0

@Bozho .. мое кодирование огромно, поэтому я не мог опубликовать его здесь. Для этого. Не могли бы вы разместить какой-нибудь образец кода, который используется для передачи Arraylist в подчиненный отчет. – Manu

0

Вы можете сделать это с использованием списков и/или подписок, источников данных и JRBeanCollectionDatasource.

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

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

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

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

5

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

Шаг: 2 используйте это выражение внутри суб отчета dataSourceExpression
новый net.sf .jasperreports.engine.data.JRBeanCollectionDataSource ($ F {listCusipData}, false)

Смежные вопросы