barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 6 апреля 2016 г.

Birt: объединение по вертикали ячеек таблицы

Задача

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

Решение

Решение вышло несколько нетривиальным. Birt умеет убирать дублирующиеся значения к ячейках колонки (путем установки свойства "Suppress duplicates"), но он при этом не объединяет ячейки, а просто делает все ячейки под первой ячейкой с определенным значением пустыми. Это решение не подходит для случая, когда значения ячеек длинные, т.к. тогда первая строка растягивается по высоте, чего не произошло бы, будь ячейки объединены:
В итоге пришлось задействовать скрипты:
  1. На загловочную строку группы вешаем обработчик onCreate со следующим содержимым:
    reportContext.setGlobalVariable("GROUP_ROW_CNT", 0);
    Т.е. мы устанавливаем глобальную переменную GROUP_ROW_CNT в 0. Эта переменная будет счетчиком строк в рамках группы.
  2. На ячейки первого и второго столбца также вешаем обработчик onCreate:
    var curGroupRowCnt = reportContext.getGlobalVariable("GROUP_ROW_CNT");
    curGroupRowCnt++;
    reportContext.setGlobalVariable("GROUP_ROW_CNT", curGroupRowCnt);
    if(curGroupRowCnt != 1) {
    this.getStyle().display = "none";
    } else {
    this.rowSpan = 1000; // заведомо большое число, т.к. мы на данном этапе не знаем, сколько строк в группе
    }
    Т.е. мы инкрементируем счетчик строк в группе, и далее, если строка первая - устанавливаем для нее значение rowSpan, заведомо большее, чем возможное число строк в группе, а если строка не первая - то скрываем ее.
Вуаля, получаем в точности то, что хотели:

Спасибо http://birtworld.blogspot.ru/2010/10/birt-duplicate-rows.html, подтолкнул в правильном направлении.

Комментариев нет:

Отправить комментарий