Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2010, 14:41   #1
Марк Охман
Форумчанин
 
Аватар для Марк Охман
 
Регистрация: 05.02.2010
Сообщений: 153
Сообщение Среднее арифметическое в DBGrid

на форме db grid (на нем таблица из аксесовской БД через ADOConnection) как среднее арифметическое значений всех полей одной сторки с 3 и до последнего? и так со всеми строками (записями).
Я начинающий web-программист) Не судите строго, плиз! Буду очень стараться!
Марк Охман вне форума Ответить с цитированием
Старый 04.11.2010, 15:36   #2
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Навскидку...
Код:
var aAVG: double;

aAVG:=0;
for i:=2 to Table.FieldCount-1 do
aAVG:= aAVG + Table.Fields[i].asFloat;

aAVG:= aAVG / (Table.FieldCount - 3);

Последний раз редактировалось _SERGEYX_; 05.11.2010 в 14:19.
_SERGEYX_ вне форума Ответить с цитированием
Старый 04.11.2010, 15:43   #3
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Логичнее внести этот обработчик в событие OnCalcFields...
mihali4 вне форума Ответить с цитированием
Старый 04.11.2010, 17:21   #4
Марк Охман
Форумчанин
 
Аватар для Марк Охман
 
Регистрация: 05.02.2010
Сообщений: 153
По умолчанию

а куда этот код поместить?

Извините, но не совсем понял что вы имеете ввиду.. Поподробней расскажите пожалуйста. Что за CalcFields?

Я думаю что не рационально закрывать и окрывать ADOQuery для вычисления среднеарифметического каждой записи.

Нужно чтобы когда в любой ячейке вносятся изменения сразу менялось и среднее арифметическое в главной ячейке. Подскажите, как решить проблему?

18:14

а что если добавить какойнибудь обработчик в Events у DBGrid на OnUpdateData (это во вкладке DataSet)? нужно просто чтобы он, когда в какойнибудь строчке меняют значение одной из ячеек высчитывал новое значение средне арифметического и записывал его в главную ячейку. подскажите кто-нибудь, как его сделать, этот обработчик? Пожалуйста!!!

У нас принято пользоваться кнопочкой "Правка", дабы не плодить посты подряд, друг за другом.
Читаем правила. Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
Уважайте форумчан, и они ответят вам взаимностью...
Модератор
Я начинающий web-программист) Не судите строго, плиз! Буду очень стараться!

Последний раз редактировалось mihali4; 04.11.2010 в 18:31.
Марк Охман вне форума Ответить с цитированием
Старый 04.11.2010, 18:19   #5
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
Что за CalcFields?
Нужно создать еще одно поле, у которого
FieldKind:= fkCalculated;
Т.е. это виртуальное вычисляемое поле.
Обрабатывать нужно событие OnCalcFields.

Добавлю.
Про все это написано в штатном хэлпе, пользоваться которым для некоторых сродни пытке на дыбе.
Модератор.

Последний раз редактировалось mihali4; 04.11.2010 в 21:08.
_SERGEYX_ вне форума Ответить с цитированием
Старый 05.11.2010, 08:27   #6
Марк Охман
Форумчанин
 
Аватар для Марк Охман
 
Регистрация: 05.02.2010
Сообщений: 153
По умолчанию

Я сделал вот так (сделал именно так, потому что просто сидел и логиески размышлял и пришла вот такая идея, а то что было сказанновыше, я , если честно не совсем понял....)
Код:
 procedure TForm1.DataSource1UpdateData(Sender: TObject);
begin
sum:=0;
num:='';
t:='0123456789';
AdoQuery1.First;
repeat
   begin
    for i:=4 to DBGrid1.Columns.Count do
      if ansipos(' ТК',DBGrid1.Fields[i].AsString)<>0 then
         begin
         s:=DBGrid1.Fields[i].AsString;
         for j:=1 to length(s) do
               if pos(s[j],t)<>0 then
                    num:=num+s[j];
         sum:=sum+strtoint(num);
         end;
     AdoQuery1.FieldByName('ТК').Text:=floattostr((sum)/(DBGrid1.Columns.Count-4));
     AdoQuery1.Next;
     end until AdoQuery1.Eof;
end;
В ячейках информация вида 100 ТК; 84 ТК; 90 ТК;
На мой взгляд все правильно, но часто мнение мое и кампилятора расходятся)))
Он говорит что Stack Overflow. Все переменные обявлены в главном var.
Почему такая ошибка?
Может надо увеличитб stack? до скольки?
Я начинающий web-программист) Не судите строго, плиз! Буду очень стараться!

Последний раз редактировалось Марк Охман; 05.11.2010 в 11:07.
Марк Охман вне форума Ответить с цитированием
Старый 05.11.2010, 13:25   #7
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Лови пример, как работает калькулируемое поле.
Вложения
Тип файла: zip acc.zip (408.1 Кб, 31 просмотров)
_SERGEYX_ вне форума Ответить с цитированием
Старый 05.11.2010, 14:10   #8
Марк Охман
Форумчанин
 
Аватар для Марк Охман
 
Регистрация: 05.02.2010
Сообщений: 153
По умолчанию

а где указывается поле в которое скалькулировать??
Я начинающий web-программист) Не судите строго, плиз! Буду очень стараться!
Марк Охман вне форума Ответить с цитированием
Старый 05.11.2010, 14:28   #9
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Руками создается.
Правый клик по AdoQuery1 > Fields Editor.
Правый клик по редактору > New Field.
Name: произвольно
Type: float
Field Type: Calculated
Жмем ОК.
_SERGEYX_ вне форума Ответить с цитированием
Старый 07.11.2010, 14:00   #10
Марк Охман
Форумчанин
 
Аватар для Марк Охман
 
Регистрация: 05.02.2010
Сообщений: 153
По умолчанию

всетаки у меня не получается((( прошу, простите за тупость,но не получатся.
в данном примере показано как калькулировать поля в ADOTable, а у меня ADOQuery(и я не могу это опустить потому что очень большая часть программы на этом стоит: запросы, сортировки и т.д.) Как сделать калькуляцию для ADoQuery?
я использовал принцип калькуляции из примера в AdoQuery-->Events-->OnCalcFields.

Код:
sum:=0;
num:='';
t:='0123456789';
  aAVG := 0;
  for i := 4 to ADOQuery1.FieldCount-1 do
    begin
   if ansipos(' ТК',DBGrid1.Fields[i].AsString)<>0 then
         begin
         s:=DBGrid1.Fields[i].AsString;
            for j:=1 to length(s) do
               if ansipos(s[j],t)<>0 then
               num:=num+s[j];
         sum:=sum+strtoint(num);
         num:='';
         end;
    end;

 aAVG := sum / (ADOQuery1.FieldCount - 4);

  AdoQuery1.FieldByName('ТК').Calculated:=true;
  AdoQuery1.FieldByName('ТК').AsFloat:=Round(aAVG);
  end;
Результат - ничего. Абсолютно никакой реакции.
В ячейках, из которых берется информация для калькуляции, иформация в виде: 100 ТК; 85 РК; 90 ИК;
т.е. в столбец с именем ТК заносится среднее арифметическое всех ячеек в которых есть "ТК".
Очень прошу, подскажите что нитак.
Я начинающий web-программист) Не судите строго, плиз! Буду очень стараться!
Марк Охман вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Среднее арифметическое Seede1 Помощь студентам 4 10.10.2010 10:29
Среднее арифметическое. Deutch Помощь студентам 3 16.12.2009 21:18
Среднее арифметическое Golovastik Общие вопросы C/C++ 16 18.07.2009 16:47
среднее арифметическое Mashul'ka Помощь студентам 1 14.05.2009 19:33