Форум: "Базы";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
ВнизНужно просуммировать Найти похожие ветки
← →
sloug © (2004-08-02 18:52) [0]Добрый вечер уважаемые знатоки! Вопрос в следующем. Есть таблица Table1,в ней есть столбец Cost, мне нужно просуммировать значения всех записей в этом столбце. Как это сделать?
← →
DSKalugin © (2004-08-02 19:15) [1]var s:Double;
c: LongInt;
begin
s:=0;
c:=Table1.RecNo;
Table1.DisableControls;
Table1.First;
while not Table1.eof
do s:=s+Table1.FieldByName("Cost").asFloat;
Table1.RecNo:=c;
Table1.EnableControls;
label1.caption:=FloatToStr(s);
end;
← →
сергей1 (2004-08-02 20:43) [2]а еще можно вот так :
form1.ADOQuery1.SQL.Text:="select sum(cost) from Table1 ";
form1.ADOQuery1.Open;
← →
AlexG © (2004-08-02 21:25) [3]сергей1 верно говорит
← →
GanibalLector © (2004-08-02 22:35) [4]2 сергей1 and AlexG
А ADO тут причем???Обычным Query можно обойтись
← →
vakir77 (2004-08-02 22:50) [5]Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add("select sum(cost) from Table1");
Query1.Open;
← →
Johnmen © (2004-08-03 09:06) [6]>SKalugin © (02.08.04 19:15) [1]
Чё-то ты накосячил и даже не извинился...:)))
← →
Anatoly Podgoretsky © (2004-08-03 09:12) [7]Обучает использованию Ctrl+Alt+Del
← →
Johnmen © (2004-08-03 09:14) [8]>Anatoly Podgoretsky © (03.08.04 09:12) [7]
Точно!
← →
DSKalugin © (2004-08-03 12:44) [9]:-))))))))) Next забыл
← →
Johnmen © (2004-08-03 12:49) [10]>:-))))))))) Next забыл
И не только его...:)
← →
Rule © (2004-08-03 12:57) [11]согласен с суммами, но вот есть альтернативный вариант, я его использую чаще, это отображение суммы прям в гриде, это делается легко средствами самого грида (я про DBGridEh)
← →
Johnmen © (2004-08-03 12:59) [12]>Rule © (03.08.04 12:57) [11]
>... легко средствами самого грида (я про DBGridEh)
Надеюсь понятно, что эти "средства" делают полный проход набора данных ? (типа [1])
:)
← →
Rule © (2004-08-03 13:06) [13]Johnmen © (03.08.04 12:59) [12]
Да , но делают они это локально, без подключения к БД
← →
Johnmen © (2004-08-03 13:17) [14]>Rule © (03.08.04 13:06) [13]
>Да , но делают они это локально, без подключения к БД
"локально" - полный проход, и, значит, получение клиентом ВСЕХ записей. Что полность эквивалентно while not Eof do begin; ... Next; end;
Выполнить просто запрос типа [2]/[5] менее накладно по ресурсам и часто быстрее...
Про подключение к БД не понял, но догадываюсь...:)
← →
Rule © (2004-08-03 14:25) [15]Johnmen © (03.08.04 13:17) [14]
"без подключения к БД" это типа без обращения к СУБД, а именно с теми данными которые были получены, кстати один из минусов, если не были получены все данные (fetch all) то показывает не правильную сумму, а в последней версии кстати вроде исправлено, получается что тогда помимо открытия происходит "выгребание всех данны", но это относится к Клиент-Серверным СУБД, а в данной ветке вроде обсуждается Парадокс, которая оной не является, так что для автора по моему будет проще использовать грид, так как BDE который будет обрабатывать запрос на сумму все равно будет перебирать все записи а так как серверной части нет то это будет происходить в самом приложении, таким образом все способы сводятся к одному и томуже, просто это одно и тоже делают разные модули (части) (если перечислять то переборы делают BDE, DBGRIDEH или руками, вот автору и предстоит выбрать более удобный метод, так как по своей функциональности они очень похожи)
← →
Rule © (2004-08-03 14:27) [16]Rule © (03.08.04 14:25) [15]
Ну если кто-то чего то понял то хорошо, а то я такого накрутил, аж самому старшно стало, сори за сложность высказываний, просто голова уже кипит, баги вылавливаю вот и тяжко мне :)
← →
sloug © (2004-08-03 18:16) [17]Спаисбо за то, что откликнулись на мою просьбу. Я только начинающий и поэтому не знаю как SQL запрос вывести в TEdit или TDBEdit.
Очень понравилось предложение сергей1. Когда пишу так как предложил DSKalugin ©, программа почему-то виснет.
У меня еще вопрос, могу ли я в локальной базе данных использовать TClientDataSet, потом создать агрегатное поле, значение которого привсоить TDBEdit. Так же вроде можно.И что такое DBGRIDEH.
Надеюсь на ответы, и если можно подробнее.
← →
Johnmen © (2004-08-03 18:20) [18]>sloug ©
Тяга к знаниям похвальна.
Но не надо забывать, что здесь не курсы повышения квалификации и не курсы "Дельфи за 21 минуту".
Здесь ОТВЕЧАЮТ на КОНКРЕТНЫЕ вопросы !
← →
sloug © (2004-08-03 19:13) [19]Я сделал следующим образом:
Var Summ: real;
Begin
Summ:=0;
With Form2.Table1 Do
Begin
While not eof do
begin
Summ:=Summ+FieldByName("Summ").AsFloat;
next;
end;
end;
end;
Все нормально считает.
← →
Anatoly Podgoretsky © (2004-08-03 19:50) [20]sloug © (03.08.04 19:13) [19]
Теперь тоже самое сделай с "select sum(cost) from Table1" и сравни время, думаю будет значительно быстрее. А данные получить еще проще Query.Fields[0].AsFloat
DSKalugin совместно с CAD пробовал :-)
← →
DSKalugin © (2004-08-03 20:10) [21]ЧТОБЫ НЕ ВИСЛО надо добавить Next и обрамить тело цикла в Begin end. Пардон за ошибку
var s:Double;
c: LongInt;
begin
s:=0;
c:=Table1.RecNo; //запомним текущую позицию
Table1.DisableControls; //отключим пробег в DBGrid
Table1.First; // В начало таблицы
while not Table1.eof do begin
s:=s+Table1.FieldByName("Cost").asFloat;
Table1.Next;
end;
Table1.RecNo:=c; // возврат курсора на туже строку
Table1.EnableControls; //включаем курсор
label1.caption:=FloatToStr(s); //выводим результат
end;
С запросом на Query могут быть расхождения, если таблица окажется под фильтром. Тогда надо динамически формировать хвост WHERE
Так что при учете фильтрации это не проще будет.
← →
Johnmen © (2004-08-03 23:29) [22]>DSKalugin © (03.08.04 20:10) [21]
Вот-вот. И под фильтром ещё...:)
Так что запоминание позиции и возврат в нее делается не RecNo"мером, а с помощью закладок...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.037 c