Требуется нулевое значение параметра JasperReports, чтобы показать все

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

У меня есть отчет по 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 ответа

Решение

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

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

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

Ну, я попытался немного усерднее и выяснил, как заставить это работать, передав целое предложение 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 будет работать в любом случае, перед AND необходимо использовать пробел, чтобы создать чистый и работающий синтаксис.

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

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

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

Evento. "data_inicio_realizacao" МЕЖДУ $P{data1} И $P{data2}

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

( (Evento."data_inicio_realizacao" >= $P{data1} или $P{data1} равен нулю) или (Evento."data_inicio_realizacao" <= $P{data2} или $P{data2} равен нулю))

Другие вопросы по тегам