Получение необходимых данных для формирования текста memoFix.

Отчёт

Итак...

После создания дерева для вычисления выражения dataPart (точнее его часть RpDataExpression) имеет дерево с узлами:

  1. Константы локальные
  2. Глобальные переменные (номер страницы, дата, время, значение поля набора данных и т.д.)
  3. Локальные функции (sin() и т.п.)
  4. Агрегатные функции.

Самое сложное агрегатные функции...

  1. Для вычисления агрегатной функции все данные должны быть готовы при первом проходе. Следовательно агрументом агрегатной функции не может быть другая агрегатная функция или глобальная переменная которая определяется только к концу первого прохода (например, кол-во страниц в отчёте)
  2. Вычисление агрегатной функции привязанно к одному из бендов. Т.е. формировании новой строки бенда, все привязанные к нему агрегатные функции должны произвести необходимые действия.

Передачу данных можно организовать следующими способами.

Вариант №1:

  1. RpDataExpression создаёт список объектов связвывющих агрегатную функцию с бендом, изменение которого привадит в вычислению функции.
  2. При изменении состояния бенда проверяем все RpDataExpression...

Да уж.... Куча мемо, с одним или несколькими выражениями, в куче бендов...

Решение на 3 с большим минусом!


Вариант №2:

  1. В бенде кроме мемо относящихся к самому бенду определить список мемо в которые входят выражения зависящие от данного бенда.
  2. Расчёт вызывается для мемо, но вычисляются только агрегатные функции.


Сейчас вычисления происходят в одно действие и сразу возвращается текст.

bool RpMemoFix::generate(QString &errorStr)
...
    m_text = m_memo->part()->text(errorStr);

Очевидно, что нужно оделить первый проход от последнего, и определить изменение какого бенда вызвали вычисление выражения.

Значение агрегатной функции не зависит от текущей строки... Соответственно может вычисляться один раз для memo, а не для каждого memoFix.


Т.е. после разбора формулы memo->prepare() в мемо можно сформировать список агрегатных функций, а само memo включить в список для расчёта в соответствующем бенде.


Схема:

  1. При подготовке в memo формируем список агрегатных функций и список внешних переменных необходимых для каждого выражения RpDataExpression.
  2. При первом и втором проходе заполняем список значениями и производим вычисление.
  3. Если вычисление активированно не текущим бендом, то вычисляем только агрегатные функции.