Сумма в заголовках

starcomputerstarcomputer Украина, Донецк
отредактировано 07:37 Раздел: FastReport 2.xx VCL
Как получить сумму в заголовках вложенных групп ?

Есть несколько групп, каждая из которых является подгруппой другой:

Группа А:
Подгруппа А.А:
Подгруппа А.А.А:
Подгруппа Б.А:
Подгруппа Б.А.А:
и т.д.

Так вот что получается: если использовать массивы для каждой группы, то получается, что для самой верхней группы в иерархии все считается правильно, а для вложенных групп - полный бред! Хотя футеры считаются верно.
Плиз, кто сталкивался подскажите, что делать !!!!!

Комментарии

  • отредактировано 07:37
    написал:
    Так вот что получается: если использовать массивы для каждой группы, то получается, что для самой верхней группы в иерархии все считается правильно, а для вложенных групп - полный бред! Хотя футеры считаются верно.

    Если футеры для вложенных групп считаются правильно, дак значит ты так написал запись этих суммы в массив !!!

    Я тебе уже всё разжевал как это пишется - теперь ещё и переварить это всё за тебя ? ;) )

    Рассказываю:
    Page1.OnBeforePrint:
    begin
     GroupID:=0;
    end;
    
    GroupHeader.OnBeforePrint: // ДЛЯ КАЖДОГО GroupHeader
    begin
      Inc(GroupID);
      Visible:=FinalPass;
      if not Visible then
       GroupSum[GroupID]:=0; //обнуляем сумму на первом проходе
    end;
    
    GroupFooter.OnBeforePrint: // ДЛЯ КАЖДОГО GroupFooter
    begin
      if not FinalPass then
       GroupSum[GroupID]:=SUM(ПОЛЕ_ДЛЯ_СУММЫ); //записываем сумму на первом проходе
      Visible:=False;
    end;
    

    Соответсвенно на GroupHeader кладём текст с
    [GroupSum[GroupID]]
    
  • starcomputerstarcomputer Украина, Донецк
    отредактировано 07:37
    Page1.OnBeforePrint:
    begin
    GroupID:=0;
    end;

    GroupHeader.OnBeforePrint: // ДЛЯ КАЖДОГО GroupHeader
    begin
    Inc(GroupID);
    Visible:=FinalPass;
    if not Visible then
    GroupSum[GroupID]:=0; //обнуляем сумму на первом проходе
    end;

    GroupFooter.OnBeforePrint: // ДЛЯ КАЖДОГО GroupFooter
    begin
    if not FinalPass then
    GroupSum[GroupID]:=SUM([Вес]); //записываем сумму на первом проходе
    Visible:=False;
    end;

    Попробовал, 0 - во всех заголовках. Но все равно спасибо за разжевывание !
  • отредактировано 07:37
    написал:
    Попробовал, 0 - во всех заголовках.

    Эх, молодость, молодость - даже готовый код в отчёт встроить нормально не могут ;) )
  • starcomputerstarcomputer Украина, Донецк
    отредактировано 07:37
    Раньше делал так:
    PotrHeader.OnBeforePrint  {Самый верхний уровень группировки, здесь OK}
    begin
    PotrID := [Код_потребителя]; {Идентификатор из базы данных (уник.)}
    if FinalPass 
    then PotrSum := PotrArray[PotrID]
    else PotrSum := 0;
    end;
    
    PostHeader.OnBeforePrint // Второй уровень группировки, здесь лажа.
    begin
    PostID := [Код_поставщика];
    if FinalPass 
    then PostSum := PostArray[PostID]
    else PostSum := 0;
    end;
    
    // еще две вложенные группы - тоже лажа.
    
    MasterData.OnBeforePrint
    begin
    if not FinalPass then
    begin
    PotrSum := PotrSum + [Вес];
    PostSum := PostSum + [Вес];
    end;
    end;
    
    PostFooter.OnBeforePrint
    begin
    if not FinalPass then PostArray[PostID] := PostSum;
    end;
    
    PotrFooter.OnBeforePrint
    begin
    if not FinalPass then PotrArray[PotrID] := PotrSum;
    end;
    
    В остальных подгруппах то-же, только названия переменных другие, в соответствии с типом группы (Потребитель, Поставщик, Область, Станция).

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

    Буду чрезвычайно рад, если укажут где ошибка. Ведь странно, скрипт для всех групп одинаков а работает по разному.
  • отредактировано 07:37
    ВОПРОС НА ЗАСЫПКУ:

    Как реализовать аналогичную идею в кросс-таб отчёте на основе кросс-бендов? Там нужно использовать двумерный массив, который Fast Report НЕ ПОДДЕРЖИВАЕТ!!!

    ИДЕИ?
  • отредактировано March 2004
    2 starcomputer:
    написал:
    PostHeader.OnBeforePrint // Второй уровень группировки, здесь лажа.
    begin
    PostID := [Код_поставщика];
    if FinalPass
    then PostSum := PostArray[PostID]
    else PostSum := 0;
    end;

    Я могу тебе сказать почему у тебя лажа ...

    Потому что PostID у тебя НЕУНИКАЛЬНЫЙ в разрезе подгрупп !!!

    Например:

    Группа 1 (Potr=1)
    -Подгруппа 1 (Post=1)
    --Вес=1
    --Вес=2

    Группа 2 (Potr=2)
    -Подгруппа 1 (Post=1)
    --Вес=5
    --Вес=6

    Ну и ессно в PostSum[1] ты получишь сумму ПО ВСЕМ потребителям = 1+2+5+6

    Я ведь тебе писал, что тебе нужно заводить УНИКАЛЬНЫЙ НОМЕР ГРУППЫ (уввеличивать его на КАЖДОМ GroupHeader-e) и писать в массив тоже с этим индексом ...

    На четвёртый раз объяснять сил уже не будет ;) )
  • отредактировано 07:37
    starcomputer, посчитай вручную: у тебя суммы по второму уровню группировки во всех уровнях первой группировки одинаковые? Если да, то скорее всего, они равны суммам по последней группе первого уровня группировки...

    Это так?
  • отредактировано 07:37
    2 Jinn:

    По поводу двухмерных массивов - раскладывай двухмерный индекс в одномерный. Индекс по Х умножаешь на какую-нибудь константу, которая всегда больше елементов по X ...
  • отредактировано March 2004
    Проблема то, блин, с кросс-табами. А тем хрен знает сколько столбцов бывает. Бывает 10, бывает сто, причем, что самое обидное, в одном и том же отчете. не могу же я массив в max(int) элементов его раскладывать! С количеством групп та же байда ;)
  • отредактировано 07:37
    2 Jinn:

    Ну не знаешь кол-во элементов тоже не проблема ;) )
    Индекс в массиве может быть строковый ...
    Собираешь индекс как Str(IndexX)+';'+Str(IndexY) ...
  • отредактировано 07:37
    2Vano:

    Хм... ;)
    Я это как-то упустил из виду... ;)

    Благодарю за подсказку! Возможно, это решение моих проблем!
    ;)
  • starcomputerstarcomputer Украина, Донецк
    отредактировано 07:37
    написал:
    Ну и ессно в PostSum[1] ты получишь сумму ПО ВСЕМ потребителям = 1+2+5+6

    Не получил ;)

    В каждой группе Potr есть один Post который повторяется во всех группах Potr.
    По идее (насчет неуникальных индексов ты прав !!!) я должен получить везде у этого Post одну и ту-же сумму (ну я бы это сразу увидел и рыл бы ;) ) но сумма этого Post в каждой из групп Potr разная !!!

  • starcomputerstarcomputer Украина, Донецк
    отредактировано 07:37
    написал:
    starcomputer, посчитай вручную: у тебя суммы по второму уровню группировки во всех уровнях первой группировки одинаковые? Если да, то скорее всего, они равны суммам по последней группе первого уровня группировки...

    Это так?

    Увы ;) НЕТ !
  • starcomputerstarcomputer Украина, Донецк
    отредактировано 07:37
    Вопрос к VANO !!!!!!
    написал:
    Page1.OnBeforePrint:
    begin
    GroupID:=0;
    end;

    GroupHeader.OnBeforePrint: // ДЛЯ КАЖДОГО GroupHeader
    begin
    Inc(GroupID);
    Visible:=FinalPass;
    if not Visible then
      GroupSum[GroupID]:=0; //обнуляем сумму на первом проходе
    end;

    GroupFooter.OnBeforePrint: // ДЛЯ КАЖДОГО GroupFooter
    begin
    if not FinalPass then
      GroupSum[GroupID]:=SUM(ПОЛЕ_ДЛЯ_СУММЫ); //записываем сумму на первом проходе
    Visible:=False;
    end;

    Ну вот, попробовал твой вариант, теперь наткнулся на другие грабли ;)

    Если применить такую конструкцию к первой группе (самой верхней) то все OK ;)

    А если я добавляю то-же в подгруппу (первую вниз) то правилбно считается уже в ней, а в верхней группе выдает НОЛЬ.
    Если добавляю скрипты в Header - Footer еще более низкой подгруппы то все повторяется, т.е. в ней все считает, в верхних по отношению к ней - опять 0.000

    Ну подскажи еще раз, что уже тут не так, будь человеком ;)

    С уважением, Сергей.
  • отредактировано 07:37
    2 starcomputer:

    Читаем ВНИМАТЕЛЬНО !!!
    GroupHeader.OnBeforePrint: // ДЛЯ КАЖДОГО GroupHeader
    GroupFooter.OnBeforePrint: // ДЛЯ КАЖДОГО GroupFooter
    

    Кол-во GroupHeader-ов и GroupFooter-ов ДОЛЖНО СОВПАДАТЬ !!!
  • starcomputerstarcomputer Украина, Донецк
    отредактировано 07:37
    2 VANO !
    написал:
    GroupHeader.OnBeforePrint: // ДЛЯ КАЖДОГО GroupHeader
    GroupFooter.OnBeforePrint: // ДЛЯ КАЖДОГО GroupFooter

    Значит ли это, что я должен прописать скрипты в тех Header - Footer в которых я ничего не подсчитываю.

    Если нет, то тогда я вообще ничего не пойму.
    Сейчас скрипты прописаны в основной группе и в первой к низу о нее.
    Естественно получается 2 Header'а и 2 Footer'а.

    Вот только что переключился и проверил.
    Я ведь как сделал:
    Прописал скрипты в Header - Footer основной группы (самой верхней) - заработало ;) .
    Прописал те-же скрипты в группу ниже (прсто скопировал - вставил) - начало все правильно считаться по ней, а в основной стало - 0.000

  • отредактировано March 2004
    Так, абажи - это у меня уже глюк ;) )

    Inc(GroupID) нужно делать в GroupFooter-е на первом проходе, а не Header-е на втором !!!
    Page1.OnBeforePrint:
    begin
    GroupID:=0;
    end;
    
    GroupHeader.OnBeforePrint: // ДЛЯ КАЖДОГО GroupHeader
    begin
     Visible:=FinalPass;
     if FinalPass then 
      Inc(GroupID); 
    end;
    
    GroupFooter.OnBeforePrint: // ДЛЯ КАЖДОГО GroupFooter
    begin
    if not FinalPass then
     begin
      Inc(GroupID);
      GroupSum[GroupID]:=SUM(ПОЛЕ_ДЛЯ_СУММЫ);
     end;
    Visible:=False;
    end;
    
  • starcomputerstarcomputer Украина, Донецк
    отредактировано 07:37
    2 VANO !
    Page1.OnBeforePrint:
    begin
    GroupID:=0;
    end;
    
    GroupHeader.OnBeforePrint: // ДЛЯ КАЖДОГО GroupHeader
    begin
    Visible:=FinalPass;
    if FinalPass then 
     Inc(GroupID); 
    end;
    
    GroupFooter.OnBeforePrint: // ДЛЯ КАЖДОГО GroupFooter
    begin
    if not FinalPass then
    begin
     Inc(GroupID);
     GroupSum[GroupID]:=SUM(ПОЛЕ_ДЛЯ_СУММЫ);
    end;
    Visible:=False;
    end;
    
    Суммы выводятся, но не в те группы, а как-то сдвинуто.
    Определить в какую сразу не могу, у меня при таких скриптах почему-то пропали нафиг все футеры ;) .

    Кстати в первом варианте я провел эксперимент:
    Вместо обнуления суммы на первом проходе записывал:
    GroupSum[GroupID] := 1 // для первой группы
    ------------------------ := 2 // для второй
    ...........................................................
    ...........................................................
    
    В результате получаю сумму:
    - первой группы - 1.00
    - второй группы - 2.00
    .................................
    .................................
    - последней группы - все ОК !
    (группы нумерованы в иерархическом порядке)
    Так что я думаю дело не в индексах а в проходах !
  • starcomputerstarcomputer Украина, Донецк
    отредактировано 07:37
    Ответ на вопрос о заголовках в группах в случае вложенных групп !
    (может кому пригодиться ;) )
    Page1.OnBeforePrint:
    begin
    GroupID:=0;
    end;
    
    GroupHeader.OnBeforePrint: // ДЛЯ КАЖДОГО GroupHeader
    begin
    Visible:=FinalPass;
    if FinalPass then 
    Inc(GroupID); 
    end;
    
    GroupFooter.OnBeforePrint: // ДЛЯ КАЖДОГО GroupFooter
    begin
    if not FinalPass then
    begin
    Inc(GroupID);
    GroupSum[GroupID]:=SUM(ПОЛЕ_ДЛЯ_СУММЫ);
    end;
    Visible:=False;
    end;
    

    Это ответ присланный VANO за что ему огромное спасибо !
    Но работает нормально, только в случае ОДНОЙ группы !
    Если же есть вложенные подгруппы, то нужно GroupID и соответственно GroupSum[] создавать для КАЖДОЙ группы, естественно с разными именами, ну хотя бы GroupID_1 и т.д.
    И соответственно в скриптах Header - Footer группы прописывать ЕЕ переменные.
    Тогда все работает правильно ;)
    Не знаю, с чем это связано, наверно порядок первого и финального прохода FR 2.51 по группам разный.
    Если форум читают разработчики, может что-нибудь подскажут ???

    Большое спасибо всем, принявшим участие в обсуждении !!!
    С уважением,

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

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