Получение необходимых данных для формирования текста memoFix.
Отчёт
Итак...
После создания дерева для вычисления выражения dataPart (точнее его часть
RpDataExpression) имеет дерево с узлами:
- Константы локальные
- Глобальные переменные (номер страницы, дата, время, значение поля
набора данных и т.д.)
- Локальные функции (sin() и т.п.)
- Агрегатные функции.
Самое сложное агрегатные функции...
- Для вычисления агрегатной функции все данные должны быть готовы при
первом проходе. Следовательно агрументом агрегатной функции не может
быть другая агрегатная функция или глобальная переменная которая
определяется только к концу первого прохода (например, кол-во страниц в
отчёте)
- Вычисление агрегатной функции привязанно к одному из бендов. Т.е.
формировании новой строки бенда, все привязанные к нему агрегатные
функции должны произвести необходимые действия.
Передачу данных можно организовать следующими способами.
Вариант №1:
- RpDataExpression создаёт список объектов связвывющих агрегатную
функцию с бендом, изменение которого привадит в вычислению функции.
- При изменении состояния бенда проверяем все RpDataExpression...
Да уж.... Куча мемо, с одним или несколькими выражениями, в куче
бендов...
Решение на 3 с большим минусом!
Вариант №2:
- В бенде кроме мемо относящихся к самому бенду определить список мемо в
которые входят выражения зависящие от данного бенда.
- Расчёт вызывается для мемо, но вычисляются только агрегатные функции.
Сейчас вычисления происходят в одно действие и сразу возвращается текст.
bool RpMemoFix::generate(QString &errorStr)
...
m_text = m_memo->part()->text(errorStr);
Очевидно, что нужно оделить первый проход от последнего, и определить
изменение какого бенда вызвали вычисление выражения.
Значение агрегатной функции не зависит от текущей строки...
Соответственно может вычисляться один раз для memo, а не для каждого
memoFix.
Т.е. после разбора формулы memo->prepare() в мемо можно
сформировать список агрегатных функций, а само memo включить в список для
расчёта в соответствующем бенде.
Схема:
- При подготовке в memo формируем список агрегатных функций и список
внешних переменных необходимых для каждого выражения RpDataExpression.
- При первом и втором проходе заполняем список значениями и производим
вычисление.
- Если вычисление активированно не текущим бендом, то вычисляем только
агрегатные функции.