【问题标题】:Is there a way to access the SQL query results in a text field expression to conditionally display it in title band?有没有办法在文本字段表达式中访问 SQL 查询结果以有条件地在标题带中显示它?
【发布时间】:2019-02-05 23:33:28
【问题描述】:

我想根据在详细信息带中的一条记录中检索到的某些值的存在,有条件地在标题带中显示一个文本字段。

有没有一种方法可以让我从表达式编辑器中访问数据集结果列表,以便循环遍历结果列表并验证该特定值是否存在?

【问题讨论】:

    标签: jasper-reports conditional datasource textfield


    【解决方案1】:

    我会通过使用变量然后在文本字段上计算时间来解决这个问题。

    首先定义一个验证该特定值是否存在的变量,例如通过计算它出现的次数。

    <variable name="SERIES_D_COUNT" class="java.lang.Integer" calculation="Sum">
       <variableExpression><![CDATA["D".equals($F{Series})?1:0]]></variableExpression>
    </variable>
    

    然后设置上有条件地显示一个文本字段evaluationTime="Report"

    来自JasperReports api

    一个常量,指定一个表达式应该在 填充过程结束。

    请注意,您可以使用printWhenExpression 这没有延迟评估。如果您不喜欢显示任何需要的文本,请使用类似的表达式

    <textField evaluationTime="Report">
        <reportElement x="0" y="0" width="200" height="30" uuid="c5ce6914-e96a-4b7a-bcd9-b9febfb4d003"/>
        <textFieldExpression><![CDATA[($V{SERIES_D_COUNT}>0? "Series D is present " + $V{SERIES_D_COUNT} + " times":"")]]></textFieldExpression>
    </textField>
    

    如果您需要“浮动”布局,因此如果值存在,则应移动不同的 textField 不能使用此技术,因为填充管理器需要保留位置,只有在报告后评估内容(表达式)填充。在这些情况下,您需要执行子报表,例如重新查询数据库。

    完整示例

    <?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="TestAccessValue" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4d3c7e04-2b50-46a0-b840-05ab72633357">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="ChartData"/>
        <queryString>
            <![CDATA[]]>
        </queryString>
        <field name="Series" class="java.lang.String"/>
        <field name="X" class="java.lang.String"/>
        <variable name="SERIES_D_COUNT" class="java.lang.Integer" calculation="Sum">
            <variableExpression><![CDATA["D".equals($F{Series})?1:0]]></variableExpression>
        </variable>
        <title>
            <band height="35" splitType="Stretch">
                <textField evaluationTime="Report">
                    <reportElement x="0" y="0" width="200" height="30" uuid="c5ce6914-e96a-4b7a-bcd9-b9febfb4d003"/>
                    <textFieldExpression><![CDATA[($V{SERIES_D_COUNT}>0? "Series D is present " + $V{SERIES_D_COUNT} + " times":"")]]></textFieldExpression>
                </textField>
            </band>
        </title>
        <columnHeader>
            <band height="24" splitType="Stretch">
                <staticText>
                    <reportElement x="0" y="0" width="100" height="20" uuid="8ff3bf66-0530-47d1-bd9e-c8cd392b418d"/>
                    <text><![CDATA[Series]]></text>
                </staticText>
                <staticText>
                    <reportElement x="100" y="0" width="100" height="20" uuid="b6e5470d-fcd8-4770-8dc4-bd194f05e15b"/>
                    <text><![CDATA[X]]></text>
                </staticText>
            </band>
        </columnHeader>
        <detail>
            <band height="24" splitType="Stretch">
                <textField>
                    <reportElement x="0" y="0" width="100" height="20" uuid="f50e1756-50da-40a3-89f3-7a906659feb1"/>
                    <textFieldExpression><![CDATA[$F{Series}]]></textFieldExpression>
                </textField>
                <textField>
                    <reportElement x="100" y="0" width="100" height="20" uuid="7adb0ce7-3bf5-42ed-b41d-2daee9ee52df"/>
                    <textFieldExpression><![CDATA[$F{X}]]></textFieldExpression>
                </textField>
            </band>
        </detail>
    </jasperReport>
    

    【讨论】:

      猜你喜欢
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多