Как я могу узнать, оценивает ли Джаспер сводную полосу? - PullRequest
1 голос
/ 08 марта 2019

У меня есть нижний колонтитул с номером страницы и конфиденциальный отказ от ответственности. Мне нужно скрыть конфиденциальный отказ от ответственности в сводных страницах, но мне нужен номер страницы как есть.

Я добавил isSummaryNewPage="true" and isSummaryWithPageHeaderAndFooter="true" в отчет.

Есть ли флажок, чтобы проверить, является ли страница сводной страницей или страницей подробностей внутри <printWhenExpression> </printWhenExpression> или <textFieldExpression> </textFieldExpression>?

1 Ответ

2 голосов
/ 08 марта 2019

AFIK Нет встроенного свойства, которое сообщит вам, что вы находитесь в сводной полосе.

Однако я думаю, что это тот случай, когда вы можете безопасно использовать то, что я называю "решение для взлома параметров, если сводная полоса находится на нескольких страницах или по какой-либо другой причине вам не нравится использовать полосу lastPageFooter.

Решение для взлома параметров

  1. Добавьте параметр, который является java.util.Set (вы также можете использовать List, Map или другие подобные классы).Создайте его с пустым HashSet.

    <parameter name="paramHack" class="java.util.Set">
        <defaultValueExpression><![CDATA[new java.util.HashSet()]]> </defaultValueExpression>
    </parameter>
    
  2. В textField (в вашем случае сначала на итоговой полосе) добавьте ключ к нему в printWhenExpression, будьте осторожны сВыражение может быть оценено более одного раза, поэтому всегда проверяйте, что оно возвращает true.

    <printWhenExpression><![CDATA[$P{paramHack}.add("summary") || true]]></printWhenExpression>
    
  3. Теперь вы можете использовать $P{paramHack}.contains("summary"), чтобы узнать, был ли вычислен textField, следовательно, в случаечтобы узнать, приехали ли мы в сводную группу и не печатать «конфиденциальный отказ от ответственности».

    <printWhenExpression><![CDATA[!$P{paramHack}.contains("summary")]]></printWhenExpression>
    

Пример

jrxml

<?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="WhenSummary" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" isSummaryNewPage="true" isSummaryWithPageHeaderAndFooter="true" uuid="bbec9a5c-d9fc-4e29-b2b0-cea6d7a50394">
    <parameter name="paramHack" class="java.util.Set">
        <defaultValueExpression><![CDATA[new java.util.HashSet()]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <pageHeader>
        <band height="35" splitType="Stretch"/>
    </pageHeader>
    <detail>
        <band height="40">
            <staticText>
                <reportElement x="0" y="0" width="545" height="40" uuid="74f6c3de-9867-4895-b7bb-c9cdb124fbdc"/>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font size="26"/>
                </textElement>
                <text><![CDATA[First just an empty page]]></text>
            </staticText>
        </band>
    </detail>
    <pageFooter>
        <band height="40" splitType="Stretch">
            <textField>
                <reportElement x="50" y="0" width="440" height="40" uuid="af5f6f4c-fe77-4f07-a080-035230123f50">
                    <printWhenExpression><![CDATA[!$P{paramHack}.contains("summary")]]></printWhenExpression>
                </reportElement>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font size="26"/>
                </textElement>
                <textFieldExpression><![CDATA["Confidential"]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="493" y="0" width="60" height="40" uuid="78b7b8bd-4189-42ea-8120-5a09a8b5701c"/>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font size="22"/>
                </textElement>
                <textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
            </textField>
        </band>
    </pageFooter>
    <summary>
        <band height="40" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="545" height="40" uuid="9ee45216-e7e1-4e5a-bbed-1f057ade1967">
                    <printWhenExpression><![CDATA[$P{paramHack}.add("summary") || true]]></printWhenExpression>
                </reportElement>
                <textElement textAlignment="Center" verticalAlignment="Middle">
                    <font size="26"/>
                </textElement>
                <text><![CDATA[Summary page]]></text>
            </staticText>
        </band>
    </summary>
</jasperReport>

Вывод

result


Если вам также нравится использовать это решение для сводки pageHeader(который начинается до итога, но после детального диапазона), например, вы можете добавить «поддельную» группу и в нижний колонтитул группы (который оценивается после детального диапазона, но перед заголовком страницы в итоговом диапазоне) добавить еще одно свойство в нашу paramHack параметр detail_end.

<group name="FakeGroup">
    <groupExpression><![CDATA["dummy"]]></groupExpression>
    <groupFooter>
        <band height="1">
            <textField>
                <reportElement x="0" y="0" width="553" height="1" uuid="373fc74e-011a-4f03-9cd4-9d5d9464ab06">
                    <printWhenExpression><![CDATA[$P{paramHack}.add("detail_end") && false]]></printWhenExpression>
                </reportElement>
                <textFieldExpression><![CDATA["Hidden used just to know when detail band ends"]]></textFieldExpression>
            </textField>
        </band>
    </groupFooter>
</group>

Примечание: я использовал другое имя, так как оно будет установлено до pageFooter на последней странице полосы подробностей, поэтому вы не можете использовать одно и то же имя флага для обоих pageFooterи pageHeader.Чтобы уточнить на последней странице детализации полосы в pageFooter, $P{paramHack}.contains("detail_end") равен true, но $P{paramHack}.contains("summary") равен false.

Затем в заголовке страницы используйте этот другой флаг, чтобы определить, показывать лиили не показывать контент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...