Сводные значения дочерних таблиц в Birt - PullRequest
1 голос
/ 29 июля 2010

У меня есть отчет Birt, который я унаследовал от другого разработчика, состоящий из дочерней таблицы в основной таблице.Для каждой строки в основной таблице в дочерней таблице перечислены элементы, принадлежащие текущему элементу основной строки.

Две таблицы подаются из разных наборов данных, а набор данных дочерней таблицы принимает параметр, указывающий главный элемент, чей дочерний элементэлементы для извлечения.

Теперь, что мне нужно сделать, это добавить агрегат SUM в нижнюю часть основной таблицы, показывающий сумму (для всех основных элементов) определенного поля в дочерней таблице.

Рассмотрим, например, следующие данные:

MasterItem1
            ChildItem1 SomeValue
            ChildItem2 SomeValue
            ChildItem3 SomeValue
MasterItem2
            ChildItem1 SomeValue
            ChildItem2 SomeValue
            ChildItem3 SomeValue
--------------------------------
                       Total

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

Сначала я подумал, что могу просто добавить еще одну дочернюю таблицу внутриПолное поле с совокупным суммированием значений из дочернего набора данных.Однако это не сработало, поскольку дочернему набору данных требуется параметр, указывающий главный элемент, чьи дочерние элементы должны быть извлечены, поэтому невозможно получить ВСЕ значения из дочернего набора данных одновременно.

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

Любые предложения очень приветствуются.

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

Глобальная переменная - это путь.Для каждой строки в дочерней таблице добавьте требуемое значение в глобальную переменную и затем получите доступ к нему для отображения в нижней части таблицы.Нет жесткого JavaScript:

var Sum = reportContext.getPersistentGlobalVariable( "RunningAggregate" );
Sum = Sum + row["column Name"];
reportContext.setPersistentGlobalVariable( "RunningAggregate", Sum );

Затем вы можете получить доступ к Глобальной переменной в нижнем колонтитуле вашей таблицы с помощью элемента динамического текста.

Удачи!

3 голосов
/ 29 июля 2010

Должна быть возможность объявить глобальную переменную в начале отчета, затем добавить к ней каждое из дочерних значений в одном из событий строки дочерней таблицы и вывести ее в конце отчетов - если выудобное написание Javascript, это, вероятно, самое быстрое решение.

Если вы не удобное написание Javascript (я не) или если описанная выше техника не сработает, вы могли быпопробуйте либо:

  • создание третьего набора данных, объединение элементов основных данных из основного отчета с дочерними элементами данных из подотчета и вывод итога в новую таблицу данных,или
  • объединение двух существующих дочерних таблиц значений данных через объединение (так что если основная таблица - A, основная дочерняя таблица - B, а таблица подотчетов - C, у вас есть объединение AB AC), заменяятаблица подотчета и существующие строки подробностей с новыми строками подробностей, зависящими от типа дочерней строки, и итоги в конце отчета на основе значений AC.

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

2 голосов
/ 02 августа 2010

Спасибо, Марк и Мистик, оба ваших ответа привели меня на правильный путь!

Мое окончательное решение заключается в следующем:

1) Объявите переменную суммы в методе initialize дляreport:

var total = 0;

2) Добавьте значение каждой строки в переменную суммы в методе onReder поля данных, содержащего значения:

total += parseInt(this.getValue());

3) Используйте переменную суммыкак выражение в поле итогов.

Работает как шарм.


Обновление: Обнаружена ошибка в моем решении: последняя строка была исключена изсумма.Я думаю, что значение итоговой ячейки в нижнем колонтитуле таблицы определяется до последней строки.

Исправлено:

  1. Код перемещенного суммированияиз метода onRender в onCreate
  2. В метод onRender общей ячейки добавлен следующий код:

    this.setDisplayValue (total);

...