Delphi. UniGUI. PagedGrid with summary

UniGUI позволяет разбивать dataset на страницы, для этого нужно включить в свойствах грида WebOptions -> Paged := true

Выглядеть это может так

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

procedure TMainForm.CalcTotals;
var
  B : TBookmark;
begin
  if not FInited then Exit;
  ClientDataSet1.DisableControls;
  B := ClientDataSet1.GetBookmark;
  try
    GTotal := 0;
    GTotalPrice := 0.0;

    ClientDataSet1.First;
    while not ClientDataSet1.Eof do
    begin
      GTotal := GTotal + ClientDataSet1.FieldByName('Quantity').AsInteger;
      GTotalPrice := GTotalPrice +
                    ( ClientDataSet1.FieldByName('UnitPrice').AsFloat * ClientDataSet1.FieldByName('Quantity').AsInteger );

      ClientDataSet1.Next;
    end;
  finally
    ClientDataSet1.GotoBookmark(B);
    ClientDataSet1.FreeBookmark(B);
    ClientDataSet1.EnableControls;
  end;
end;

А в OnColumnSummaryResult грида сделать следующее

procedure TMainForm.UniDBGrid1ColumnSummaryResult(Column: TUniDBGridColumn;
  GroupFieldValue: Variant; Attribs: TUniCellAttribs; var Result: string);
begin
  if SameText(Column.FieldName, 'quantity') then
  begin
    Result:=Format('Total Units: %d', [GTotal]);
    Attribs.Font.Style:=[fsBold];
    Attribs.Font.Color:=clGreen;
  end
  else if SameText(Column.FieldName, 'unitprice') then
  begin
    Result:='Total Cost: '+FormatCurr('0,0.00 ', GTotalPrice) + FmtSettings.CurrencyString;
    Attribs.Font.Style:=[fsBold];
    Attribs.Font.Color:=clNavy;
  end;
end;

Где GTotal у нас объявлена как поле. Оно в принципе и понятно, считаем результаты, закидываем их в поля, а в выводе результатов берем информацию из полей.

This entry was posted in Без рубрики. Bookmark the permalink.