是否可以在引擎的帮助下进行自定义排序(不升序或降序)? [英] Is it possible to make a custom sorting (not ascending or descending) with help of engine?

查看:32
本文介绍了是否可以在引擎的帮助下进行自定义排序(不升序或降序)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个要排序的数据,但它应该是由我的规则定义的自定义排序。

例如,我需要按以下顺序打印值:

B 
C
A
D

它不是升序或降序排序。

是否可以执行此操作?

推荐答案

首先可以通过JasperReports引擎进行排序(不需要查询语言的帮助,比如sql)。

这可以借助主数据集的sortField属性或子数据集属性来完成。

未排序的报表示例

不排序报表的jrxml

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Non sorted data" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <subDataset name="ds">
        <field name="value" class="java.lang.String">
            <fieldDescription><![CDATA[_THIS]]></fieldDescription>
        </field>
    </subDataset>
    <summary>
        <band height="15">
            <componentElement>
                <reportElement x="0" y="0" width="311" height="15"/>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                    <datasetRun subDataset="ds">
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(Arrays.asList("def", "jkl", "abc", "ghi"))]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="15" width="311">
                        <textField>
                            <reportElement x="0" y="0" width="311" height="15"/>
                            <textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </summary>
</jasperReport>

Jaspersoft Studio(JSS)中的结果为:

通过sortField添加排序后,模板将为:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Sorted data" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <subDataset name="ds">
        <field name="value" class="java.lang.String">
            <fieldDescription><![CDATA[_THIS]]></fieldDescription>
        </field>
        <sortField name="value"/>
    </subDataset>
    <summary>
        <band height="15">
            <componentElement>
                <reportElement x="0" y="0" width="311" height="15"/>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                    <datasetRun subDataset="ds">
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(Arrays.asList("def", "jkl", "abc", "ghi"))]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="15" width="311">
                        <textField>
                            <reportElement x="0" y="0" width="311" height="15"/>
                            <textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </summary>
</jasperReport>

JSS中的结果:

自定义排序可以通过多种方式实现

1.使用sortField属性

sortField属性不仅可以处理字段,还可以处理变量。 如果可能,我们可以将排序逻辑移至此处(移至变量)。

简单示例:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Data with custom sorting" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <subDataset name="ds">
        <field name="value" class="java.lang.String">
            <fieldDescription><![CDATA[_THIS]]></fieldDescription>
        </field>
        <sortField name="valueForSorting" type="Variable"/>
        <variable name="valueForSorting" class="java.lang.Integer">
            <variableExpression><![CDATA["a".equalsIgnoreCase($F{value}) ? 3 :  "b".equalsIgnoreCase($F{value}) ? 1 : "c".equalsIgnoreCase($F{value}) ? 2 : "d".equalsIgnoreCase($F{value}) ? 4 : 0]]></variableExpression>
        </variable>
    </subDataset>
    <summary>
        <band height="15">
            <componentElement>
                <reportElement x="0" y="0" width="311" height="15"/>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                    <datasetRun subDataset="ds">
                        <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource(Arrays.asList("d", "c", "b", "a"))]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="15" width="311">
                        <textField>
                            <reportElement x="0" y="0" width="311" height="15"/>
                            <textFieldExpression><![CDATA[$F{value}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </summary>
</jasperReport>

JSS中的结果为:

2.使用查询技巧

在某些情况下,使用case运算符可以帮助我们按需要对数据进行排序。

例如:

SELECT value,
  CASE
    WHEN value = 'a' THEN 3
    WHEN value = 'b' THEN 1
    WHEN value = 'c' THEN 2
    WHEN value = 'd' THEN 4
    ELSE 0
    END AS valueForSorting
FROM someTable

3.自定义数据源

使用自定义数据源是对数据进行排序的另一种方式。我们可以在Java代码中对数据进行排序,然后将数据源传递给报表。

4.使用交叉表

交叉表组件正在使用数据排序机制-我们可以设置排序的自定义行为。

这篇关于是否可以在引擎的帮助下进行自定义排序(不升序或降序)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆