Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Сложение, вычитание, умножение, деление, проценты


Автор: Sett 19.4.2005, 22:47
Доброго времени суток Всем!

У меня вопрос, делаю базы, пользуюсь компонентами: Table1, DataSource1 and DBGrid1. Вопрос заключается вот в чём, в принципе понемногу осваиваю возможности что гдето придумываю и вроде всё получается.

Но ни как не могу разобраться как можно вести подсчёт ячеек, то есть в одном столбце есть много цифр, меня интересует как сделать так чтобы данный столбец посчитался (сложился, умножился, разделился, - не важно) сам по себе и вывел СУММУ в каком нибудь Label1.Caption ?

Друзья мои кто может помогите, уже и не знаю что придумать у самого не получается вообще!

Автор: Петрович 19.4.2005, 23:11
Используй вместо tDBGrid например tDBGridEh из библиотеки EhLib. Там есть подсчет агрегативных функций. Либо пользуйся SQL-запросами с агрегативными функциями.

Автор: DimW 20.4.2005, 07:53
Цитата
Используй вместо tDBGrid например tDBGridEh из библиотеки EhLib.


Сам пользуюсь этой библиотекой. Библиотека просто супер!!!
Но Sett кликать мышью можно научиться всегда, а вот понять как это насамом деле работает для тебя будет наверное лучше... Тем более
Цитата
в принципе понемногу осваиваю возможности что гдето придумываю и вроде всё получается.


так вот:

допустим Table1 возвращает все записи из таблицы Table_Name;
допустим тебе нужно подсчитать сумму поля Field_name из таблицы Table_Name;
кидаешь на форму Query и прописываешь SQL:
Код

SELECT SUM(FIELD_NAME) AS SUM_FIELD_NAME
FROM TABLE_NAME;


при выполнении Query возвратьт сумму по полю Field_name в SUM_FIELD_NAME.

Затем ты хочешь:
Цитата
вывел СУММУ в каком нибудь Label1.Caption


При нажатии на кнопку или еще что нить.... :
Код

begin
Query.close;
Query.open;
Label1.Caption:=Query.FieldByName('SUM_FIELD_NAME').AsString;
end;


З.Ы. главное чтобы Table и Query возвращали одинаковый набор данных т.е. условия выбора данных были одинаковые...





Автор: offline 20.4.2005, 17:42
действительно, EhLib супер, ставь и не будет головных болей.

можно как посоветовал DimW но это SQL. Если ты с ним не знаком, то есль оди выход, но это на рациональный способ.
Повесь на обработчики событий компонента DataSource цикл, который пробегает от первой записи и до последней, вычисляет нужные операции и скидывает значения куда тебе нужно, но это не красивый способ, хотя работает правильно smile

Автор: DimW 21.4.2005, 07:33
Цитата
но это не красивый способ

еще какой!!!!
Цитата
хотя работает правильно

но долго!!!

И вообще если человек хочет заниматься БД, то SQL это язык без которого не возможно построить грамотное приложение!!!

Автор: offline 21.4.2005, 12:34
Цитата
И вообще если человек хочет заниматься БД, то SQL это язык без которого не возможно построить грамотное приложение!!!


Согласен на все 100%
Но если человек только начал разбираться, а проект горит, то пусть выкрутиться некрасивыми методами. А уж когда овладеет секретом SQL smile, то все карты в руки переделывать старые проекты.

Автор: Sett 21.4.2005, 22:32
Я благодарен, за помощь. Но критики то зачем столько по поводу, как я программирую.
Я начинающий, далеко не любитель, а видь разница огроманая (начинающий - любитель).
Освоюсь возмусь за SQL, но пока по простому.

Да, kirilllius, подскажи пожалуйста как делать цикл, любой простой пример, а то не знаю
как smile , спасибо.

И если можешь покажи пожалуйста пример, какой нибудь математической функции,
типа:
2+2=4
2*8=16
18 поделить на 6 = 3

////////////////////

в одно Edit'e.Text= 2

функция сложить

в другом Edit'e.Text= 3

нажимаем кнопку и получаем ответ в Label1.Caption = 5

Автор: DimW 22.4.2005, 07:29
Label1.Caption:=FloatToStr(StrToFloat(Edit1.text)+StrToFloat(Edit2.text));

или StrToInt для целых чисел.

Цитата
Но критики то зачем столько по поводу, как я программирую.


Ды некто тебя не критекует, просто пытаемся помоч... smile
Добавлено @ 07:37
вопрос был не комне, но отвечу по поводу цикла:

Код

var
i:integer;
m:Real;
-------------------------------------------------------
m:=0;
Table1.First;//становимся на первую запись...
for i:=1 to Table1.RecordCount do
begin
m:=m+Table1.FieldByName('поле_которое_нужно_просуммировать').AsFloat;
Table1.next;// переходим на следущую...
end;
Label1.Caption:=FloatToStr(m);


Так можно просуммировать поле.

Автор: Петрович 22.4.2005, 12:19
Цитата(DimW @ 22.4.2005, 08:29)
вопрос был не комне, но отвечу по поводу цикла:
Приведенный код может не всегда корректно работать поскольку для некоторых СУБД значение RecordCount может быть недействительным.
Правильнее будет:
Код

var
  i:integer;
 m:Real;
...
  m:=0;
  Table1.First;//становимся на первую запись...
  while  not Table1.EOF  do begin  // пока не достигли конца набора данных
    m:=m+Table1.FieldByName('поле_которое_нужно_просуммировать').AsFloat;
    Table1.next;// переходим на следущую...
  end;
  Label1.Caption:=FloatToStr(m);

Добавлено @ 12:21
А еще, что-бы побыстрее работало, можно сделать так:
Код

var
  i:integer;
  m:Real;
  f:tField;
...
  m:=0;
  Table1.First;//становимся на первую запись...
  f := Table1.FieldByName('поле_которое_нужно_просуммировать'); // поле которое суммируем
  while  not Table1.EOF  do begin  // пока не достигли конца набора данных
    m:=m+f.AsFloat;
    Table1.next;// переходим на следущую...
  end;
  Label1.Caption:=FloatToStr(m);

Автор: Sett 25.4.2005, 23:28
Очень благодарен. Спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)