即使数据不存在,如何在交叉表中显示列

Mor*_*ine 2 jasper-reports

有没有人有提示,如果我想从数组创建交叉表列,然后将更正信息插入交叉表?

例如,我的数据库中有一个如下表:

客户----活动日期----活动|

客户 1 ---- 01-01-2016 ---- A|

客户 1 ---- 01-03-2016 ---- B|

客户 2 ---- 01-01-2016 ---- A|

当用户在 1 月 16 日至 3 月 16 日期间要求报告时,报告应如下所示:

客户---- 01-2016 ---- 02-2016 ---- 03-2016 |

customer1 ---- 活动数:1 ---- 活动数:0 ---- 活动数:1

customer2 ---- 活动数:1 ---- 活动数:0 ---- 活动数:0

总计 ---- 活动总和:2 ---- 活动总和:0 ---- 活动计数:1

当前的问题是,由于没有2016年2月的数据,报告中缺少02-2016列。

有没有办法(如scriptlet)创建一个数组作为列,然后在activity_date == column_date时告诉JasperReport插入正确的数据?

我正在使用 Jaspersoft Studio。

Ale*_*x K 5

要显示没有日期的日期(在您的情况下没有活动),您应该使用数据源传递数据。该JasperReports的不知道日期或其他东西的任何范围东西。它只是需要一个数据。

问题

  • 第一个问题是即使数据不存在也要获取日期范围内的数据
  • 第二个 - 是避免在交叉表中显示“空”数据

解决方案

  • 如果使用数据库,您可以使用外部连接和一些日期范围“生成器”来显示数据。

    我们应该解决这个任务:

    1. 获取某个时间段内所有日期(天)的列表。对于不同的 RDBMS,语法会有所不同。

      对于PostgreSQL的,你可以找到的解决方案获得在PostgreSQL的一系列最新名单
      MySQL的- MySQL的如何填写范围缺少的日期生成日期范围内的天 对于SQL服务器- SQL服务器:如何在一个日期范围内选择所有天即使有几天没有数据存在

    2. 使用左或右外连接

    3. 按日期和所需数据数据进行排序

  • 如果使用JavaBean 数据源,您也应该这样做 - 添加您需要的日期(没有数据)并对数据进行排序。我们可以跳过数据排序的实现,让JasperReports引擎为我们做这件事。

  • 交叉表有一个“功能”——我们不能隐藏带有条件的行。即使我们设置了隐藏所有textFields 的所有属性- 将绘制空行。如果我们尝试在交叉表上使用过滤器,我们的额外行将消失。我认为好主意(在这种可怜的情况下)是为这样的行起一个特殊的名字(我们也可以用更好的东西代替 0)。在我的示例中,它将是'Not set'

样品

我在本示例中使用了PostgreSQL

报告的模板

<?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="crss_dates_group" pageWidth="842" pageHeight="595" orientation="Landscape" whenNoDataType="AllSectionsNoDetail" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isIgnorePagination="true" uuid="6886d70f-dbf3-4dfa-bbee-d5bc70b1c45d">
    <style name="Crosstab Data Text" hAlign="Center"/>
    <subDataset name="dsDates" uuid="9b8d3c04-25f5-40f0-b116-a77f8d2f7445">
        <queryString language="SQL">
            <![CDATA[SELECT  activityName, to_char(generate_series, 'YYYY-MM-DD') AS activityDate
FROM myTable RIGHT OUTER JOIN (SELECT (generate_series('2010-07-18', '2010-07-29', '1 day'::interval))::date) fake
ON to_char(activityDateFromMyTable, 'YYYY-MM-DD')=to_char(generate_series, 'YYYY-MM-DD') ORDER BY 2, 1]]>
        </queryString>
        <field name="activityName" class="java.lang.String"/>
        <field name="activityDate" class="java.lang.String"/>
        <group name="activityDateGroup">
            <groupExpression><![CDATA[$F{activityDate}]]></groupExpression>
        </group>
    </subDataset>
    <title>
        <band height="79" splitType="Stretch">
            <crosstab>
                <reportElement x="0" y="0" width="802" height="79" uuid="d39eef3f-aada-406f-99ee-1d2ce2bde5c8"/>
                <crosstabDataset>
                    <dataset>
                        <datasetRun subDataset="dsDates" uuid="619c0498-512a-4f23-9f1e-6a5d7cfa986d">
                            <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
                        </datasetRun>
                    </dataset>
                </crosstabDataset>
                <rowGroup name="activityName" width="95" totalPosition="End">
                    <bucket class="java.lang.String">
                        <bucketExpression><![CDATA[$F{activityName}]]></bucketExpression>
                    </bucket>
                    <crosstabRowHeader>
                        <cellContents backcolor="#F0F8FF" mode="Opaque">
                            <box>
                                <pen lineWidth="0.5" lineStyle="Solid" lineColor="#000000"/>
                            </box>
                            <textField>
                                <reportElement style="Crosstab Data Text" x="0" y="0" width="95" height="25" uuid="c25490b6-a836-41fb-a36c-a7ebb211bf03"/>
                                <textFieldExpression><![CDATA[$V{activityName} == null ? "Not set" : $V{activityName}]]></textFieldExpression>
                            </textField>
                        </cellContents>
                    </crosstabRowHeader>
                    <crosstabTotalRowHeader>
                        <cellContents backcolor="#BFE1FF" mode="Opaque">
                            <box>
                                <pen lineWidth="0.5" lineStyle="Solid" lineColor="#000000"/>
                            </box>
                            <staticText>
                                <reportElement x="0" y="0" width="95" height="25" uuid="12efa463-c4a3-4120-b0e2-0664856cc616"/>
                                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                                <text><![CDATA[Total by Date]]></text>
                            </staticText>
                        </cellContents>
                    </crosstabTotalRowHeader>
                </rowGroup>
                <columnGroup name="activityDate" height="30" totalPosition="End">
                    <bucket class="java.lang.String">
                        <bucketExpression><![CDATA[$F{activityDate}]]></bucketExpression>
                    </bucket>
                    <crosstabColumnHeader>
                        <cellContents backcolor="#F0F8FF" mode="Opaque">
                            <box>
                                <pen lineWidth="0.5" lineStyle="Solid" lineColor="#000000"/>
                            </box>
                            <textField>
                                <reportElement style="Crosstab Data Text" x="0" y="0" width="61" height="30" uuid="5b931464-5a7a-4e57-a51a-3d687c0a4130"/>
                                <textFieldExpression><![CDATA[$V{activityDate}]]></textFieldExpression>
                            </textField>
                        </cellContents>
                    </crosstabColumnHeader>
                    <crosstabTotalColumnHeader>
                        <cellContents backcolor="#BFE1FF" mode="Opaque">
                            <box>
                                <pen lineWidth="0.5" lineStyle="Solid" lineColor="#000000"/>
                            </box>
                            <staticText>
                                <reportElement x="0" y="0" width="50" height="30" uuid="227c77a6-b1c1-485f-95cf-95b43bc95920"/>
                                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                                <text><![CDATA[Total by Activity]]></text>
                            </staticText>
                        </cellContents>
                    </crosstabTotalColumnHeader>
                </columnGroup>
                <measure name="activityNameMeasure" class="java.lang.Integer" calculation="Count">
                    <measureExpression><![CDATA[$F{activityName}]]></measureExpression>
                </measure>
                <crosstabCell width="61" height="25">
                    <cellContents>
                        <box>
                            <pen lineWidth="0.5" lineStyle="Solid" lineColor="#000000"/>
                        </box>
                        <textField>
                            <reportElement style="Crosstab Data Text" x="0" y="0" width="61" height="25" uuid="b8a8aacb-58d1-447a-9628-7f045b039f9f"/>
                            <textFieldExpression><![CDATA[$V{activityNameMeasure}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
                <crosstabCell width="61" height="25" rowTotalGroup="activityName">
                    <cellContents backcolor="#BFE1FF" mode="Opaque">
                        <box>
                            <pen lineWidth="0.5" lineStyle="Solid" lineColor="#000000"/>
                        </box>
                        <textField>
                            <reportElement style="Crosstab Data Text" x="0" y="0" width="61" height="25" uuid="02e88c9a-e9cc-4674-9301-21676d3f33bc"/>
                            <textFieldExpression><![CDATA[$V{activityNameMeasure}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
                <crosstabCell width="50" columnTotalGroup="activityDate">
                    <cellContents backcolor="#BFE1FF" mode="Opaque">
                        <box>
                            <pen lineWidth="0.5" lineStyle="Solid" lineColor="#000000"/>
                        </box>
                        <textField>
                            <reportElement style="Crosstab Data Text" x="0" y="0" width="50" height="25" uuid="d39d1353-61a6-4041-96d6-2065bae0041b"/>
                            <textFieldExpression><![CDATA[$V{activityNameMeasure}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
                <crosstabCell rowTotalGroup="activityName" columnTotalGroup="activityDate">
                    <cellContents backcolor="#BFE1FF" mode="Opaque">
                        <box>
                            <pen lineWidth="0.5" lineStyle="Solid" lineColor="#000000"/>
                        </box>
                        <textField>
                            <reportElement style="Crosstab Data Text" x="0" y="0" width="50" height="25" uuid="09aa0d57-5cfa-4e78-af85-0e718c0fee44"/>
                            <textFieldExpression><![CDATA[$V{activityNameMeasure}]]></textFieldExpression>
                        </textField>
                    </cellContents>
                </crosstabCell>
            </crosstab>
        </band>
    </title>
</jasperReport>
Run Code Online (Sandbox Code Playgroud)

iReport 中的结果

通过 iReport 预览的结果

笔记:

我试图在“删除空白行”、“空时空白”、“表达式时打印”属性的帮助下隐藏空行(空行),但没有成功。挖掘源代码对我也没有帮助。

您可以在此处找到有关在交叉表中隐藏空记录的类似尝试的更多信息:

也许是时候在 Jaspersoft/Tibco 社区为这个“新旧”功能(隐藏空行)投票了 :)