Эту хрень еще называют шахматной ведомостью или кросс-отчетом. Я ее делал таким образом: 1) метаданные заголовков по X,Y - список описаний каждого заголовка, хранятся в том порядке, в котором группируются. В описании имя поля, формат и прочее по мелочи, типа "кастомная функция форматирования" 2) метаданные ячеек. список описаний каждого поля отображаемого в ячейке на пересечении. тоже - имя поля, формат, иногда функция аггрегирования. 3) данные заголовков: как и в предложенной модели, список списков 4) данные ячеек: как и в предложенной модели, Map из пары координат в список значений полей ячейки
упс. у этой схемы есть изъян. записи заголовков должны быть отсортированы в определенном порядке. это можно сделать только когда все записи прочитаны, т.е. прочитан весь ResultSet. но если мы потом их отсортируем, то индексы в Map станут неправильными, на них-то сортировка не распространяется...
Сейчас загляну в код. Я там что-то мудрил с правильной сортировкой. Да, я делал еще более злым образом, оказывается. У меня на вход генератора отчетов передается три итератора - для значений X, для значений Y и для ячеек. Первые два нужны(но не обязательны) чтобы некоторые ячейки показывались даже если для них нету данных в списке ячеек. А в качестве координат используются не индексы в массивах значений X и Y, а сами эти значения, специальным образом отформатированные, чтобы сортировались в правильном порядке. Т.е. при заполнении из итератора одновременно заполняются и заголовки и ячейки, сортировка не портится.
Я ее делал таким образом:
1) метаданные заголовков по X,Y - список описаний каждого заголовка, хранятся в том порядке, в котором группируются. В описании имя поля, формат и прочее по мелочи, типа "кастомная функция форматирования"
2) метаданные ячеек. список описаний каждого поля отображаемого в ячейке на пересечении. тоже - имя поля, формат, иногда функция аггрегирования.
3) данные заголовков: как и в предложенной модели, список списков
4) данные ячеек: как и в предложенной модели, Map из пары координат в список значений полей ячейки
Reply
SELECT x_name, y_name, sum(value)
FROM ...
GROUP BY x_name, y_name
ORDER BY x_name, y_name
P.S. это не значит что нужно его использовать.
Reply
у этой схемы есть изъян.
записи заголовков должны быть отсортированы в определенном порядке.
это можно сделать только когда все записи прочитаны, т.е. прочитан
весь ResultSet.
но если мы потом их отсортируем, то индексы в Map
станут неправильными, на них-то сортировка не распространяется...
Reply
Да, я делал еще более злым образом, оказывается.
У меня на вход генератора отчетов передается три итератора - для значений X, для значений Y и для ячеек. Первые два нужны(но не обязательны) чтобы некоторые ячейки показывались даже если для них нету данных в списке ячеек.
А в качестве координат используются не индексы в массивах значений X и Y, а сами эти значения, специальным образом отформатированные, чтобы сортировались в правильном порядке. Т.е. при заполнении из итератора одновременно заполняются и заголовки и ячейки, сортировка не портится.
Reply
SortedMap наверно в этой вашей Java :)
Reply
Leave a comment