Jasper Report(iReport)来自主数据集的Pie数据集

时间:2012-09-21 16:45:24

标签: dataset jasper-reports ireport

我想在Jasper iReport中使用每组的饼图,但我不知道如何为每个组创建数据集。

假设我有一张表格如下:

Table users
---------
category - user - status

然后我有以下SQL

select * from users order by category

我的显示器有一个简单的类别组,其中详细显示了每个用户及其状态。理想情况下,我会让每个类别组标题显示一个饼图,其中包含所有不同的状态及其在该组中的计数。我不知道如何在iReport中做到这一点。

如果我提前了解所有类别,我可以使用以下内容为每个类别创建数据集:

select status, count(user) from user where category = <current category> group by status

我正在尝试使用JRMapCollectionDataSource来重置每个组,并使用变量从组中的行中提取数据,但我不是很熟悉整个重置组和增量范例

任何帮助?

1 个答案:

答案 0 :(得分:4)

您无需按照以下步骤进行编程即可解决此问题:

  1. 类别 字段和 用户 字段对数据进行排序(通过 iReport添加排序或在查询处理 jdbc datasource 的情况下将 ORDER BY 子句添加到查询中;
  2. 添加两个组:第一组 - 用于 类别 字段,第二组用于 用户 字段(通过 iReport )。 注意:不一定要在查询中添加 GROUP BY 子句;
  3. 饼图组件添加到 类别 字段的组标题区域;
  4. 为此 pieChart 设置 evaluationTime evaluationGroup 属性。
  5. 以下是演示如何构建饼图的工作示例。在此示例中,我使用 csv 文件作为数据源。

    该图表显示了每个类别用户的数量。我使用变量 usersCount 来计算每个组中的用户,但可以使用内置变量 { {1}}

    这是我的 jrxml 文件:

    $V{userGroup_COUNT}

    这是我的 csv 文件(数据文件 - datasource ):

    <?xml version="1.0" encoding="UTF-8"?>
    <jasperReport ...>
        <field name="category" class="java.lang.Integer"/>
        <field name="user" class="java.lang.String"/>
        <field name="status" class="java.lang.String"/>
        <sortField name="category"/>
        <sortField name="user"/>
        <variable name="usersCount" class="java.lang.Integer" resetType="Group" resetGroup="userGroup" calculation="Count">
            <variableExpression><![CDATA[$F{user}]]></variableExpression>
            <initialValueExpression><![CDATA[0]]></initialValueExpression>
        </variable>
        <group name="categoryGroup">
            <groupExpression><![CDATA[$F{category}]]></groupExpression>
            <groupHeader>
                <band height="135">
                    <pieChart>
                        <chart evaluationTime="Group" evaluationGroup="categoryGroup">
                            <reportElement x="158" y="0" width="200" height="135"/>
                            <chartTitle/>
                            <chartSubtitle/>
                            <chartLegend/>
                        </chart>
                        <pieDataset>
                            <dataset resetType="Group" resetGroup="categoryGroup" incrementType="Group" incrementGroup="userGroup"/>
                            <keyExpression><![CDATA[$F{user}]]></keyExpression>
                            <valueExpression><![CDATA[$V{usersCount}]]></valueExpression>
                            <labelExpression><![CDATA[String.valueOf($V{usersCount})]]></labelExpression>
                        </pieDataset>
                        <piePlot>
                            <plot/>
                            <itemLabel/>
                        </piePlot>
                    </pieChart>
                    <textField>
                        <reportElement x="0" y="0" width="100" height="20"/>
                        <textElement/>
                        <textFieldExpression><![CDATA["Category: " + $F{category}]]></textFieldExpression>
                    </textField>
                </band>
            </groupHeader>
        </group>
        <group name="userGroup">
            <groupExpression><![CDATA[$F{user}]]></groupExpression>
        </group>
        <title>
            <band height="79" splitType="Stretch"/>
        </title>
    </jasperReport>
    

    结果将是(通过 iReport 预览):

    The result