Форум: "Базы";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];
ВнизБыстрый подсчёт суммы чисел столбца. Есть 2 кода, медл. и быстрый Найти похожие ветки
← →
Stif (2002-04-11 10:44) [0]Вот медленный
procedure TForm1.Button3Click(Sender: TObject);
const COL_WITH_SUMMA = 2;
var
i:integer;
TotalSum:Double;
begin
TotalSum:=0;
Edit1.Text:="";
for i:=0 to DBGrid1.DataSource.DataSet.RecordCount do
with DBGrid1.Datasource.DataSet do
begin
First;
TotalSum:=TotalSum + DBGrid1.Columns[COL_WITH_SUMMA].Field.AsFloat;
Next;
end;
Edit1.Text:=FloatToStr(TotalSum);
end;
Но считает это всё долго, 700 записей за 5 сек.
Если ремишь First и Next, то считает в миг, но правильно только в первый раз, второй раз, после добавления/удаления записи считает сумму уже не правильно. Как сделать быстро и правильно?
← →
gek (2002-04-11 10:48) [1]А вот быстрый
Вот медленный
procedure TForm1.Button3Click(Sender: TObject);
const COL_WITH_SUMMA = 2;
var
i:integer;
TotalSum:Double;
begin
TotalSum:=0;
Edit1.Text:="";
table1.first;
table1.Disablecontrols;
while not table1.eof do
TotalSum:=TotalSum + tabl1.fieldbyname(".....").asfloat;
Edit1.Text:=FloatToStr(TotalSum);
table1.enablecontrols;
end;
← →
alexandr (2002-04-11 10:52) [2]1) first убери, а то вообще левизна полная.
его поставить надо первой строкой в процедуре.
2) а разве внутри процедуры const возможет?
3) вначале процедуры поставь disableControls, в конце enableControls
4) Быстрее может быть с Query.
← →
Johnmen (2002-04-11 10:56) [3]var
TotalSum : double;
mark : TBookmark;
...
with DataSet do begin;
mark:=GetBookmark;
DisableControls;
First;
TotalSum:=0.0;
while not EOF do begin;
TotalSum:=TotalSum+FieldByName(...).AsFloat;
Next;
end;
try GotoBookmark(mark);
finally FreeBookmark(mark);
end;
EnableControls;
end;
Это как вариант...
← →
-=CrazyFish=- (2002-04-11 11:58) [4]см. дельфийский хелп по Local SQL на функцию SUM. Думаю, что считать будет побыстрее.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c