Функция Report::prepare() вызвывает соответствующую функцию для всех страниц отчёта (в текушей реализации, страница может быть только одна). В качестве одного из параметров передаётся источник данных RpDataStorage *dataStorage, который содержит набор всех данных используемые отчётом (данные из баз данных, параметры отчёта - страница, кол-во страниц, константы и т.д.).
RpPage::prepare(RpDataStorage *dataStorage, QString *lastError) - подготовка страницы, вызывает фунции подготовки бендов входящих в страницу. В текущей реализации сначала вызывается подготовка заголовка страницы (m_header), затем - подготовка одного или нескольких бендов основных данных (m_mainData).
RpBand::prepare(RpDataStorage *dataStorage, QString *lastError) - подготовка бенда, вызывает подготовку полей данных (m_memo) входящих в бенд.
bool RpMemo::prepare(RpDataStorage *dataStorage, QString
*lastError) - подготовка поля данных. RpMemo
содержит объект m_part, который при генерации отчёта
должен "вычислять" выражение заданное в m_data.
В текущей реализации, на данном этапе, происходит преобразование выражения
m_data в список объектов класса RpDataAbstract,
представляющие из себя текст и/или вычисляемые выражения. Каждый из таких
объектов возвращает строку текса, которые складываются в строку для
отображения в отчёте.
Не всегда есть возможность сформировать отчёт за один проход. Например, на страницах отчёта нам необходимо указать общее количество страниц или значение агрегатной функции (сумма значений столбца и т.п.). В таком случае необходимо указать что отчёт будет формироваться за два прохода.
За первый проход мы определяем значения всех функций и внешних данных (из базы данных и т.п.). А во время второго прохода формируем текст поля данных.
Соответсвенно в случае двухпроходного отчета, нам необходимо "кешировать данные" для каждого memoFix.
Не оформлено...
Объект класса Report хранит сформированный отчёт в виде сформированных страниц m_pageFix(RpPageFixList). Report::generate() - процедура формирования отчёта, делает следующее:
Формирование страницы осуществляет объект класса RpPage - RpPage::generate(RpDataStorage *dataStorage, QString &errorStr).
Порядок формирования:
Формирование бендов разных типов отличаются только определением места расположения, основная работа производится функцией RpBand::generate(drawRect, dataStorage, pageFix, errorStr). Для всех RpMemo принадлежащих бенду создаётся memoFix (зафиксированное поле данных) определяестя местоположение на странице, и генерируется тест с текущими данными запроса.
Формирование текста поля данных.
m_text = m_memo->part()->text(errorStr)
m_text - сформированный текст. m_memo->part() - объект отвечающий за формирование готового результата.