Jasper reports 如何在缺少数据的情况下在交叉表中显示列

Jasper reports 如何在缺少数据的情况下在交叉表中显示列,jasper-reports,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 cust

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

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

客户----活动\日期----活动| 客户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。

要显示没有日期的日期(在您的案例中没有活动),您应该使用datasource传递数据。JasperReports不知道任何日期范围或其他信息。这只是需要一个数据

问题
  • 第一个问题是,即使数据不存在,也要获取日期范围内的数据
  • 第二个问题是避免在交叉表中显示“null”数据
解决方案
  • 如果使用DB,您可以使用outter连接和一些日期范围“generator”来显示数据

    要解决好这一任务:

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

    对于PostgreSQL,您可以在post
    中找到解决方案 对于MySQL-& 对于SQL Server-

  • 使用左或右

  • 按日期和所需数据列出的数据

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

  • 交叉表有一个“特性”-我们不能根据条件隐藏行。即使我们为隐藏所有文本字段设置了所有属性,也会绘制空行。如果我们尝试在交叉表上使用一个过滤器,那么额外的行将消失。我认为(在这种可怜的情况下)最好为这样的行指定一个特殊的名称(我们也可以用更好的名称替换0)。在我的示例中,它将是“未设置”

样本 我在这个示例中使用了PostgreSQL

报告的模板

iReport中的结果

笔记: 我试图通过“删除带空格的行”、“空时为空”、“表达式时打印”属性来隐藏空行(带null),但没有成功。挖掘源代码对我也没有帮助

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