Требуется нулевое значение параметра 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} равен нулю))