Скрыть бенд если сумма по группе =0

отредактировано 21:41 Раздел: FastReport 4.0
Приветсвую.

Подскажите как можно решить данную задачу:


Есть набор данных. Есть групировка. GroupHeader и GroupFooter. Причем к футеру прицеплен ChildBand.
Это нужно потому, что GroupFooter считается сумма по одной формуле, а в Чилде по другой формуле.

В Чилде (под футером) нужно просуммировать данные по одному из полей, и если они равны нулю, то скрыть весь Чилд-бэнд.


Суммирую я конечно с помощью SUM. При этом я для получения суммы обращаюсь к мемо полю напрямую через свойство Value в событии AfterData. Т.е. идея в том, что в поле накапливается сумма, и когда она появляется в Мемо (на событии AfterData) я считываю ее, и если она равна нулю, то скрываю весь бэнд.

Почему я воспользовался Value ? А потому что когда я пытался в обработчике BeforePrint и AfterData memo поля то в результате получался NULL, вот такой код:

var
Va: Variant
begin
Va := <SUM(<frxDBReport."FieldA">, MasterData1)>;
ShowMessage (VarToStr (Va));

возвращает пустую строку.




Тогда я пошел по другому пути (таки через Value). Написал такой код в обработчике AfterData мемо поля:

ShowMessage (TfrxMemoView(Self).Value); Чтобы увидеть что там вообще
if TfrxMemoView(Self).Value > 0
then begin
Child4.Visible := True; -- Скрываем чилда
end
else Child4.Visible := False;

тут воообще меня поразил результат !!!!!!!!
А именно - на экран ОДИН раз вывелся 0, и все. И после подготовки отчета оказалось что все бэнды скрыты - даже те, у которых TfrxMemoView(Self).Value не нулевой !!!!!!

Т.е. такое чувство что скрипт отработался только один раз, увидел что сумма в первой группе получилась 0, скрыл бэнд и... и все.... больше не отрабатывался, а ведь я так понимаю он должен отрабатыватся каждый раз когда дял новой группы появляется сумма в данном мемо поле.



В общем я в тупике (((((


Помогите решить данную задачу... ХЕЕЕЕЕЛП.

Комментарии

  • отредактировано 21:41
    Добавлю что я пробовал ставить двойной проход, и писал так в After Data:

    ShowMessage ('Say Hello');
    if (TfrxMemoView(Self).Value > 0) and (Engine.FinalPass)
    then Child4.Visible := True
    else Child4.Visible := False;

    и пробовал с (not Engine.FinalPass)

    Результат был один - мообщение появлялось только один раз


    Я даже попробовал переставить местами
    then Child4.Visible := True
    else Child4.Visible := False;

    т.е. я поменял местами True и False, чтобы хотя бы в первой группировке Чилд напечатался.... НО он не появился.... Я не понимаю что происходит ((((((((

    Хелп...
  • отредактировано 21:41
    Нашел решение :)


    В общем такое дело выяснил (я просто не знал, и не подумал сразу). Если у бэнда стоит Visible := False, то AfterData для мемки не вызывается...

    Собственно решил проблему просто, я в обработчике BeforePrint чилду сделал Visible := TRue и AfterData сработал и скрипт там все корректно расчитал...

    В общем проблема решилась - я сам виноват, не подумал...


    Я просто думал что AfterData всегда отрабатывается и думал что код if then else прекрасно отработается. Но до ифа дело то даже и не доходило просто.

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

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