Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

Подсчет суммы поля Без 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.018 c
8-1128869883
Zur
2005-10-09 18:58
2006.03.19
TImage


15-1141034382
Manic Mechanic
2006-02-27 12:59
2006.03.19
про строительство


2-1141607507
JaspeR
2006-03-06 04:11
2006.03.19
FileListBox!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


3-1138338734
Андрей К.
2006-01-27 08:12
2006.03.19
хранимая процедура


6-1134133383
cyborg
2005-12-09 16:03
2006.03.19
POP3 сервер возвращает неправильные размеры содержимого письма





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский