![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подсчет суммы поля Без SQL [D7, Access2003]
box © (2006-01-30 09:58:00)Здравствуйте подскажите пожайлуста как в Делфи подсчетать сумму поля таблицы
БД (Без SQL)
msguns (2006-01-30 17:29:00) [1]>Alex.Radik © (30.01.06 17:04) [13]
>Насчёт забирать результат можно поподробнее?
function CalcSumByTempQuery(DBGrid: TDBGrid): double;
begin
result := 0;
with TADOQuery.Create(nil) do
begin
Connection := TADODataSet(DBGrid.DataSet).Connection;
SQL.Text := 'Select SUM(A.Fld) FROM ('+TADODataSet(DBGrid.DataSet).CommandText+') A';
Open;
If (RecordCount>0) and not Fields[0].IsNull then
result := Fields[0].AsFloat;
Close;
Free;
end;
end;
Alex.Radik (2006-01-30 17:04:00) [2]
> текстом "Select SUM(FldName) From (<текст запроса, отображенного
> в гриде>)", открывать его, "забирать" результат, закрывать
> и убивать
Насчёт забирать результат можно поподробнее?
Sergey13 (2006-01-30 14:10:00) [3]2[11] msguns © (30.01.06 14:01)
>1. Явно требует времени бОльше, чеи "сиквельный",
В чем тут явность то? Пересылка по сети запроса/ответа+выполнение сервером практически того-же кода (алгоритмически).
ЗЫ: Я не призываю к клиентскому пересчету. Я просто так, из принципа прикопался. 8-)
msguns (2006-01-30 14:01:00) [4]>Sergey13 © (30.01.06 13:51) [10]
>Не соглашусь с идеологией. 8-)
Вариант из [5] неверен "идеологически" по двум причинам:
1. Явно требует времени бОльше, чеи "сиквельный", что при достаточно частых пересчетах будет "тормозить" сам по себе.
2. "Толкает" на сугубо "клиентский" пересчет сумм, о чем у тебя совершенно справедливо указано дальше. "Сиквельный" вариант, реализуемый в "спарке" с переоткрытием отображаемого датасета, выдержан в строго в "клиентсерверной" идеологии.
;))
Sergey13 (2006-01-30 13:51:00) [5]2[8] msguns © (30.01.06 12:00)
Не соглашусь с идеологией. 8-)
ИМХО однозначноправильным будет как раз твой вариант из [5]. Только он покажет сумму по текущему набору данных, а не сумму из БД по таким-же условиям. Ибо между "основным запросом" и зпросом на сумму в БД может произойти все что угодно.
Другое дело, что неудобно тащить все данные только для подсчета суммы. Но это уже другой вопрос.
Ega23 (2006-01-30 13:43:00) [6]
> Поправка: предложенный метод не учитывает усеченность фильтрованного
> датасета (Filter+Filtered)
Для этого OnCalcFields существует. ИМХО. По крайней мере, именно для таких вещей чаще всего его использовал.
msguns (2006-01-30 12:00:00) [7]Вообще же "идеологически" правильнее для подсчета сумм динамически создавать автономный запрос с текстом "Select SUM(FldName) From (<текст запроса, отображенного в гриде>)", открывать его, "забирать" результат, закрывать и убивать.
Для более-менее солидного проекта можно оформить это дейсвие как универсальную функцию и положить ее, напримепр, в датамодуль.
Поправка: предложенный метод не учитывает усеченность фильтрованного датасета (Filter+Filtered)
box (2006-01-30 11:08:00) [8]Спасибо все понял
Juice (2006-01-30 10:47:00) [9]Агрегаты можно использовать, если операция подсчета сумы не одноразовая.
msguns (2006-01-30 10:38:00) [10]
procedure CalcSumOfColumnField(Grid: TDBGrid; FldName: string): double;
var
bm: TBookMark;
begin
result := 0;
Screen.Cursor := crHourGlass;
with Grid.DataSet do
begin
DisableControls;
bm := GetBookMark;
First;
While not Eof do begin
if FieldByName(FldName).AsString>'' then
result := result+FieldByName('<summarizing_field>').AsFloat;
Next;
end;
GotoBookMark(bm);
FreeBookmark(bm)
EnableControls;
end;
Screen.Cursor := crHourGlass;
end;
Ega23 (2006-01-30 10:06:00) [11]
> а примерчик можно плиз
First
While not Eof
Sum:=Sum+ ...
Next
Sergey13 (2006-01-30 10:04:00) [12]>(Без SQL)
Религия такая?
box (2006-01-30 10:02:00) [13]а примерчик можно плиз
ЮЮ (2006-01-30 10:00:00) [14]В цикле по записям НД, естественно.