首页 > 解决方案 > 使用 Jasper Studio 根据返回的值隐藏子报表

问题描述

我正在编写一份报告,其中的情况如下:

设想 我从Sub-Report 1到 Main Report中获得了Col 3 & Row 1的值。现在,如果它返回的值为 1,我想隐藏子报表1。我尝试这样做的方式如下:

结果是什么?

当我应用Print When Expression时, rowNumberSum 的值变为null

这是 名为Blank_A4的子报告的代码

    <?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown  -->
<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="Blank_A4" pageWidth="300" pageHeight="300" columnWidth="260" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4fcf5f85-7a0c-44bc-b2ca-658905e3b408">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="FeaturesAnalyzedIn12MonthsAdapter"/>
    <property name="com.jaspersoft.studio.unit." value="pixel"/>
    <property name="com.jaspersoft.studio.unit.pageHeight" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.pageWidth" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.topMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.bottomMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.leftMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.rightMargin" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.columnWidth" value="pixel"/>
    <property name="com.jaspersoft.studio.unit.columnSpacing" value="pixel"/>
    <style name="Table 1_TH" mode="Opaque" backcolor="#F0F8FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
            <topPen lineWidth="0.5" lineColor="#000000"/>
            <leftPen lineWidth="0.5" lineColor="#000000"/>
            <bottomPen lineWidth="0.5" lineColor="#000000"/>
            <rightPen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="Table 1_CH" mode="Opaque" backcolor="#BFE1FF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
            <topPen lineWidth="0.5" lineColor="#000000"/>
            <leftPen lineWidth="0.5" lineColor="#000000"/>
            <bottomPen lineWidth="0.5" lineColor="#000000"/>
            <rightPen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <style name="Table 1_TD" mode="Opaque" backcolor="#FFFFFF">
        <box>
            <pen lineWidth="0.5" lineColor="#000000"/>
            <topPen lineWidth="0.5" lineColor="#000000"/>
            <leftPen lineWidth="0.5" lineColor="#000000"/>
            <bottomPen lineWidth="0.5" lineColor="#000000"/>
            <rightPen lineWidth="0.5" lineColor="#000000"/>
        </box>
    </style>
    <subDataset name="Dataset1" uuid="a870c303-592a-48fa-b215-f208cbe6dd89">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="FeaturesAnalyzedAndReviewedIn12MonthsAdapter"/>
        <property name="net.sf.jasperreports.data.adapter" value="/home/jamshaid/JaspersoftWorkspace/Line Chart/FeaturesAnalyzedAndReviewedIn12MonthsAdapter.xml"/>
        <parameter name="JSON_INPUT_STREAM" class="java.io.InputStream" isForPrompting="false"/>
        <parameter name="net.sf.jasperreports.json.source" class="java.lang.String" isForPrompting="false"/>
        <parameter name="net.sf.jasperreports.json.sources" class="java.util.List" isForPrompting="false"/>
        <parameter name="net.sf.jasperreports.json.date.pattern" class="java.lang.String" isForPrompting="false"/>
        <parameter name="net.sf.jasperreports.json.number.pattern" class="java.lang.String" isForPrompting="false"/>
        <parameter name="JSON_LOCALE" class="java.util.Locale" isForPrompting="false"/>
        <parameter name="net.sf.jasperreports.json.locale.code" class="java.lang.String" isForPrompting="false"/>
        <parameter name="JSON_TIME_ZONE" class="java.util.TimeZone" isForPrompting="false"/>
        <parameter name="net.sf.jasperreports.json.timezone.id" class="java.lang.String" isForPrompting="false"/>
        <queryString language="JSON">
            <![CDATA[]]>
        </queryString>
        <field name="month" class="java.lang.String">
            <property name="net.sf.jasperreports.json.field.expression" value="month"/>
            <fieldDescription><![CDATA[month]]></fieldDescription>
        </field>
        <field name="percentage" class="java.math.BigDecimal">
            <property name="net.sf.jasperreports.json.field.expression" value="percentage"/>
            <fieldDescription><![CDATA[percentage]]></fieldDescription>
        </field>
        <variable name="rowNumber" class="java.lang.Integer">
            <variableExpression><![CDATA[IF($V{REPORT_COUNT}==1,1,0)]]></variableExpression>
        </variable>
        <variable name="rowNumberSum" class="java.lang.Integer" calculation="First">
            <variableExpression><![CDATA[$V{rowNumber}]]></variableExpression>
        </variable>
    </subDataset>
    <parameter name="JSON_INPUT_STREAM" class="java.io.InputStream" isForPrompting="false"/>
    <parameter name="net.sf.jasperreports.json.source" class="java.lang.String" isForPrompting="false"/>
    <parameter name="net.sf.jasperreports.json.sources" class="java.util.List" isForPrompting="false"/>
    <parameter name="net.sf.jasperreports.json.date.pattern" class="java.lang.String" isForPrompting="false"/>
    <parameter name="net.sf.jasperreports.json.number.pattern" class="java.lang.String" isForPrompting="false"/>
    <parameter name="JSON_LOCALE" class="java.util.Locale" isForPrompting="false"/>
    <parameter name="net.sf.jasperreports.json.locale.code" class="java.lang.String" isForPrompting="false"/>
    <parameter name="JSON_TIME_ZONE" class="java.util.TimeZone" isForPrompting="false"/>
    <parameter name="net.sf.jasperreports.json.timezone.id" class="java.lang.String" isForPrompting="false"/>
    <queryString language="JSON">
        <![CDATA[]]>
    </queryString>
    <field name="month" class="java.lang.String">
        <property name="net.sf.jasperreports.json.field.expression" value="month"/>
        <fieldDescription><![CDATA[month]]></fieldDescription>
    </field>
    <field name="percentage" class="java.lang.Double">
        <property name="net.sf.jasperreports.json.field.expression" value="percentage"/>
        <fieldDescription><![CDATA[percentage]]></fieldDescription>
    </field>
    <variable name="rowNumberSum" class="java.lang.Integer" resetType="None"/>
    <summary>
        <band height="239" splitType="Stretch">
            <componentElement>
                <reportElement x="-20" y="20" width="200" height="200" uuid="5d154620-3646-49fc-9702-8af059721751">
                    <property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.VerticalRowLayout"/>
                    <property name="com.jaspersoft.studio.table.style.table_header" value="Table 1_TH"/>
                    <property name="com.jaspersoft.studio.table.style.column_header" value="Table 1_CH"/>
                    <property name="com.jaspersoft.studio.table.style.detail" value="Table 1_TD"/>
                    <property name="com.jaspersoft.studio.components.autoresize.next" value="true"/>
                    <property name="com.jaspersoft.studio.components.autoresize.proportional" value="true"/>
                </reportElement>
                <jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
                    <datasetRun subDataset="Dataset1" uuid="acaf88bb-ff19-4d07-9e37-cbda2f2104a7">
                        <returnValue fromVariable="rowNumberSum" toVariable="rowNumberSum"/>
                    </datasetRun>
                    <jr:column width="84" uuid="8beb5156-7b6b-451a-a66d-489284355c75">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column1"/>
                        <jr:detailCell style="Table 1_TD" height="30">
                            <property name="com.jaspersoft.studio.layout" value="com.jaspersoft.studio.editor.layout.HorizontalRowLayout"/>
                            <textField>
                                <reportElement x="0" y="0" width="84" height="30" uuid="844ce5da-a2b4-418a-a474-be9465b5dd67"/>
                                <textFieldExpression><![CDATA[$F{month}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column width="83" uuid="9e71d9b1-0260-4f14-98c6-5df57e36e6d7">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column2"/>
                        <jr:detailCell style="Table 1_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="83" height="30" uuid="98bb8086-6a7e-47c7-aa09-60c8eb35de83"/>
                                <textFieldExpression><![CDATA[$F{percentage}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                    <jr:column width="33" uuid="d4746c5e-5a70-4a5a-9418-59e664a4e715">
                        <property name="com.jaspersoft.studio.components.table.model.column.name" value="Column3"/>
                        <jr:detailCell style="Table 1_TD" height="30">
                            <textField>
                                <reportElement x="0" y="0" width="33" height="30" uuid="b4329a51-bcc3-4fd0-8f85-1f3e5a614719"/>
                                <textFieldExpression><![CDATA[$V{rowNumberSum}]]></textFieldExpression>
                            </textField>
                        </jr:detailCell>
                    </jr:column>
                </jr:table>
            </componentElement>
        </band>
    </summary>
</jasperReport>
 

这是我的主要报告的代码:

    <?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.10.0.final using JasperReports Library version 6.10.0-unknown  -->
<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="main report" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="f8bbb1cf-82a2-4390-8cd9-72d0a34c4ead">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="FeaturesAnalyzedAndReviewedIn12MonthsAdapter"/>
    <queryString language="JSON">
        <![CDATA[]]>
    </queryString>
    <field name="month" class="java.lang.String">
        <property name="net.sf.jasperreports.json.field.expression" value="month"/>
        <fieldDescription><![CDATA[month]]></fieldDescription>
    </field>
    <field name="percentage" class="java.math.BigDecimal">
        <property name="net.sf.jasperreports.json.field.expression" value="percentage"/>
        <fieldDescription><![CDATA[percentage]]></fieldDescription>
    </field>
    <variable name="rowNumberSum" class="java.lang.Integer" resetType="None"/>
    <variable name="Variable_1" class="java.lang.Integer" resetType="None">
        <variableExpression><![CDATA[$V{rowNumberSum}]]></variableExpression>
    </variable>
    <summary>
        <band height="300" splitType="Stretch">
            <textField evaluationTime="Band">
                <reportElement x="404" y="199" width="100" height="30" uuid="ce192097-9d0e-484b-917b-371b2f1e7bdd"/>
                <textFieldExpression><![CDATA["VAlue returned from Sub-Report: "+$V{rowNumberSum}]]></textFieldExpression>
            </textField>
            <subreport isUsingCache="true" runToBottom="true" overflowType="NoStretch">
                <reportElement x="0" y="0" width="300" height="300" uuid="65b11cd3-98b7-4a13-9313-daa21e5a4bac">
                    <printWhenExpression><![CDATA[$V{rowNumberSum}==null]]></printWhenExpression>
                </reportElement>
                <parametersMapExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}]]></parametersMapExpression>
                <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
                <returnValue subreportVariable="rowNumberSum" toVariable="rowNumberSum"/>
                <subreportExpression><![CDATA["Blank_A4.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </summary>
</jasperReport>

这是我当前的主报告输出,没有使用print when 表达式
输出时不打印

使用print when 表达式时的输出

使用打印时输出

我想达到什么目标?
每当Sub-Report 1返回的值为1 时,我希望主报告隐藏Sub-Report 1。我该如何做到这一点?

标签: jasper-reportssubreport

解决方案


很抱歉有很多地方可以获取有关 Scriptlet 的信息:

最后一篇讨论了如何在 scriptlet 中获取 DATBASE_CONNECTION。根据您运行它的方式(Jasper Server、Spring 或其他框架),您应该有其他可用于注入的方法。

无论如何,这是一个我必须编写的示例 scriptlet,因为我们的数据库实现没有 RANK():

public class GroupTopNCounterScriptlet extends JRDefaultScriptlet {

    public static final String GROUP_COUNT_VAR = "GroupTopN_COUNT";
    public static final String TOP_N_TOTAL = "TopNCountTotal";
    
    int topNTotalCounter = 0;
    
    @Override
    public void beforeGroupInit(String groupName) throws JRScriptletException {
        Integer groupCount = (Integer) getVariableValue(GROUP_COUNT_VAR);
        topNTotalCounter += (groupCount == null) ? 0 : groupCount;
        setVariableValue(TOP_N_TOTAL, topNTotalCounter);
    }   
}

尽管您可能想更多地担心beforeDetailEval您需要在哪里:

  1. 获取DATABSE_CONNECTION
  2. 查询一些东西,要么:
  • 可用于计算和传递到列表的完整数据集。
  • 只返回计数的查询,因此您可以设置 printWhen
  1. 设置您选择的变量或参数
  2. 相应地更新您printWhenExpressionDatasource

推荐阅读