jasper-reports - 使用 Jasper Studio 根据返回的值隐藏子报表
问题描述
我正在编写一份报告,其中的情况如下:
我从Sub-Report 1到 Main Report中获得了Col 3 & Row 1的值。现在,如果它返回的值为 1,我想隐藏子报表1。我尝试这样做的方式如下:
- 使用Jasper Studio 中的编辑返回值选项获取主报告中的值。
$V{rowNumberSum}==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。我该如何做到这一点?
解决方案
很抱歉有很多地方可以获取有关 Scriptlet 的信息:
- https://community.jaspersoft.com/blog/all-you-want-know-about-scriptlets
- http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JRDefaultScriptlet.html
- https://community.jaspersoft.com/questions/1084351/scriptlets-getting-connection-jdbc-jasper-studio-java-class
最后一篇讨论了如何在 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
您需要在哪里:
- 获取
DATABSE_CONNECTION
- 查询一些东西,要么:
- 可用于计算和传递到列表的完整数据集。
- 只返回计数的查询,因此您可以设置 printWhen
- 设置您选择的变量或参数
- 相应地更新您
printWhenExpression
的Datasource
推荐阅读
- python - 如果按顺序构建模型,是否需要 tensorflow shuffle 和 batch?
- android - java.lang.String com.google.firebase.auth.FirebaseUser.getEmail()' 在空对象引用上
- python - str 和 int 的实例之间不支持类型错误“<”
- android - 广播接收器的触发时间比应有的时间晚
- html - 无法在 HTML 中使用 CSS
- linux - 通过bash脚本运行时psql列名不存在
- python - 在 Apache Zeppelin 上运行独立的 python 脚本
- mysql - 与 MySQL 的远程 SSH 连接未侦听端口 3306
- c# - 有没有办法在 ASP.NET MVC Core 中使用实体上下文?
- c - 为什么我的链表冒泡排序功能有时会输出错误的结果,而有时似乎是一个无限循环?