![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте уважаемые светлые головы в области Delphi7.
Почему именно светлые, да потому, что у меня дома куча литературы по Delphi7, и ни где нет примера как просуммировать отобранные по фильтру в DBGrid записи из базы данных. Кто ни будь имел место сталкиваться с такой проблемой? Если да, то поделитесь опытом пожалуйста. Надеюсь на профессиональный ответ профессионального человека. Лучше, если это будет живой код а не слова. ![]() |
#2
|
|||
|
|||
![]() Варианты:
1. Выполнить соответсвующий запрос с точно таким-же фильтром. 2. Пройти по DataSet'у и руками проверить (проссумировать) записи по такому-же фильтру. 3. Фильтр делать на основе обработчика OnFilterRecord и пройтись по DataSet'у и проссумировать записи. Выбирай что больше нравится ![]() ИМХО, код тут для примера не нужен, т.к. логика и так понятна. |
#3
|
||||
|
||||
![]() + как вариант можно использовать компоненты EhLib ... там в Гриде встроенная функция сумирования
Поживу - увижу, Доживу - узнаю, Выживу - учту. ![]() [P.S.]->Выражая благодарность за помощь - Вы получаете шанс на помощь в следующий раз
|
#4
|
|||
|
|||
![]() Это фильтр
Код:
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
|
|||
|
|||
![]() Код:
Query2.SQL.Add('select sum(Kolichestvo_fact) from Naryd where '+Table1.Filter); И еще замечание. Маскированное сравнение строк производится с помощью знака %, а не *. И работает только с оператором LIKE. |
#6
|
|||
|
|||
![]() Спасибо за совет, но есть ещё вопрос. Вот код.
Код:
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; Этот код по одному нажатию кнопки реализует два SQL запроса, это видно. Появилась небольшая неприятность связанная с тем, что когда я произвожу очистку поля фильтра Edit1, при повторном нажатии кнопки Button10 возникает следующая вещь - 1й раз выводится предварительный SQL (все записи из базы)- их сумма, 2й раз - отфильтрованные записи - их сумма. По нажатию другой кнопки поле фильтра стирается (код не привожу и так понятно), по нажатию всё той же второй кнопки производится стирание и очистка SQL. Но при этом память не стирается. Получается что запросы висят в памяти, и по раз-два Click по очереди выводятся в Edit2. В чем может быть причина? Последний раз редактировалось Admin, 25.03.2009 в 16:36. |
#7
|
||||
|
||||
![]() Код:
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); Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#8
|
|||
|
|||
![]() Править Query.SQL можно. Просто кверя в этом случае либо не прореагирует, либо просто отключится (в зависимости от самого контрола).
Там ошибки в другом: 1. Если Table1.Filter не заполнен, то при выполнении запроса получим ошибку. Я же просто для примера написал. Надо проверять - есть ли уже условие в Table1.Filter и тогда либо добавлять 'WHERE ' + Table1.Filter, либо не трогать запрос. 2. Перед тем, как ввести в Query2 новый зпрос неплохо бы очистить то, что там уже есть. А в F он получает индекс добавленого запроса в списке строк Query2.SQL ![]() |