是否可以在引擎的帮助下进行自定义排序(不是升序或降序)?
Is it possible to make a custom sorting (not ascending or descending) with help of engine?
我有一个数据要排序,但它应该是我的规则定义的自定义排序。
例如,我需要按以下顺序打印值:
B
C
A
D
这不是升序或降序排序。
可以这样做吗?
首先,可以通过JasperReports引擎进行排序(无需查询语言的帮助,例如SQL)。
这可以借助主数据集的 sortField 属性或 subDataset.
未排序的报告样本
不排序的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。使用交叉表
交叉表组件正在使用数据排序机制 - 我们可以设置自定义排序行为。
我有一个数据要排序,但它应该是我的规则定义的自定义排序。
例如,我需要按以下顺序打印值:
B
C
A
D
这不是升序或降序排序。
可以这样做吗?
首先,可以通过JasperReports引擎进行排序(无需查询语言的帮助,例如SQL)。
这可以借助主数据集的 sortField 属性或 subDataset.
未排序的报告样本
不排序的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。使用交叉表
交叉表组件正在使用数据排序机制 - 我们可以设置自定义排序行为。