2010-09-02 10 views
6

JasperReports'a yeni geliyorum. Alt raporun alt raporuna ArrayList geçmek istiyorum.ArrayList JasperReports'a nasıl geçilir?

İçinde bir alt rapor içeren ana rapor var1 ve bu alt raporda1 bir
alt raporunda2 içerir.

Şimdi arrayList'i subreport2'ye nasıl geçireceksiniz?

Not

MasterReport -> SubReport -> SubReport gibi: Benim DAO java sınıfından jasper DataList Jasper şablon oluşturmak için iReport kullanarak ve geçirerek.

Aşağıda My DAO java sınıfı yukarıdaki DAO sınıf

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; 
} 

aşağıda listesi döndürür ve HashMap Param ile bu Arraylist Jasper şablonu geçiyor

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.. 

benim Formu fasulye Sınıf olduğunu.

Aşağıda buradan i $p{list}ArrayList olduğunu

 <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> 

gibi alt rapor için ArrayList geçirerek, benim örnek Usta Jasper şablondur. ve ben aşağıdaki hatayı alıyorum, kod çalıştırırken

asusual subReport1 yazdırmak için bu listeyi kullanın:

Error retrieving field value from bean : tripID

Teşekkür Yardımlarınız için şimdiden.

+0

btw, Java jenerikleri hakkında daha fazla bilgi edinmelisiniz - bunları düzgün kullanmıyorsunuz. – Bozho

+0

bu sorun çözüldü mü? Ben benzer bir sorun yaşıyorum beri hayal kırıklığına uğradım. Başka bir dizi listesi nesnesine ve başka bir dizi listesi nesnesine sahip dizi listesi nesnesi. 3 seviyem var. –

cevap

9

Bir toplama veri kaynağını ileterek bitti: JasperPrint nesneyi elde etmek new BeanCollectionDataSource(yourArrayList);

Ve sonra:

    :

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

    bir alt rapor geçmek için iki seçeneğiniz var

  • Satır başına bir alt rapor ise, diziyi yalnızca çekirdeğin bir özelliği olarak bulundurun. Yani List<Something>, Something, List<AnotherThing>
  • türünde bir özelliğe sahipse, raporun tamamı için bir parametre olarak iletin (params).
+0

evet biliyorum. ama nasıl geçilir. Bana biraz örnek örnek kodu sağlayabilir misiniz. arrayList'i ilk alt rapora geçirebiliyorum ancak alt rapordan (supreport11) (master-sureport1-subreport2) supreport2'ye geçemiyorum. subreport2 alt raporda1 – Manu

+0

kuyu içerisindedir, önce bir kod gösterirsiniz - raporunuzu Java kodunda nasıl elde edersiniz? – Bozho

+0

@Bozho .. kodum çok büyük, bu yüzden burada yayınlayamadım. , Arraylist'i alt raporun alt raporuna geçirmek için kullanılan örnek bir kod yazabilir misiniz? – Manu

5

Adım: 2 kullanımınız alt raporu dataSourceExpression
yeni net.sf içinde bu ifadesi: 1
alan adı = "listCusipData" ve class = "java.util.ArrayList"

Adım gibi bir alanı tanımlamak .jasperreports.engine.data.JRBeanCollectionDataSource ($ F {listCusipData}, false)