2012-10-15 53 views
1

我有報告組和小組,並需要按字母順序排序,但我想排序空值或空值爲最後。有沒有選擇或一些工作來做到這一點?謝謝帕維爾賈斯珀報告排序空/空值最後

+0

你使用了什麼* DB *(如果你使用的是jdbc數據源)? –

+0

@AlexK我使用java的bean數據源 – Perlos

回答

7

你可以通過排序選項和附加變量來獲得這個結果。

的步驟:

<variable name="isNull" class="java.lang.Integer"> 
    <variableExpression><![CDATA[Strings.isNullOrEmpty($F{fieldName})]]></variableExpression> 
</variable> 
  • 添加兩個分揀指示 - 在我們的新變量排序(先行)和通過排序字段(進入第二)
<sortField name="isNull" order="Ascending" type="Variable"/> 
<sortField name="fieldName"/> 

完整工作示例。該JRXML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport ...> 
    <import value="com.google.common.base.*"/> 
    <field name="id" class="java.lang.Integer"/> 
    <field name="city" class="java.lang.String"/> 
    <sortField name="isNull" order="Ascending" type="Variable"/> 
    <sortField name="city"/> 
<variable name="isNull" class="java.lang.Integer"> 
    <variableExpression><![CDATA[Strings.isNullOrEmpty($F{city})]]></variableExpression> 
</variable> 
    <detail> 
     <band height="20" splitType="Stretch"> 
      <textField> 
       <reportElement x="0" y="0" width="100" height="20"/> 
       <textElement/> 
       <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression> 
      </textField> 
      <textField> 
       <reportElement x="100" y="0" width="100" height="20"/> 
       <textElement/> 
       <textFieldExpression><![CDATA[$F{city}]]></textFieldExpression> 
      </textField> 
     </band> 
    </detail> 
</jasperReport> 

測試Java代碼:

private void testReport() throws JRException { 
    JasperReport jasperReport = JasperCompileManager.compileReport(reportSource); 
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, getDataSource()); 

    JasperExportManager.exportReportToPdfFile(jasperPrint, outputFileName); 
} 

private JRDataSource getDataSource() { 
    Collection<Address> list = new ArrayList<Address>(); 

    list.add(new Address(1, "Dallas")); 

    list.add(new Address(2, "Dallas")); 

    list.add(new Address(3, "Dallas")); 

    list.add(new Address(5, null)); 

    list.add(new Address(4, "")); 

    list.add(new Address(6, "Boston")); 

    list.add(new Address(7, "Chicago")); 

    list.add(new Address(8, "Dallas")); 

    list.add(new Address(9, "")); 

    list.add(new Address(10, null)); 

    list.add(new Address(11, null)); 

    return new JRBeanCollectionDataSource(list); 
} 

在此示例中地址是一個簡單的POJO

public class Address { 

    private Integer m_id; 
    private String m_city; 

    public Address(Integer id, String city) { 
     m_city = city; 
     m_id = id; 
    } 

    public Integer getId() { 
     return m_id; 
    } 

    public String getCity() { 
     return m_city; 
    } 
} 

的結果將(生成PDF文件):

The generated report in *PDF* format

在示例中,我已經使用了的Java bean基於數據源,但這種方法也適用於JDBC數據源


可以容易反向通過更換排序選項排序(的順序值更改屬性從升序降序):

<sortField name="isNull" order="Descending" type="Variable"/> 

這個表達式將用於對數據進行排序在列表頂部顯示空值和空值。

+0

謝謝,它看起來像我需要的東西。我會測試它 – Perlos