Я пытаюсь сгруппировать данные в 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>