Функция вычисления суммы полей

Материал из DRKB

Функция вычисления суммы полей[править | править код]

function SumField(const fieldName: OpenString): LongInt;
var
  fld: TField;
  bm: TBookmark; // закладка
begin
  Result := 0;
  tbl.DisableControls; // выключаем реакцию на перемещение по набору данных
  bm := tbl.GetBookmark; // сохраняем позицию
  fld := tbl.FieldByName(fieldName);
  tbl.First;
  while not tbl.Eof do
  begin
    Result := Result + fld.AsInteger;
    tbl.Next;
  end;
  tbl.GotoBookmark(bm); // позиционируем обратно
  tbl.EnableControls; // включаем реакцию на перемещение по набору данных
end;



Примечание Vit: данный способ один из худших, а точнее самый худший из всех возможных и мог бы служить пособием того как делать не следует (собственно для этого я его здесь и привёл). На больших таблицах, особенно на серверных базах данных выполнение этого кода будет исключительно медленное. Намного выгоднее выполнение SQL запроса вида:

SELECT Sum(MyField) FROM MyTable


И в коде чтение первого поля первой записи:

function Form1.GetRecordSum(TableName: string): Integer;
begin
  // на форме должен стоять компонент Query1 подсоединённый к нужной базе данных (код будет работать для любых разновидностей TQuery, TADOQuery и т.д.)
  Query1.Active := False;
  Query1.SQL.Text := 'SELECT Sum(MyField) FROM ' + TableName;
  Query1.Active := True;
  Result := Query1.Fields[0].AsInteger;
  Query1.Active := False;
end;


при этом все другие открытые TTable/TQuery и т.п. на этой таблице могут продолжать оставаться открытыми.


Source: Взято с http://delphiworld.narod.ru
ID: 02560