Как передать параметр типа массив / коллекция в Jaspersoft Studio и использовать его при запросе? - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь передать в качестве параметра массив значений для получения отчета из моего DW, используя предложение "IN".

Проблема в том, что, когда я устанавливаю параметр как «Массив» или «Коллекция», он не запрашивает на экране предварительного просмотра Jaspersoft Studio, и я не могу его использовать.

В первый раз я попытался передать параметр в виде строки, где $ P {convio} была строкой, переданной для завершения "IN":

//Select and joins here...
WHERE ("o"."status_operacao" IN ('EFETUADO', 'SUSPENSO'))
  AND ("c"."codigo" IN ( $P{convenio}))
  AND ("o"."codigo_produto" = 1)

Не сработало, возвращая ошибку "отсутствует EOF в ')'", но ошибки закрытия нет.

В последнем варианте использовался $ X {}, поэтому я установил de $ P {venio} в качестве типа Array / Collection и повернул запрос следующим образом:

//Select and joins here...
WHERE ("o"."status_operacao" IN ('EFETUADO', 'SUSPENSO'))
  AND ($X{IN, "c"."codigo", convenio})
  AND ("o"."codigo_produto" = 1)

Но теперь параметр не подсказывает, и отчет приносит мне все.

1 Ответ

0 голосов
/ 13 мая 2019

JasperReports движок поддерживает вложенные типы - мы можем использовать типизированные коллекции.

Показать коллекцию в JSS - используя диалог для установки значения

Например, мы можем объявить параметр типа Коллекция следующим образом:

<parameter name="collectionParam" class="java.util.Collection" nestedType="java.lang.Long"/>

Smallпример отчета с типом Collection:

<?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="Blank_A4_2" pageWidth="595" pageHeight="842" whenNoDataType="AllSectionsNoDetail" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <parameter name="collectionParam" class="java.util.Collection" nestedType="java.lang.Long"/>
    <title>
        <band height="30" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="550" height="30"/>
                <textFieldExpression><![CDATA[$P{collectionParam} != null && !$P{collectionParam}.isEmpty() ? $P{collectionParam}.toArray()[0] : "empty"]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

Мы можем инициализировать коллекцию в Jaspersoft Studio ( JSS ) следующим образом:

1-й шаг -диалоговое окно параметров вызова:

Set parameter at JSS

2-й шаг - добавление элемента в Collection :

Add new element at JSS

Мы можем проверить (построить) отчет с помощью действия Preview:

Preview at JSS

- в результате мы показываемпервый элемент Collection с помощью выражения:

<textFieldExpression><![CDATA[$P{collectionParam} != null && !$P{collectionParam}.isEmpty() ? $P{collectionParam}.toArray()[0] : "empty"]]></textFieldExpression>

Инициализация параметра типа Collection с использованием выражения по умолчанию

Мы можем инициализировать параметр Collection введите с помощью defaultValueExpression и, например, java.util.Arrays.asList () метод:

<parameter name="collectionParam" class="java.util.Collection">
    <defaultValueExpression><![CDATA[java.util.Arrays.asList("a", "b", "c")]]></defaultValueExpression>
</parameter>

Использование в запросе

Параметр типа Коллекция может использоваться в запросе с помощью выражения $X{IN, <column_name>, <parameter_name>}.

Пример:

<parameter name="param" class="java.util.Collection">
    <defaultValueExpression><![CDATA[java.util.Arrays.asList("val")]]></defaultValueExpression>
</parameter>
<queryString>
    <![CDATA[SELECT * FROM table_name c WHERE $X{IN, c.attr, param}
</queryString>

Это выражение будет преобразовано во время выполнения механизмом JasperReports в запрос, подобный следующему:

SELECT * FROM table_name c WHERE c.attr IN ('val')

Мы также можем использовать параметр типа String при запросе всопряжение с оператором IN с использованием выражения $P!{}.

Пример:

<parameter name="param" class="java.lang.String">
    <defaultValueExpression><![CDATA["'val1', 'val2'"]]></defaultValueExpression>
</parameter>
<queryString>
    <![CDATA[SELECT * FROM table_name c WHERE c.attr2 IN ($P!{param})
</queryString>

Это выражение будет преобразовано во время выполнения на JasperReports движок в запрос, как это:

SELECT * FROM table_name c WHERE c.attr2 IN ('val1', 'val2')
...