【问题标题】:How to render a report band of a jasper report only when a subreport inside the band is not empty?仅当带内的子报表不为空时,如何呈现碧玉报表的报表带?
【发布时间】:2016-01-21 11:40:58
【问题描述】:

我有一个主报表,它在详细信息带中从数据库中查询项目列表,另一个详细信息带包含一个为每条记录呈现一次的子报表。我希望仅当其中的子报表不为空时才呈现第二个详细信息带。

我试图将子报表中的 REPORT_COUNT 获取到返回变量中,并将 Print when expression 参数设置为 $V{SUBREPORT_ITEMS_ROW_COUNT} != null && $V{SUBREPORT_ITEMS_ROW_COUNT} > 0 但看起来返回变量是在渲染波段后计算的,所以它看不到变量,即使它被正确返回。

我还能做什么?

更新 这是主要报告的 JRXML:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.1.0.final using JasperReports Library version 6.1.0  -->
<!-- 2016-01-21T10:03:49 -->
<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="PlanoDeContasDetalhado" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="9fa6ae6c-0db5-4324-a65d-f0d61a8f30bb">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="SCA Banco de dados bagual"/>
    <style name="NIVEL">
        <conditionalStyle>
            <conditionExpression><![CDATA[$F{PLCTA15COD}.trim().length() == 1]]></conditionExpression>
            <style mode="Opaque" backcolor="#CFCFCF" fontSize="15" isBold="true" isItalic="true"/>
        </conditionalStyle>
    </style>
    <parameter name="EMPRICOD" class="java.lang.Integer"/>
    <parameter name="ID_SETOR" class="java.lang.Integer"/>
    <parameter name="CAMPO_DATA" class="java.lang.String"/>
    <parameter name="DATA1" class="java.util.Date"/>
    <parameter name="DATA2" class="java.util.Date"/>
    <parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
        <defaultValueExpression><![CDATA["C:\\Users\\Mateus\\Documents\\NetBeansProjects\\AtualyRelatorios\\jasper\\"]]></defaultValueExpression>
    </parameter>
    <parameter name="CON_ITENS" class="java.sql.Connection" isForPrompting="false"/>
    <queryString>
        <![CDATA[select
plcta15cod,
plcta30codedit,
plcta60descr
from planodecontas
order by plcta15cod]]>
    </queryString>
    <field name="PLCTA15COD" class="java.lang.String"/>
    <field name="PLCTA30CODEDIT" class="java.lang.String"/>
    <field name="PLCTA60DESCR" class="java.lang.String"/>
    <title>
        <band height="82" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="510" height="26" uuid="2fa3702f-ff66-41a6-81e9-7dbbbd791233"/>
                <textElement verticalAlignment="Bottom">
                    <font size="18" isBold="true"/>
                </textElement>
                <text><![CDATA[Detalhamento do plano de contas]]></text>
            </staticText>
            <staticText>
                <reportElement x="0" y="26" width="510" height="15" uuid="f23a5d3d-a05d-4e9c-9053-492e635cde26"/>
                <textElement>
                    <font size="11" isBold="false"/>
                </textElement>
                <text><![CDATA[Receitas & Despesas]]></text>
            </staticText>
        </band>
    </title>
    <detail>
        <band height="18" splitType="Stretch">
            <textField>
                <reportElement style="NIVEL" x="0" y="0" width="80" height="18" uuid="2db15faa-e12e-4fc3-a5ae-956d454e50da"/>
                <textElement verticalAlignment="Middle">
                    <font size="8"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{PLCTA30CODEDIT}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement style="NIVEL" x="80" y="0" width="475" height="18" uuid="bbcbea9e-2b83-4cd5-aa1e-2daea32f33a0"/>
                <textElement verticalAlignment="Middle">
                    <font size="8"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{PLCTA15COD}.trim().replaceAll(".","-")
+ $F{PLCTA15COD}.trim().replaceAll(".","-")
+ $F{PLCTA60DESCR}]]></textFieldExpression>
            </textField>
        </band>
        <band height="4">
            <subreport>
                <reportElement x="-20" y="0" width="595" height="4" uuid="572867ad-8bb8-4664-9ae9-a1120c102430"/>
                <subreportParameter name="EMPRICOD">
                    <subreportParameterExpression><![CDATA[$P{EMPRICOD}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="ID_SETOR">
                    <subreportParameterExpression><![CDATA[$P{ID_SETOR}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="CAMPO_DATA">
                    <subreportParameterExpression><![CDATA[$P{CAMPO_DATA}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="DATA1">
                    <subreportParameterExpression><![CDATA[$P{DATA1}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="DATA2">
                    <subreportParameterExpression><![CDATA[$P{DATA2}]]></subreportParameterExpression>
                </subreportParameter>
                <subreportParameter name="PLCTA15COD">
                    <subreportParameterExpression><![CDATA[$F{PLCTA15COD}]]></subreportParameterExpression>
                </subreportParameter>
                <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
                <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "PlanoDeContasDetalhadoItens.jasper"]]></subreportExpression>
            </subreport>
        </band>
    </detail>
</jasperReport>

【问题讨论】:

  • 您使用的是哪种数据源?您是否在详细信息带或只有子报告中有其他元素(不应该呈现)?你能用一些 jrxml 给一个简短的minimal reproducible example 吗?
  • SQL 数据源。子报表带中没有其他元素,只有子报表。将使用主要报告 JRXML 更新问题
  • AFIK,在子报表中实际执行查询之前,您无法获得信息(由于已经创建了 4px 详细信息,因此为时已晚)。您的解决方法可以是(如果子报表中有记录,则在主报表中创建一个包含信息的字段,加入子报表查询表)或使 detailband 仅 1px 并使用它...
  • 是的,正如我所想,我想我将不得不使用 1px 乐队。谢谢。
  • 您可以加载 JasperPrint(在您填充之后),然后移除 1px 带...但是要知道您需要移动下面的所有其他组件...看起来有点矫枉过正,移动子报告到您的其他乐队并与之共处....

标签: java jasper-reports


【解决方案1】:

您是否正在尝试创建主从报表?如果是(我不知道我是否误解了你的问题,但这是我的答案):我曾经将子报表放在同一个频段(详细),并将主参数传递给子报表,进入子报表查询将使用它,所以如果主参数没有出现在主查询中,它不会在子报表中显示任何内容。 我希望这对你有用。

【讨论】:

  • 感谢超级马里奥,这样子报表将不会显示,但子报表所在的主报表上的乐队仍然可见,这就是我试图避免的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多