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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2013, 02:20   #1
Neksion
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 29
По умолчанию Фильтрация по нескольким полям

Здравствуйте.
В программе существует фильтрация по нескольким полям, всего их пять.
И прописывать кодом все возможные комбинации будет довольно сложно и выглядеть это будет примерно так:
Код:
 Form1.Film.Filtered:=False;
        if (DBLookupCombo1.text<>'')and(DBLookupCombo2.text='')and(DBLookupCombo3.text='')and(Edit1.text='')then
          Form1.Film.Filter:='kod_zh='+quotedstr(Form1.GenreKod.asstring);
        if (DBLookupCombo2.text<>'')and(DBLookupCombo1.text='')and(DBLookupCombo3.text='')and(Edit1.text='')then
          Form1.Film.Filter:='kod_voz='+quotedstr(Form1.AgeKod.asstring);
        if (DBLookupCombo3.text<>'')and(DBLookupCombo1.text='')and(DBLookupCombo2.text='')and(Edit1.text='')then
          Form1.Film.Filter:='direc='+quotedstr(Form1.DirectorKod.asstring);
        if (Edit1.text<>'')and(DBLookupCombo1.text='')and(DBLookupCombo2.text='')and(DBLookupCombo3.text='') then
          Form1.Film.Filter:='name_f='+quotedstr(Edit1.Text);
        if (DBLookupCombo1.text<>'')and(DBLookupCombo2.text<>'')and(DBLookupCombo3.text='')and(Edit1.text='')then
          Form1.Film.Filter:='kod_zh='+quotedstr(Form1.GenreKod.asstring)+'and kod_voz='+quotedstr(Form1.AgeKod.asstring);
        if (DBLookupCombo1.text<>'')and(DBLookupCombo2.text='')and(DBLookupCombo3.text<>'')and(Edit1.text='')then
          Form1.Film.Filter:='kod_zh='+quotedstr(Form1.GenreKod.asstring)+'and direc='+quotedstr(Form1.DirectorKod.asstring);
        if (DBLookupCombo1.text='')and(DBLookupCombo2.text<>'')and(DBLookupCombo3.text<>'')and(Edit1.text='')then
          Form1.Film.Filter:='direc='+quotedstr(Form1.DirectorKod.asstring)+'and kod_zh='+quotedstr(Form1.GenreKod.asstring);
      Form1.Film.Filtered:=true;
Сравнений будет порядком более 20.
Есть ли какой-нибудь простой способ осуществить фильтрацию, не прописывая страницы кода?
Заранее благодарю.
Neksion вне форума Ответить с цитированием
Старый 06.06.2013, 07:27   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Есть ли какой-нибудь простой способ осуществить фильтрацию, не прописывая страницы кода?
SQL-запрос с параметрами
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 06.06.2013, 08:21   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
and(DBLookupCombo2.text='')and(DBLo okupCombo3.text='')and(Edit1.text=' ')
А зачем тут эти условия?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.06.2013, 11:50   #4
Neksion
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 29
По умолчанию

Цитата:
Есть ли какой-нибудь простой способ осуществить фильтрацию, не прописывая страницы кода?
Нужно без SQL.

Цитата:
А зачем тут эти условия?
Проверка изменен ли параметр для фильтрации, или же он пустой.
Neksion вне форума Ответить с цитированием
Старый 06.06.2013, 12:24   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Проверка изменен ли параметр для фильтрации
Ну а зачем такая проверка нужна? Какой в ней смысл, если ты вызываешь эту фильтрацию при определенных условиях все равно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.06.2013, 12:35   #6
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

не знаю прокатит ли.. попробуйте
Код:
Filter := Format("(%1:s=10 or field=%1:s)", [10]);
ежели чего то есть OnFilter (как то так вроде)

Последний раз редактировалось eval; 06.06.2013 в 12:37.
eval вне форума Ответить с цитированием
Старый 06.06.2013, 12:35   #7
Neksion
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 29
По умолчанию

Цитата:
Ну а зачем такая проверка нужна? Какой в ней смысл, если ты вызываешь эту фильтрацию при определенных условиях все равно.
Код:
 if (DBLookupCombo1.text<>'') then
Понятно.. спасибо.

Если другого способа нету, не подскажете тогда, что нужно почитать в SQL, чтобы создавать подобные запросы? 120 сравнений писать - на это весь день уйдет
Neksion вне форума Ответить с цитированием
Старый 06.06.2013, 12:41   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Опиши подробно задачу фильтрации.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.06.2013, 12:47   #9
Neksion
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 29
По умолчанию

Цитата:
Опиши подробно задачу фильтрации.
Есть DBGrid-таблица с пятью полями, условно: Наименование, Тип, Вид, Автор, Компания. Последние четыре поля формируются из других таблиц.
Так же на форме присутствует четыре DBLookupCombo, в которых выбираются Тип, Вид, Автор, Компания. И есть один Edit, в который вписывается Наименование.
И вот по этим полям нужно отфильтровывать записи по кнопке.
Neksion вне форума Ответить с цитированием
Старый 06.06.2013, 20:08   #10
Neksion
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 29
По умолчанию

Вот придумал способ, но выдает ошибку "project Profect1.exe raised exception class econverterror with message ''' is not a valid integer value" при выборе значения в Combobox'e или в Edit'e. Отладчик показал проблему в строчке:
Код:
Form1.Maintable.Filter:=stroka;
Вот сам код:
Код:
function func(stroka:string):Boolean; //Строка не пуста = истина
begin
    If Length(stroka)<>0 then
        result:=true
    else
        result:=False;
end;

procedure Filtration;
var stroka:string;
begin
    stroka:='';
    If Form3.Edit1.Text<>'' then
    Begin
        if func(stroka) then
            stroka:=stroka+' and ';
        stroka:=stroka+'Naim= '+QuotedStr(Form3.Edit1.Text+'*');
    end;
    If Form3.ComboBox1.ItemIndex<>0 then
    begin
        Form1.Typedoc.Filter:='naim= '+QuotedStr(Form3.ComboBox1.Text);
        Form1.Typedoc.Filtered:=true;
        if func(stroka) then
            stroka:=stroka+' and ';
        stroka:=stroka+'id= '+QuotedStr(Form1.TypedocId.AsString);
        Form1.Typedoc.Filtered:=false;;
    end;
    If Form3.ComboBox2.ItemIndex<>0 then
    begin
        Form1.Sort.Filter:='naim= '+QuotedStr(Form3.ComboBox2.Text);
        Form1.Sort.Filtered:=true;
        if func(stroka) then
            stroka:=stroka+' and ';
        stroka:=stroka+'id= '+QuotedStr(Form1.SortId.AsString);
        Form1.Sort.Filtered:=false;;
    end;
    If Form3.ComboBox3.ItemIndex<>0 then
    begin
        Form1.Company.Filter:='naim= '+QuotedStr(Form3.ComboBox3.Text);
        Form1.Company.Filtered:=True;
        if func(stroka) then
            stroka:=stroka+' and ';
        stroka:=stroka+'id= '+QuotedStr(Form1.CompanyId.AsString);
        Form1.Company.Filtered:=false;
    end;
    If Form3.ComboBox4.ItemIndex<>0 then
    begin
        Form1.Avtor.Filter:='FIO= '+QuotedStr(Form3.ComboBox4.Text);
        Form1.Avtor.Filtered:=True;
        if func(stroka) then
            stroka:=stroka+' and ';
        stroka:=stroka+'id= '+QuotedStr(Form1.AvtorId.AsString);
        Form1.Avtor.Filtered:=false;
    end;
    Form1.Maintable.Filter:=stroka;  //Вот эта та самая строка
    Form1.Maintable.Filtered:=true;
    if Form1.Maintable.IsEmpty then    //Если таблица пустая
    Begin
        Application.MessageBox('Запрашиваемых документов нет','Ошибка',MB_OK+mb_IconInformation);
        Form1.Maintable.Filtered:=False;
        Form3.ComboBox1.ItemIndex:=0;
        Form3.ComboBox2.ItemIndex:=0;
        Form3.ComboBox3.ItemIndex:=0;
        Form3.ComboBox4.ItemIndex:=0;
        Form3.Edit1.Text:='';
    end;
end;

Последний раз редактировалось Neksion; 06.06.2013 в 20:16.
Neksion вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск Locate по нескольким полям athleet Общие вопросы Delphi 5 22.05.2011 15:34
Реализация сортировки по нескольким полям mrMoRiC Общие вопросы C/C++ 1 23.02.2009 18:49
Фильтрация по нескольким полям в OnChenge Miha87 БД в Delphi 5 10.11.2008 18:49
Фильтрация по нескольким полям! Askat БД в Delphi 1 14.06.2007 06:44