Итоговая сумма по группам

отредактировано 12:49 Раздел: FastReport 3.0
Есть такая картинка:
GroupHeader
MasterData
GroupFooter

Группировка по полю Field1. Требуется после вывода каждой группы выводить суммы, сгруппированные по полю Field2.
Т.е. должно получится что-то типа - список операций, сгруппированных по одному критерию, а потом суммы этих операций, сгруппированных по 2-му критерию...
Как сделать ума не приложу.

Комментарии

  • LexLex
    отредактировано 12:49
    если я все правильно понял то только ручками в скрипте
  • gpigpi
    отредактировано 12:49
    Недели две назад я тоже решал подобную проблему. В итоге пришёл к следующему:
    при печати каждой записи передаю значения для второй группировки в программу через пользовательскую функцию, а в самой программе накапливаю суммы в массиве. При печати футера по группе сортирую массив и передаю его в отчёт. Кажется, что сложно и медленно, но после того, как я потратил почти неделю на решение задачи средствами FR, и отчёт на 60 страниц после этого формировался 2 минуты, а при использовании этого метода - чуть более 10 секунд
    TSchetArray = record
                     Schet: String [10];
                     Summa: Extended;
                    end;
    var ListSchet, ListSum: TStringList;
          SchetArray: Array of TSchetArray;
    
    function TMainForm.Report_3UserFunction(const MethodName: String;
      var Params: Variant): Variant;
    begin
         if MethodName='LIMITZABORSORTTOBALANSSCHET' then
           LimitZaborSortToBalansSchet(Params[0],Params[1],Params[2])
    end;
    
    procedure TMainForm.LimitZaborSortToBalansSchet(Switch:Integer; Schet: String; Summa: Extended);
    var i, position, len: integer;
        UpdateSchetArray: Boolean;
    begin
      case Switch of
        0: begin
             ListSchet:=TStringList.Create;
             ListSchet.Sorted:=True;
             ListSum:=TStringList.Create;
             ListSum.Sorted:=False;
             SetLength(SchetArray,0);
           end;
        1: begin
             UpdateSchetArray:=False;
             for i:= 0 to length(SchetArray)-1 do
               if SchetArray[i].Schet=schet then
                 begin
                   SchetArray[i].Summa:=SchetArray[i].Summa+Summa;
                   UpdateSchetArray:=True;
                   break;
                 end;
             if not UpdateSchetArray then
               begin
                 SetLength(SchetArray,length(SchetArray)+1);
                 SchetArray[length(SchetArray)-1].Schet:=Schet;
                 SchetArray[length(SchetArray)-1].Summa:=Summa;
               end;
           end;
        2: begin
             ListSchet.Clear;
             ListSum.Clear;
             for i:=0 to length(SchetArray)-1 do
               begin
                 ListSchet.Add(SchetArray[i].Schet+'|'+FormatFloat('# ### ##0.00',SchetArray[i].Summa));
               end;
             ListSchet.Sorted:=False;
             for i:=0 to ListSchet.Count-1 do
               begin
                 position:=Pos('|',ListSchet.Strings[i]);
                 len:=length(ListSchet.Strings[i]);
                 ListSum.Add(copy(ListSchet.Strings[i],position+1,len-position));
                 ListSchet.Strings[i]:=copy(ListSchet.Strings[i],1,position-1);
               end;
             Report_3.Variables['Schet']:=ListSchet.Text;// в отчёте созданы две переменные, которые печатаются в GroupFooter каждая в своём Мемо
             Report_3.Variables['Summa']:=ListSum.Text;
             ListSchet.Free;
             ListSum.Free;
             SetLength(SchetArray,0);
           end;
      end;
    end;
    
    В скрипте:
    procedure MasterData1OnBeforePrint(Sender: TfrxComponent);
    begin
     LimitZaborSortToBalansSchet(1,<ReportDataset1."BALANS_KOD">,<ReportDataset1."SUMMA">);
    end;
    
    procedure GroupFooter1OnBeforePrint(Sender: TfrxComponent);
    begin
       LimitZaborSortToBalansSchet(2,'',0);
    end;
    
    procedure GroupHeader1OnBeforePrint(Sender: TfrxComponent);
    begin
         LimitZaborSortToBalansSchet(0,'',0);
    end;
    
  • отредактировано 12:49
    Большое спасибо за советы. Буду пробовать.

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

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