Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.03.2009, 15:16
prog64free prog64free вне форума
Прохожий
 
Регистрация: 21.03.2009
Сообщения: 3
Репутация: 10
По умолчанию Суммирование записей DBGrid по фильтру

Здравствуйте уважаемые светлые головы в области Delphi7.

Почему именно светлые, да потому, что у меня дома куча литературы по Delphi7, и ни где нет примера как просуммировать отобранные по фильтру в DBGrid записи из базы данных. Кто ни будь имел место сталкиваться с такой проблемой? Если да, то поделитесь опытом пожалуйста.
Надеюсь на профессиональный ответ профессионального человека.
Лучше, если это будет живой код а не слова.
Ответить с цитированием
  #2  
Старый 23.03.2009, 15:38
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Варианты:
1. Выполнить соответсвующий запрос с точно таким-же фильтром.
2. Пройти по DataSet'у и руками проверить (проссумировать) записи по такому-же фильтру.
3. Фильтр делать на основе обработчика OnFilterRecord и пройтись по DataSet'у и проссумировать записи.

Выбирай что больше нравится
ИМХО, код тут для примера не нужен, т.к. логика и так понятна.
Ответить с цитированием
  #3  
Старый 23.03.2009, 20:08
Аватар для Yurk@
Yurk@ Yurk@ вне форума
Специалист
 
Регистрация: 07.09.2007
Адрес: Украина, г. Днепропетровск
Сообщения: 892
Версия Delphi: 7 + ОгнеПтица
Репутация: выкл
По умолчанию

+ как вариант можно использовать компоненты EhLib ... там в Гриде встроенная функция сумирования
__________________
Поживу - увижу, Доживу - узнаю, Выживу - учту.
[P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
Ответить с цитированием
  #4  
Старый 24.03.2009, 15:25
prog64free prog64free вне форума
Прохожий
 
Регистрация: 21.03.2009
Сообщения: 3
Репутация: 10
По умолчанию Попробую ещё раз, но уже так. Код ниже

Это фильтр

Код:
procedure TForm1.Edit1Change(Sender: TObject);       //поиск фильтр
begin
  // Поиск
  if  RadioGroup1.ItemIndex = 0   //по номеру наряда
  then
    begin
      // Фильтрация данных по первым первым буквам
      Table1.Filter := 'Kod_N = '''+Edit1.Text+'*''';

      // Включаем фильтрацию, если поле ввода "не пустое"
     Table1.Filtered := True;

end;

  if  RadioGroup1.ItemIndex = 1     //по наименование
   Then
    begin
      // Фильтрация данных по первым первым буквам
     Table1.Filter := 'Naimenovanie = '''+Edit1.Text+'*''';

      // Включаем фильтрацию, если поле ввода "не пустое"
     Table1.Filtered := True;

 end;
   if  RadioGroup1.ItemIndex = 2     //по цене
   Then
    begin
      // Фильтрация данных по первым первым буквам
     Table1.Filter := 'Chena = '''+Edit1.Text+'*''';

      // Включаем фильтрацию, если поле ввода "не пустое"
     Table1.Filtered := True;

 end;
     if  RadioGroup1.ItemIndex = 3     //по номеру нового
   Then
    begin
      // Фильтрация данных по первым первым буквам
     Table1.Filter := 'Kolichestvo_fact = '''+Edit1.Text+'*''';

      // Включаем фильтрацию, если поле ввода "не пустое"
     Table1.Filtered := True;
end;

  if  RadioGroup1.ItemIndex = 4     //по номеру нового
   Then
    begin
      // Фильтрация данных по первым первым буквам
     Table1.Filter := 'Summa_fact = '''+Edit1.Text+'*''';

      // Включаем фильтрацию, если поле ввода "не пустое"
     Table1.Filtered := True;
end;

 if  RadioGroup1.ItemIndex = 5     //по номеру нового
   Then
    begin
      // Фильтрация данных по первым первым буквам
     Table1.Filter := 'Kolichestvo_buxgal = '''+Edit1.Text+'*''';

      // Включаем фильтрацию, если поле ввода "не пустое"
     Table1.Filtered := True;


     end;

   if  RadioGroup1.ItemIndex = 6     //по номеру нового
   Then
    begin
      // Фильтрация данных по первым первым буквам
     Table1.Filter := 'Summa_buxgal = '''+Edit1.Text+'*''';

      // Включаем фильтрацию, если поле ввода "не пустое"
     Table1.Filtered := True;


     end;
    end;

Это запрос к базе

Код:
procedure TForm1.Button10Click(Sender: TObject);     //+++++++++++++++++++++  +++++
begin
  Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('select sum(Kolichestvo_fact) from Naryd;');
Query2.Open;
Edit2.Text:=Query2.Fields[0].AsString;
end;

lmikle: Где теги?

Сумму SQL дает по базе. А мне нужен запрос, который из DBGrid выберет сумму в столбце, которая находится на данный момент в DBGrid отобранная фильтром.

Т.е. нужно увязать две вещи SQL и DBGrid.

Собственно нужен правильно сгенерированный SQL запрос на выбор данных из DBGrid.
Ответить с цитированием
  #5  
Старый 24.03.2009, 15:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Код:
Query2.SQL.Add('select sum(Kolichestvo_fact) from Naryd where '+Table1.Filter);

И еще замечание. Маскированное сравнение строк производится с помощью знака %, а не *. И работает только с оператором LIKE.
Ответить с цитированием
  #6  
Старый 25.03.2009, 16:08
prog64free prog64free вне форума
Прохожий
 
Регистрация: 21.03.2009
Сообщения: 3
Репутация: 10
По умолчанию Суммирование записей

Спасибо за совет, но есть ещё вопрос. Вот код.
Код:
procedure TForm1.Button10Click(Sender: TObject);     //+++++++++++++++++++++  +++++
var
F:Integer;
begin
Query2.Close;
Query2.SQL.Clear;

if Edit2.Text<>'' Then Begin

Query2.SQL.Add('select sum(Kolichestvo_fact) from Naryd where '+Table1.Filter);
Query2.Open;
F:= Query2.SQL.Add('select sum(Kolichestvo_fact) from Naryd where '+Table1.Filter);
Edit2.Text:=intToStr(F);

end else

if Edit2.Text='' Then begin

Query2.SQL.Add('select sum(Kolichestvo_fact) from Naryd;');
Query2.Open;
Edit2.Text:=Query2.Fields[0].AsString;

end;
Query2.Close;
Query2.SQL.Clear;

//+++++++++++++++++++++

end;
Admin: Пользуемся тегами, иначе последуют санкции!

Этот код по одному нажатию кнопки реализует два SQL запроса, это видно. Появилась небольшая неприятность связанная с тем, что когда я произвожу очистку поля фильтра Edit1, при повторном нажатии кнопки Button10 возникает следующая вещь - 1й раз выводится предварительный SQL (все записи из базы)- их сумма, 2й раз - отфильтрованные записи - их сумма. По нажатию другой кнопки поле фильтра стирается (код не привожу и так понятно), по нажатию всё той же второй кнопки производится стирание и очистка SQL. Но при этом память не стирается. Получается что запросы висят в памяти, и по раз-два Click по очереди выводятся в Edit2. В чем может быть причина?

Последний раз редактировалось Admin, 25.03.2009 в 16:36.
Ответить с цитированием
  #7  
Старый 25.03.2009, 16:32
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Код:
Query2.SQL.Add('select sum(Kolichestvo_fact) from Naryd where '+Table1.Filter);
Query2.Open;
F:= Query2.SQL.Add('select sum(Kolichestvo_fact) from Naryd where '+Table1.Filter);
Edit2.Text:=intToStr(F);
И у вас это код проходит без ошибок? А мне казалось, что при открытом Query2 править для него свойство SQL нельзя. Да и вообще мне честно говря непонятно, что вы в F пытаетесь получить таким макаром?
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 25.03.2009, 18:03
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Править Query.SQL можно. Просто кверя в этом случае либо не прореагирует, либо просто отключится (в зависимости от самого контрола).

Там ошибки в другом:
1. Если Table1.Filter не заполнен, то при выполнении запроса получим ошибку. Я же просто для примера написал. Надо проверять - есть ли уже условие в Table1.Filter и тогда либо добавлять 'WHERE ' + Table1.Filter, либо не трогать запрос.
2. Перед тем, как ввести в Query2 новый зпрос неплохо бы очистить то, что там уже есть.

А в F он получает индекс добавленого запроса в списке строк Query2.SQL
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:08.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025