Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.19;
Скачать: CL | DM;

Вниз

Подсчет суммы поля Без SQL   Найти похожие ветки 

 
box   (2006-01-30 09:58) [0]

Здравствуйте подскажите пожайлуста как в Делфи подсчетать сумму поля таблицы
БД (Без SQL)


 
ЮЮ ©   (2006-01-30 10:00) [1]

В цикле по записям НД, естественно.


 
box   (2006-01-30 10:02) [2]

а примерчик можно плиз


 
Sergey13 ©   (2006-01-30 10:04) [3]

>(Без SQL)
Религия такая?


 
Ega23 ©   (2006-01-30 10:06) [4]


> а примерчик можно плиз


First
While not Eof
Sum:=Sum+ ...
Next


 
msguns ©   (2006-01-30 10:38) [5]

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;          


 
Juice ©   (2006-01-30 10:47) [6]

Агрегаты можно использовать, если операция подсчета сумы не одноразовая.


 
box   (2006-01-30 11:08) [7]

Спасибо все понял


 
msguns ©   (2006-01-30 12:00) [8]

Вообще же "идеологически" правильнее для подсчета сумм динамически создавать автономный запрос с текстом "Select SUM(FldName) From (<текст запроса, отображенного в гриде>)", открывать его, "забирать" результат, закрывать и убивать.
Для более-менее солидного проекта можно оформить это дейсвие как универсальную функцию и положить ее, напримепр, в датамодуль.

Поправка: предложенный метод не учитывает усеченность фильтрованного датасета (Filter+Filtered)


 
Ega23 ©   (2006-01-30 13:43) [9]


> Поправка: предложенный метод не учитывает усеченность фильтрованного
> датасета (Filter+Filtered)


Для этого OnCalcFields существует. ИМХО. По крайней мере, именно для таких вещей чаще всего его использовал.


 
Sergey13 ©   (2006-01-30 13:51) [10]

2[8] msguns ©   (30.01.06 12:00)
Не соглашусь с идеологией. 8-)
ИМХО однозначно правильным будет как раз твой вариант из [5]. Только он покажет сумму по текущему набору данных, а не сумму из БД по таким-же условиям. Ибо между "основным запросом" и зпросом на сумму в БД может произойти все что угодно.
Другое дело, что неудобно тащить все данные только для подсчета суммы. Но это уже другой вопрос.


 
msguns ©   (2006-01-30 14:01) [11]

>Sergey13 ©   (30.01.06 13:51) [10]
>Не соглашусь с идеологией. 8-)

 Вариант из [5] неверен "идеологически" по двум причинам:
1. Явно требует времени бОльше, чеи "сиквельный", что при достаточно частых пересчетах будет "тормозить" сам по себе.
2. "Толкает" на сугубо "клиентский" пересчет сумм, о чем у тебя совершенно справедливо указано дальше. "Сиквельный" вариант, реализуемый в "спарке" с переоткрытием отображаемого датасета, выдержан в строго в "клиентсерверной" идеологии.

;))


 
Sergey13 ©   (2006-01-30 14:10) [12]

2[11] msguns ©   (30.01.06 14:01)
>1. Явно требует времени бОльше, чеи "сиквельный",
В чем тут явность то? Пересылка по сети запроса/ответа+выполнение сервером практически того-же кода (алгоритмически).

ЗЫ: Я не призываю к клиентскому пересчету. Я просто так, из принципа прикопался. 8-)


 
Alex.Radik ©   (2006-01-30 17:04) [13]


> текстом "Select SUM(FldName) From (<текст запроса, отображенного
> в гриде>)", открывать его, "забирать" результат, закрывать
> и убивать

Насчёт забирать результат можно поподробнее?


 
msguns ©   (2006-01-30 17:29) [14]

>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;



Страницы: 1 вся ветка

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.038 c
2-1141154113
opopo
2006-02-28 22:15
2006.03.19
Get Var By Name, получение переменной по имени.


3-1138614007
Barsky
2006-01-30 12:40
2006.03.19
Чтение Number из файла Paradox (*.db)


1-1140023237
parovoZZ
2006-02-15 20:07
2006.03.19
TTreeView и ComboBox


11-1121939979
shalex
2005-07-21 13:59
2006.03.19
MHXPStyle


2-1141654657
SMAC
2006-03-06 17:17
2006.03.19
IntTo...