«Свертывание» групп в Jaspersoft iReport

У меня есть отчет о прибылях и убытках, который в настоящее время имеет три уровня группировки: 1. Аптека 2. Клиент 3. Тип упаковки

Я настроил отчет, чтобы пользователь мог указать значения для аптеки, клиента и типа упаковки. Детальная полоса отображает такие показатели, как доход и маржа. Выбор значения по умолчанию для аптеки, клиента или типа упаковки возвращает все значения в группе.

Мне интересно - есть ли способ, если пользователь выбирает параметр «использовать по умолчанию» для параметра, чтобы iReport свернул группировку? Прямо сейчас, если я выберу аптеку и клиента, но использую тип упаковки по умолчанию, я все равно получу детальную полосу для каждого из нескольких типов упаковки. Как я могу сказать iReport для суммирования по ВСЕМ типам упаковки? Или, если клиент не указан, сумма на ВСЕХ клиентов для данной аптеки? Или я мог сделать это в запросе? У меня есть база данных Oracle, и я использую iReport Professional 4.5.1.

Спасибо, Лиза

ДОБАВЛЕНО ДОБАВИТЬ КОД:

 SELECT
      FAC.FILL_MONTH AS FILL_MO,
      FAC.PHAR_CODE AS PHAR_CODE,
      FAC.FAC_ID AS FAC_ID,
      FAC.PACKTYPE_CODE AS PACKTYPE,
      SUM(FAC.TOT_RXCOUNT_NUM) AS RX_COUNT,
      SUM(FAC.TOT_REVENUE_AMT) AS REVENUE,
      SUM(FAC.TOT_COGS_AMT) AS COGS,
      SUM(FAC.TOT_MARGIN_AMT) AS MARGIN
 FROM
      MySchema.Table FAC
 WHERE
      FAC.FILL_MONTH BETWEEN $P{startdate} AND $P{enddate}
      AND $X{IN, FAC.PHAR_CODE, pharmacy}
      AND $X{IN, FAC.FAC_ID, facility}
      AND $X{IN, FAC.PACKTYPE_CODE, packtype}
 GROUP BY
      FAC.PHAR_CODE,
      FAC.FAC_ID,
      FAC.PACKTYPE_CODE,
      FAC.FILL_MONTH
 ORDER BY
      PHAR_CODE ASC,
      FAC_ID ASC,
      PACKTYPE ASC,
      FILL_MO ASC
 mdahlman10 июн. 2012 г., 17:48
Разместите свой SQL (или его упрощенную версию). Должно быть возможно использовать параметры, чтобы получить то, что вам нужно.
 Lisa11 июн. 2012 г., 13:56
Спасибо! Я опубликовал упрощенную версию своего кода.

Ответы на вопрос(2)

Решение Вопроса

чтобы получить именно те необработанные данные, которые вам нужны. Но вам нужно изменить его, чтобы заставитьPACKTYPE (и другие поля) для группирования по-разному в особом случае, когда пользователь указывает нетPACKTYPE.

Создать новый параметр$P{PACKTYPE_SELECT_SQL}. Его значение по умолчанию напрямую зависит от значения вашего существующего параметра$P{packtype}. (Это означает$P{packtype} должен появляться первым в .jrxml.) Установите$P{PACKTYPE_SELECT_SQL}начение по умолчанию для @ примерно так:

$P{packtype}==null ? " 'All Package Types' " : " FAC.PACKTYPE_CODE "

Затем измените SQL-запрос следующим образом (изменяется только одна строка, остальное только для контекста):

SELECT
     FAC.FILL_MONTH AS FILL_MO,
     FAC.PHAR_CODE AS PHAR_CODE,
     FAC.FAC_ID AS FAC_ID,
     $P!{PACKTYPE_SELECT_SQL} AS PACKTYPE,
...
WHERE
     FAC.FILL_MONTH BETWEEN $P{startdate} AND $P{enddate}
     AND $X{IN, FAC.PHAR_CODE, pharmacy}
     AND $X{IN, FAC.FAC_ID, facility}
     AND $X{IN, FAC.PACKTYPE_CODE, packtype}

В случае, когда$P{packtype} не равно NULL, тогда сгенерированный SQL будет точно таким, каким он был раньше Но в случае, когда$P{packtype} равно нулю, теперь вместо PACKTYPE_CODE вы получите жестко запрограммированную строку.

Вероятно, ваш отчет группируется наPACKTYPE. Таким образом, вы сможете оставить макет и группировку в отчете без изменений.

Вы можете представить такие варианты, как добавление логического элемента управления вводом, чтобы явно позволить пользователю выбирать, сохранять ли PACKTYPE в отчете или нет. Но эта основная идея должна дать вам то, что вам нужно.

 Tom18 июн. 2012 г., 15:55
Очень интересно. Я никогда не делал этого раньше. Очень креативное решение.
 Lisa11 июн. 2012 г., 19:24
Это прекрасно работает. Большое вам спасибо за вашу помощь! Я не думал об определении другого параметра, чтобы использовать $ P! по тому пути. Я вижу, как часто использую это.
 mdahlman25 июн. 2012 г., 22:14
Проблема с содержимым каскадных списков управления вводом? Или с содержанием отчета? (или оба?) Я бы начал с печати содержимого всех параметров в заголовке, чтобы точно определить, где начинается проблема.
 Lisa25 июн. 2012 г., 22:04
Мэтью, я развернул это на JasperServer и установил каскадные элементы управления вводом для значений средства и типа пакета. Это работает в iReport, но не в JasperServer. Ни один из элементов управления вводом не является обязательным, и в JasperServer я снял флажок «всегда подсказывать». Когда отчет открывается впервые, он сворачивает группы, как и положено, но из элементов управления вводом, если я выбираю только аптеку и не выбираю другие элементы управления вводом, отображаются все элементы других элементов управления вводом, например параметры _select_sql игнорируются. Любые мысли о том, что я могу сделать, чтобы это исправить? Еще раз спасибо.
 Lisa26 июн. 2012 г., 19:02
Спасибо за совет! Когда я впервые открывал его, отчет выдавал нулевые значения, но отправка пустых элементов управления вводом приводила к пустым спискам. Я использую переменные коллекции. Я отредактировал свои параметры для обработки как нулевых значений, так и пустых списков, и теперь он работает отлично. Я опубликую более подробное объяснение вопроса, который я создал специально для этой проблемы.

не видя вашего запроса, но я могу привести некоторый мой код в качестве примера. В этом конкретном отчете о яшме я отображаю значения, основанные на указанных пользователем PGM_NAME и USER_NAME. Однако указывать эти параметры необязательно. Если параметр не указан, по умолчанию создается отчет для всех PGM_NAME и / или USER_NAME. В моем запросе ireport предложение WHERE имеет следующие строки:

WHERE   ($P{PGM_NAME} IS NULL OR job.pgm_name = $P{PGM_NAME})
AND     ($P{USER_NAME} IS NULL OR details.username = $P{USER_NAME})

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

 Lisa05 июн. 2012 г., 17:17
Pharmacy, customer и тип упаковки - все переменные типа java.util.collection, и в предложении where моего запроса я устанавливаю параметры с помощью $ X, например, $ X {IN, PHARMACIES, pharmacy}. Таким образом, ваш ответ заставил меня понять, что когда я использую значение по умолчанию для типа аптека / клиент / упаковка, он возвращает каждое значение для каждого из них. Я не хочу отдельного значения для каждого, я хочу совокупность групп. Мне просто нужно выяснить, как сказать iReport.
 Lisa05 июн. 2012 г., 20:34
Похоже, мы можем указать больше данных (используя $ X {..., чтобы получить каждый тип упаковки для данного клиента, или только один тип, или несколько типов), но не похоже, что мы можем манипулировать количеством группировок уровни в шаблоне JRXML на лету.

Ваш ответ на вопрос