Функция вычисления суммы полей |
Previous Top Next |
Code: |
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; |
©Drkb::02559
Взято с http://delphiworld.narod.ru
Примечание Vit: данный способ один из худших, а точнее самый худший из всех возможных и мог бы служить пособием того как делать не следует (собственно для этого я его здесь и привёл). На больших таблицах, особенно на серверных базах данных выполнение этого кода будет исключительно медленное. Намного выгоднее выполнение SQL запроса вида:
Code: |
Select Sum(MyField) From MyTable |
И в коде чтение первого поля первой записи:
Code: |
Function Form1.GetRecordSum(TableName:string):integer; {©Drkb v.3(2007): www.drkb.ru, ®Vit (Vitaly Nevzorov) - nevzorov@yahoo.com} 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 и т.п. на этой таблице могут продолжать оставаться открытыми.
©Drkb::02560