Требуется нулевое значение параметра JasperReports, чтобы показать все - PullRequest
3 голосов
/ 15 января 2011

Я уже давно сталкиваюсь с этой проблемой и надеюсь, что вы мне поможете.

У меня есть отчет по iReport, и я бы хотел, чтобы отчет был заполнен, даже если некоторые параметры имеют значение null.

Вот что у меня есть

SELECT
    evento."titulo" AS evento_titulo,
    evento."data_inicio_realizacao" AS evento_data_inicio_realizacao,
    evento."data_fim_realizacao" AS evento_data_fim_realizacao,
    evento."id" AS evento_id
FROM
    "public"."evento" evento
WHERE
    evento."id" = $P{eventoid} OR
    evento."data_inicio_realizacao" BETWEEN $P{data1} AND $P{data2}

Я бы хотел, чтобы предложение WHERE было необязательным, т.е. если я оставлю эти параметры пустыми (или 0-значными в случае идентификатора), я хочу получить все значения вместо пустого отчета.

Возможно ли это? Я обнаружил, что некоторые люди делают $ P {WHERE_CLAUSE} и передают предложение целого where в качестве значения, но у меня это не сработало.

Ответы [ 3 ]

6 голосов
/ 20 июля 2012

Вы можете сделать это вместо динамического SQL, который вы делаете сейчас ...

select xxx
from <table>
where $P{eventoid} is null or evento."id" = $P{eventoid}

Извините за ответ на такой старый пост ...

2 голосов
/ 19 января 2011

Ну, я попытался немного усерднее и выяснил, как заставить это работать, передав весь пункт WHERE в параметре $ P {}.

Я просто удалил предложение WHERE целиком и добавил:

$P!{whereClause}

Я поместил туда один параметр и удалил из отчета три параметра $ P {eventoid}, $ P {data1} и $ P {data2}.

Я работаю над Spring MVC и внутри моего класса Controller, в соответствии с отображением запроса POST для этой страницы, я добавил переменную String с именем whereClause и установил ее значение равным "WHERE 1 = 1" (или true, если вы предпочитаете ):

String whereClause = "WHERE 1=1";

if (relIndice.getEventoId() != 0) {
    whereClause += " AND evento.id = " + relIndice.getEventoId().toString();
}

if (relIndice.getData1() != null) {
    whereClause += " AND evento.data_inicio_realizacao >= '" + relIndice.getData1().toString() + "'";
}

if (relIndice.getData2() != null) {
whereClause += " AND evento.data_inicio_realizacao <= '" + relIndice.getData2().toString() + "'";
}

whereClause += " ORDER BY evento.data_inicio_realizacao";

После установки начального значения для переменной whereClause я сделал 3 оператора IF, каждое для одного из полей, которые я хочу включить в оператор WHERE, в SQL.

Поскольку "WHERE 1 = 1 будет работать в любом случае", перед пробелом И требуется пробел, чтобы создать чистый и работающий синтаксис.

И, наконец, я добавил предложение ORDER BY, которое будет выполняться в любом случае. И все, значения ваших параметров будут теми значениями, которые вы получите от получателей, которые вы хотите использовать.

В моем случае я могу оставить любые значения равными нулю или нулю (в случае eventoId, поскольку это int), и у меня будут все записи из этой таблицы, так как инструкция SELECT не увидит предложение WHERE ... Coz его не существует!

Спасибо, ребята!

0 голосов
/ 18 января 2011

evento. "Data_inicio_realizacao" МЕЖДУ $ P {data1} И $ P {data2}

попробуйте заменить на это

((evento. "Data_inicio_realizacao">= $ P {data1} или $ P {data1} равно нулю) или (даже. "Data_inicio_realizacao" <= $ P {data2} или $ P {data2} равно нулю)) </p>

...