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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2012, 23:11   #1
Fexys
 
Аватар для Fexys
 
Регистрация: 22.01.2012
Сообщений: 4
По умолчанию OnFilterRecord. Работает, но немного криво :)

Доброго времени суток.
Описание: Сделано представление в SQL Server выведено в DBGrid с сортировкой по названию (в IndexFieldNames). Написал фильтр который вроде более оптимальный (т.к. AdoTable и вывод DBGrid находятся на разных формах).

Код:
procedure TDM.TVDorFilterRecord(DataSet: TDataSet; var Accept: Boolean);
var
  j,s,n,g,r,k : string; //для значения поля
begin
  //получаем столько начальных букв из поля Жанр, сколько букв имеется в переменной j:
  r := Copy(DataSet['Rej'], 1, Length(Rej));
  j := Copy(DataSet['Janr'], 1, Length(Janr));
  s := Copy(DataSet['Str'], 1, Length(Str));
  n := Copy(DataSet['NazvRus'],1,Length(Nazv));
  g := Copy(DataSet['God'], 1, Length(God));
  //делаем проверку на совпадение значений
  Accept := (g = God) and (s = Str) and (j = Janr) and (r = Rej) and (n = Nazv);
end;
Код:
procedure TForm12.Edit1Change(Sender: TObject);   // Представление Фильмы 
begin
  if Edit1.Text <> '' then begin
    DM.TVDor.Filtered:= False;
    Rej := Edit1.Text;
    DM.TVDor.Filtered:= True;
  end
  else  DM.TVDor.Filtered:= False;
end;
// и т.д. на 5 Edit ов

Проблема: Фильтрация проводится. Но почему-то не действует DM.TVDor.Filtered:= False;. Если точнее..
После 1-ой фильтрации данные в Edit1-5 не чистятся (Refresh\Cancel\CancelUpdate.. и просто стиранием). Т.е. ввожу год - 2011, жанр - драма, далее стираю год переписываю жанр на комедию ничего не выводит из-за того, что год остался в буфере 2011.

А и за одно подскажите пожалуйста, как сделать, чтоб окно представления обновлялось(отменялся фильтр\сорт и добавлялись данные, которые в основном окне добавляются).

P.s. Метод тыка не помогает, Google тож молчит. Строго не судите, в делфи ковырялся давно и поверхностно.

Последний раз редактировалось Fexys; 22.01.2012 в 23:14.
Fexys вне форума Ответить с цитированием
Старый 22.01.2012, 23:39   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Написал фильтр который вроде более оптимальный
SQL-фильтры всегда более оптимальны фильтров на клиенте, не зависимо от того, на каких формах находятся Query и гриды.
Цитата:
далее стираю год переписываю жанр на комедию ничего не выводит из-за того, что год остался в буфере 2011
В каком буфере? У вас в фильтре идет сравнение со значениями в символьных переменных. Меняете (стираете) значение в любом из EDIT-ов - меняйте и значение в соответствующей переменной, на автомате программа это не сделает. А OnChagne сделал бы примерно так для Edit1.Text (для остальных похоже):
Код:
  DM.TVDor.Filtered:= False;
  Rej := Edit1.Text;
  DM.TVDor.Filtered:= (Rej<>'') and (Janr<>'') and (Str<>'') and (NazvRus<>'') and (God<>'');
P.S. ИМХО - изменение фильтра по OnChange не есть хорошо
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 22.01.2012 в 23:48.
Аватар вне форума Ответить с цитированием
Старый 23.01.2012, 00:04   #3
Fexys
 
Аватар для Fexys
 
Регистрация: 22.01.2012
Сообщений: 4
По умолчанию

Цитата:
DM.TVDor.Filtered:= (Rej<>'') and (Janr<>'') and (Str<>'') and (NazvRus<>'') and (God<>'');
Так фильтр перестает работать.
Цитата:
P.S. ИМХО - изменение фильтра по OnChange не есть хорошо
А как лучше?
До этого я делал через RadioGroup без фильтра в адо, но там тоже была проблема с отменой фильтра.
Fexys вне форума Ответить с цитированием
Старый 23.01.2012, 00:15   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Так фильтр перестает работать.
Почему перестанет? В вашем коде и предусмотрено, что фильтр работает только тогда, когда все Edit-ы не пустые. Или я чего-то не понял? В любом случае ваш OnChage дерьмовый. Как вы фильтр организовать вообще хотите? Всегда что бы были заданы все 5 условий? Или можно и по одному, двум условиям? В том случае это совершенно другое код должен быть в OnFilterRecord. А пока он требует всех 5 условий.
Цитата:
А как лучше?
Лучше или хуже это вам решать. Я бы предпочел сделать Button 'Применить' и после нужных изменений по клику буттона менял фильтр.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.01.2012 в 00:21.
Аватар вне форума Ответить с цитированием
Старый 23.01.2012, 00:25   #5
Fexys
 
Аватар для Fexys
 
Регистрация: 22.01.2012
Сообщений: 4
По умолчанию

Цитата:
когда все Edit-ы не пустые
и точно.
Спс за подсказки. Как просплюсь буду думать как сделать фильтр и по нескольким сразу, и по одному.
Fexys вне форума Ответить с цитированием
Старый 23.01.2012, 00:39   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ставим так задачу (например): фильтровать только по не пустым полям
Код:
procedure TDM.TVDorFilterRecord(DataSet: TDataSet; var Accept: Boolean);
begin
  Accept:=((God='') or (Copy(DataSet['God'],1,Length(God))=God)) and 
          ((Rej='') or (Copy(DataSet['Rej'], 1, Length(Rej))=Rej)) and 
          ((Janr='') or (Copy(DataSet['Janr'], 1, Length(Janr))=Janr)) and 
          ((Str='') or (Copy(DataSet['Str'], 1, Length(Str))=Str)) and 
          ((NazvRus='') or (Copy(DataSet['NazvRus'], 1, Length(NazvRus))=NazvRus));
end;

procedure TForm12.Edit1Change(Sender: TObject);
begin
  DM.TVDor.Filtered:= False;  //убрать если использовать Button 'Применить'
  Rej := Edit1.Text;
  DM.TVDor.Filtered:=True;    //убрать если использовать Button 'Применить'
end;

{если использовать Button 'Применить'}
procedure TForm12.Button1Click(Sender: TObject);
begin
  DM.TVDor.Filtered:= False;
  DM.TVDor.Filtered:=True;
end;
add

Если использовать Button 'Применить', то OnChange вообще можно убрать, а все присвоения значение Edit-ов в переменные перетащить в Button1Click
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 23.01.2012 в 09:24.
Аватар вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сайт криво работает в IE8 Стас22 HTML и CSS 7 28.12.2011 07:52
простейший алгоритм а работает криво Lokos Общие вопросы Delphi 7 27.10.2010 16:21
программа работает криво Юрий_91 Общие вопросы C/C++ 1 25.04.2010 08:40
почему DrawText криво работает? STill_ace Общие вопросы C/C++ 11 24.08.2009 15:57
Криво работает polygon ROD Общие вопросы C/C++ 5 06.02.2009 20:54