Группировка JasperReport на основе переменной - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь сгруппировать данные в JasperReports в отчете на основе рассчитанных данных.

У меня есть набор данных, которые являются действиями. Ниже приведена очень упрощенная настройка данных. Step - это просто порядок по полю (в моих реальных данных это время начала). Символ Phase (здесь он упрощен только до 3, но в действительности больше) указывает, является ли действие отправлением (D), маршрутом (E) или прибытием (A). IdealBlock - это то, что я хочу сгруппировать действия, но в базе данных нет фактического поля. Как вы можете видеть, отправление указывает на новый блок, и все последующие строки имеют тот же номер блока до следующего отправления (фактическая бизнес-логика более сложна).

 Step  Phase  IdealBlock
  1      D        1
  2      E        1
  3      E        1
  4      A        1
  5      D        2
  6      E        2
  7      E        2
  8      A        2

Поскольку реального поля IdealBlock нет, я бы хотел иметь возможность вычислять блоки и иметь нижний колонтитул блока. Я сделал версию отчета, которая использует $F{IdealBlock} для группового выражения заголовка группы и , которая выглядит отлично с ожидаемыми 2 группами.

Однако мои фактические данные не имеют этого поля. Я пытался создать переменную «Блок» для ее расчета:

Initial Value Expression: 1
Variable Expression: $V{Block} + ("D".equalsIgnoreCase($F{Phase}) ? 1 : 0)

Или, если вы предпочитаете JRXML:

    <variable name="Block" class="java.lang.Integer">
        <variableExpression><![CDATA[$V{Block} +
("D".equalsIgnoreCase($F{Phase}) ? 1 : 0)]]></variableExpression>
        <initialValueExpression><![CDATA[0]]></initialValueExpression>
    </variable>

Когда я использую $V{Block} в качестве выражения группы, каждая строка становится отдельной группой . Я ожидал, что он будет работать так же (или почти так же), как когда я использую $F{IdealBlock}.

Вот мне и интересно:

  • Почему? Связано ли это с каким-то жизненным циклом отчета, когда выражение группы вычисляется в другое время, а не когда я думаю? Или результат выражения группы как-то по-разному используется в двух случаях.
  • Есть ли лучший способ вычислить значение на лету?

Вот пример файла JRXML с данными, включенными в часть запроса SELECT. Я использую JasperReports 5.6 и SQL Server 2014, хотя я также попробовал это на JasperReports 6.3 с тем же поведением.

<?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="TestGroupWithVariable" language="groovy" pageWidth="612" pageHeight="792" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="765c6d1b-f59c-42c7-93a2-834625a91271">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <queryString>
        <![CDATA[SELECT 1 as Step, 'D' AS Phase, 1 as IdealBlock
UNION SELECT 2, 'E', 1
UNION SELECT 3, 'E', 1
UNION SELECT 4, 'A', 1
UNION SELECT 5, 'D', 2
UNION SELECT 6, 'E', 2
UNION SELECT 7, 'E', 2
UNION SELECT 8, 'A', 2]]>
    </queryString>
    <field name="Step" class="java.lang.Integer"/>
    <field name="Phase" class="java.lang.String"/>
    <field name="IdealBlock" class="java.lang.Integer"/>
    <variable name="Block" class="java.lang.Integer">
        <variableExpression><![CDATA[$V{Block} +
("D".equalsIgnoreCase($F{Phase}) ? 1 : 0)]]></variableExpression>
        <initialValueExpression><![CDATA[0]]></initialValueExpression>
    </variable>
    <group name="Block">
        <groupExpression><![CDATA[$F{IdealBlock}]]></groupExpression>
        <groupHeader>
            <band height="22">
                <textField>
                    <reportElement x="451" y="0" width="57" height="20" uuid="f4620cd3-77ee-45e8-ad7e-d171e84b45ad"/>
                    <textFieldExpression><![CDATA[$V{Block}]]></textFieldExpression>
                </textField>
                <staticText>
                    <reportElement x="400" y="0" width="51" height="20" uuid="452d3259-ce0d-44d7-9b31-744612dc68f4"/>
                    <text><![CDATA[Block Var]]></text>
                </staticText>
                <line>
                    <reportElement x="0" y="15" width="570" height="1" uuid="e220ec89-82c3-40fb-ba74-a5c55987e810"/>
                    <graphicElement>
                        <pen lineWidth="2.0"/>
                    </graphicElement>
                </line>
                <textField>
                    <reportElement x="51" y="0" width="100" height="20" uuid="3036504c-a816-4692-9bda-d4a35ca62d5a"/>
                    <textFieldExpression><![CDATA[$F{IdealBlock}]]></textFieldExpression>
                </textField>
                <staticText>
                    <reportElement x="0" y="0" width="51" height="20" uuid="a8c7ad92-af7b-4e86-8666-56ca0a91ed71"/>
                    <text><![CDATA[Ideal Blk]]></text>
                </staticText>
            </band>
        </groupHeader>
        <groupFooter>
            <band height="25">
                <textField>
                    <reportElement x="188" y="0" width="100" height="20" uuid="7f7ecb95-3178-467c-b13f-058dfcd122fd"/>
                    <textFieldExpression><![CDATA["END BLK " + $V{Block}]]></textFieldExpression>
                </textField>
                <line>
                    <reportElement x="0" y="0" width="570" height="1" uuid="52270f1e-069c-4684-a546-37acdea2def4"/>
                </line>
            </band>
        </groupFooter>
    </group>
    <detail>
        <band height="25" splitType="Stretch">
            <staticText>
                <reportElement x="110" y="0" width="40" height="20" uuid="02df6d93-4270-4edd-9540-b48a64173a22"/>
                <text><![CDATA[Phase]]></text>
            </staticText>
            <textField>
                <reportElement x="150" y="0" width="70" height="20" uuid="12983d11-44af-4d11-9528-f87794056c8c"/>
                <textFieldExpression><![CDATA[$F{Phase}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="21" y="0" width="30" height="20" uuid="c8ea21cc-b260-4e93-bf1d-3ce293ee63e8"/>
                <text><![CDATA[Step]]></text>
            </staticText>
            <textField>
                <reportElement x="51" y="0" width="54" height="20" uuid="d8e93236-f7a4-48ed-8174-fe2fcb51bcbc"/>
                <textFieldExpression><![CDATA[$F{Step}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="222" y="0" width="62" height="20" uuid="8edc5a1c-120c-4186-bbe6-f5adfc155209"/>
                <text><![CDATA[IdealBlock]]></text>
            </staticText>
            <textField>
                <reportElement x="284" y="0" width="62" height="20" uuid="d6ef4317-9aa2-449e-bb42-35c30ea80a5f"/>
                <textFieldExpression><![CDATA[$F{IdealBlock}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="451" y="2" width="57" height="20" uuid="368be047-58c3-432d-b5bd-ea0653aa5b06"/>
                <textFieldExpression><![CDATA[$V{Block}]]></textFieldExpression>
            </textField>
            <staticText>
                <reportElement x="400" y="2" width="51" height="20" uuid="f70c15a3-be06-4205-abe9-a657620ba700"/>
                <text><![CDATA[Block Var]]></text>
            </staticText>
        </band>
    </detail>
</jasperReport>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...