Транспонирование периодов с "порциями" - неизвестное максимальное количество строк

отредактировано August 2012 Раздел: FastReport .NET
Привет всем!

Ситуация. Есть отчет по платежам клиента. Максимально возможное количество платежей неизвестно. Заказчик хочет видеть в отчете периоды в столбцах, а не построчно (как хранятся данные в таблице). Соответственно написана табличная функция со "скроллингом", которая возвращает результат по одной "порции"-строке (по шесть столбцов в каждой - столько влезает на страницу) в зависимости от входящих параметров "rowbegin", "rowend".

select * from quest.dbo.fn_transpose(@clientid, rowbegin, rowend) t

Для каждой такой "порции" заведен свой датасорс, соответственно свой датабэнд.

Все работает, заказчик доволен. Только на тестовых данных максимальное количество периодов 14, а на бОльшем массиве протестировать нет возможности. Сейчас заведено датасорсов и датабэндов 10 штук "впрок" (сейчас хватает и трех), а сколько может быть максимум - неизвестно. Может попастся клиент с историей 20 лет, соответственно периодов будет 240, а датасорсов и датабэндов в таком случае при данном алгоритме: 240 / 6 = 40.

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

Подскажите более "изящное" решение вопроса плз.

Комментарии

  • отредактировано 02:18
    В принципе, вопрос пока решен.

    Кроме, конечно же, такого нюанса:
    marco написал: »
    Да и скорость формирования отчета какая будет с таким количеством обращений к базе...

    Если база разрастется настолько, что отчет не будет формироваться из-за длительной обработки данных, то нужно будет оптимизировать запросы, применять индексы и т.д. Конечно же, хотелось бы уже сейчас избежать большого количества обращений к базе в одном отчете.

    А пока что придумал способ обращаться к промежуточному датасорсу, в котором "зашиты" значения datbeg и datend:
    marco написал: »
    WITH rows AS (SELECT 1 AS rowid, 1 AS rowbeg, 6 AS rowend
    UNION ALL
    SELECT 2 AS rowid, 7 AS rowbeg, 12 AS rowend
    UNION ALL
    SELECT 3 AS rowid, 13 AS rowbeg, 18 AS rowend
    UNION ALL
    SELECT 4 AS rowid, 19 AS rowbeg, 24 AS rowend
    UNION ALL
    SELECT 5 AS rowid, 25 AS rowbeg, 30 AS rowend
    UNION ALL
    SELECT 6 AS rowid, 31 AS rowbeg, 36 AS rowend
    UNION ALL
    SELECT 7 AS rowid, 37 AS rowbeg, 42 AS rowend
    UNION ALL
    SELECT 8 AS rowid, 43 AS rowbeg, 48 AS rowend)
    SELECT rowid, rowbeg, rowend, @statementid as sid
    FROM rows AS rows_1
    WHERE (rowid <=
    (SELECT MAX(cnt) AS maxcnt
    FROM (SELECT StatementID, COUNT(1) AS cnt
    FROM vUbkiR_R6 AS t
    where t.statementid = @statementid
    GROUP BY StatementID) AS grafik) / 6 + 1)

    А уже от этого бэнда идет дочерний бэнд, в котором привязанный датасорс обращается к родительскому для получения значений rowbeg, rowend.
    Работает.

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

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.