Задача
Есть таблица с данными, сгруппированными по определенному полю. Причем в рамках группы значения ячеек нескольких колонок одинаковы. В итоге таблица выглядит примерно следующим образом:
Необходимо ячейки первых двух колонок, входящие в одну группу (и содержащие одинаковые значения) объединить по вертикали.
Решение
Решение вышло несколько нетривиальным. Birt умеет убирать дублирующиеся значения к ячейках колонки (путем установки свойства "Suppress duplicates"), но он при этом не объединяет ячейки, а просто делает все ячейки под первой ячейкой с определенным значением пустыми. Это решение не подходит для случая, когда значения ячеек длинные, т.к. тогда первая строка растягивается по высоте, чего не произошло бы, будь ячейки объединены:
В итоге пришлось задействовать скрипты:
- На загловочную строку группы вешаем обработчик onCreate со следующим содержимым:
reportContext.setGlobalVariable("GROUP_ROW_CNT", 0);
Т.е. мы устанавливаем глобальную переменную GROUP_ROW_CNT в 0. Эта переменная будет счетчиком строк в рамках группы. - На ячейки первого и второго столбца также вешаем обработчик onCreate:
var curGroupRowCnt = reportContext.getGlobalVariable("GROUP_ROW_CNT");
Т.е. мы инкрементируем счетчик строк в группе, и далее, если строка первая - устанавливаем для нее значение rowSpan, заведомо большее, чем возможное число строк в группе, а если строка не первая - то скрываем ее.
curGroupRowCnt++;
reportContext.setGlobalVariable("GROUP_ROW_CNT", curGroupRowCnt);
if(curGroupRowCnt != 1) {
this.getStyle().display = "none";
} else {
this.rowSpan = 1000; // заведомо большое число, т.к. мы на данном этапе не знаем, сколько строк в группе
}
Спасибо http://birtworld.blogspot.ru/2010/10/birt-duplicate-rows.html, подтолкнул в правильном направлении.
Есть пример отчета в birt? Что-то не получается, birt не хочет вставлять rowspan в тэг td.
ОтветитьУдалить