Как получить данные, имеющие значения в диапазоне, используя предложение «between» в запросе отчета?

jasper-reports

#jasper-отчеты

Вопрос:

У меня есть два параметра в запросе, выполненном для отчета JasperReports.

Что-то вроде этого:

 select * from customer where custid between $P{param1} and $P!{param2}
 

Как я могу распечатать все идентификаторы клиентов, которые входят в параметр?
Итак, предположим, я ввел идентификатор cust 1 в paramid1 и 10 в paramid2.
Теперь сгенерированные данные будут содержать все идентификаторы от 1 до 10.
Мне нужно распечатать эти идентификаторы.

Я не могу использовать поле, поскольку один идентификатор клиента связан с несколькими элементами.

Комментарии:

1. I can't use field since one customer id is associated with mutiple items. — Вы также можете посмотреть на $X{IN} выражение

Ответ №1:

Вы можете использовать $X{BETWEEN, <column_name>, <left_parameter_name>, <right_parameter_name>} выражение для получения значений в некотором диапазоне.

Пример

Шаблон отчета

Для построения этого отчета я использовал шаблон данных «Sample DB» от Jaspersoft Studio (JSS).

 <?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="Between usage example" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="Sample DB"/>
    <parameter name="minId" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[10248]]></defaultValueExpression>
    </parameter>
    <parameter name="maxId" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[10260]]></defaultValueExpression>
    </parameter>
    <queryString language="SQL">
        <![CDATA[SELECT shipcity, orderid FROM orders WHERE $X{BETWEEN, orderid, minId, maxId} ORDER BY orderid]]>
    </queryString>
    <field name="shipcity" class="java.lang.String"/>
    <field name="orderid" class="java.lang.Integer"/>
    <columnHeader>
        <band height="30" splitType="Stretch">
            <staticText>
                <reportElement x="0" y="0" width="278" height="30"/>
                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                <text><![CDATA[CIty]]></text>
            </staticText>
            <staticText>
                <reportElement x="278" y="0" width="277" height="30"/>
                <textElement textAlignment="Center" verticalAlignment="Middle"/>
                <text><![CDATA[Order Id]]></text>
            </staticText>
        </band>
    </columnHeader>
    <detail>
        <band height="30" splitType="Stretch">
            <textField>
                <reportElement x="0" y="0" width="278" height="30"/>
                <textFieldExpression><![CDATA[$F{shipcity}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="278" y="0" width="277" height="30"/>
                <textFieldExpression><![CDATA[$F{orderid}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>
 

В этом примере элементы с orderid меньше значения maxId параметра и больше значения minId параметра извлекаются из базы данных.

Сгенерированный вывод

Сгенерированный на выходе JSS будет:

Предварительный просмотр через JSS

Другие выражения

Получить значения в инклюзивном диапазоне

В этом случае выражение будет:

WHERE $X{[BETWEEN], orderid, minId, maxId} minId ≤ orderid ≤ maxId .

Получить значения в исключительном диапазоне

В этом случае выражение будет:

WHERE $X{BETWEEN, orderid, minId, maxId} minId < orderid < maxId .

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

В этом случае выражение будет:

WHERE $X{[BETWEEN, orderid, minId, maxId} minId ≤ orderid < maxId .

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

В этом случае выражение будет:

WHERE $X{BETWEEN], orderid, minId, maxId} minId < orderid ≤ maxId .

Получить значения, меньшие или равные

В этом случае выражение будет:

WHERE $X{LESS], orderid, maxId} orderid ≤ maxId .

Получить значения меньше

В этом случае выражение будет:

WHERE $X{LESS, orderid, maxId} orderid < maxId .

Получить значения, большие или равные

В этом случае выражение будет:

WHERE $X{[GREATER, orderid, minId} orderid ≥ minId .

Получить значения, превышающие

В этом случае выражение будет:

WHERE $X{GREATER, orderid, minId} orderid > minId .

Дополнительная информация

Более подробную информацию о синтаксисе запроса можно найти здесь