Подотчет повторяется в полосе Detail

Я новичок в JasperReports, в основном я хочу поместить подотчет в основной отчет.

Проблема в том, что я помещаю вложенный отчет в полосу «Подробности», поэтому, когда я запрашиваю базу данных с несколькими данными, вложенный отчет всегда будет повторяться несколько раз, когда я вывожу отчет в pdf. Мне нужен отчет, который не повторяется независимо от того, сколько данных у меня есть в базе данных, к которой я подключаюсь.

Я искал в Интернете, и решения должны добавить

new Boolean($V{REPORT_COUNT}.intValue()==1)

в атрибуте print when expression подотчета, который решает часть моей проблемы из-за того, что теперь мой подотчет печатается только один раз, но все еще оставляет несколько пустых страниц после отображения моего подотчета

Поэтому я предполагаю, что он все еще повторяется, но просто не печатает данные из-за выражения, которое я добавил, люди говорят, что природа полосы подробностей должна работать таким образом, и что я не должен помещать подотчет в группа деталей, но если я помещу ее в какую-то другую группу, я получу эту ошибку:

Error filling print... Subreport overflowed on a band that does not support overflow.

Вышеупомянутая ошибка произойдет, если у меня будет много данных, которые могут занимать больше страницы.

Как удалить эти пустые страницы? Если меня попросят не помещать его в группу деталей, что мне делать? или какое решение есть?


person securenova    schedule 18.05.2016    source источник
comment
1) Каждая запись в бэнде Detail повторяется при переборе основного источника данных; 2) Вам следует узнать больше о JasperReports. Руководство JasperReports Ultimate Guide — хорошее начало; 3) На SO много сообщений о JasperReports. Например, этот пост будет вам полезен: Подотчет переполнен на полосе, которая не поддерживает переполнение   -  person Alex K    schedule 18.05.2016
comment
спасибо, сэр, за ваш совет, но я думаю, что знаю, что полоса деталей повторяется во время итерации из БД, поэтому я спрашиваю, есть ли решение, чтобы обойти это, и я также знаю, что проблема переполнения это связано с большими данными, на которые вы любезно дали мне ссылку, я не спрашивал, почему произошла ошибка, я спросил, какие есть решения, и спасибо за то, что вы дали мне руководство с более чем 300 страницами, я надеялся на ответ и если есть на самом деле нет, тогда, может быть, объясните, почему. На самом деле я не думаю, что задал ужасный вопрос, но все равно спасибо, и я найду время, чтобы прочитать руководство.   -  person securenova    schedule 18.05.2016
comment
))) Ок, думаю, лучше выложить образ того, что есть и какой-нибудь образец jrxml для воспроизведения проблемы   -  person Alex K    schedule 18.05.2016
comment
И, конечно же, вы можете добавить подотчет в группу Detail - это юридический иск. Это зависит от задачи, которую вы решаете   -  person Alex K    schedule 18.05.2016
comment
Последняя версия Полного руководства по JasperReports. Ищите обновления в документации | Сообщество Jaspersoft.   -  person ᴠɪɴᴄᴇɴᴛ    schedule 15.08.2017


Ответы (1)


Полоса Detail будет генерироваться столько раз, сколько записей у вас есть в вашем основном наборе данных (заполняется запросом верхнего уровня).

Если вы хотите сохранить вложенный отчет в полосе «Подробности», что, кстати, является нормальным, вы можете сделать одно из следующих действий:

  • либо иметь фиктивный запрос, который возвращает только одну запись, так что бэнд Detail генерируется только один раз. Затем передайте соединение отчета с подотчетом. Возможно, вы уже сделали это. Таким образом, вы можете выполнять свой запрос независимо от основного отчета.
  • или оставьте отчет как есть и добавьте выражение printWhen ($V{REPORT_COUNT}.intValue()==1) непосредственно в полосу сведений, а не в подотчет. Обратите внимание, что это всего лишь уродливый хак, который может повлиять на производительность отчета. Ваш основной запрос по-прежнему возвращает много данных, которые вы не используете, поэтому вам следует рассмотреть другие варианты.

Если вы можете переместить вложенный отчет за пределы полосы «Подробности», поместите его в полосу, допускающую переполнение, например полосу «Заголовок» или «Сводка». Потом:

  • пусть ваш основной запрос dataSet пуст, чтобы не генерировалась полоса Detail
  • установите whenNoDataType="AllSectionsNoDetail" на уровне отчета (в теге <jasperReport>), чтобы генерировались все остальные разделы, кроме Detail
  • точно так же, как в первом варианте выше, передайте соединение отчета с вашим подотчетом и работайте оттуда
person Narcis    schedule 18.05.2016
comment
Я решил свою проблему благодаря вашему первому решению. Мои отчеты повторялись x раз, потому что мой основной запрос набора данных возвращал x объем данных, я изменил SQL-запрос моего основного отчета, чтобы он возвращал одну запись данных, и, как вы сказали, полоса сведений появлялась один раз. Мой дополнительный отчет был точно таким же, поэтому, в конце концов, единственное, что я сделал, это изменил запрос в своем основном отчете, чтобы он возвращал одну запись, и результат был тем, что я хотел, сработало как шарм, большое спасибо. Вы хорошо объяснили и другие методы, и я буду рад их попробовать, большое спасибо! - person securenova; 18.05.2016
comment
Я пробовал 2-й метод, и он тоже работает, преимущество в том, что мне не нужно заставлять себя придумывать фиктивный запрос для основного набора запросов, недостаток может быть таким же, как вы сказали, что это производительность, если производительность не так уж плоха, чего я не чувствую сейчас (пока не слишком много данных), возможно, это решение тоже неплохое. - person securenova; 19.05.2016