Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Свойство Filter компонента ADOTable.

Читайте также:
  1. Диагностика результативного компонента правовой обученности
  2. Женское свойство (норов) и на свинье не объедешь.
  3. Методы и средства ограничения доступа к компонентам ЭВМ
  4. Получение катализаторов нанесением активного компонента на носитель
  5. Порядок реализации федерального компонента
  6. Свойство емкости

Filter – это строка, которая служит для задания критерия, по которому производится выборка записей. В ней нужно указать имя поля, по которому идет фильтрация, затем = (если нужно полное совпадение) либо LIKE (если мы хотим организовать поиск и по части слова) и само значение, по которому выбираются записи.

Допустим, есть таблица с полями Фамилия, Имя, Отчество. Нужно фильтровать данные по одному из полей (на выбор), т.е. пользователь должен иметь возможность выбрать по какому из полей фильтровать данные. Задача стоит такая отсеивать данные по мере ввода искомой строки в Edit.

Расположим на форме компоненты Combobox и Edit. Combobox будет использоваться для выбора столбца, а в Edit будет вводится искомое слово. Заполняем свойство Items в Combobox именами столбцов. Затем в обработчике события Edit1Change пишем следующее:

procedure TForm1.Edit1Change(Sender: TObject);
begin
if Length(Edit1.Text) > 0 then
begin
ADOTable1.Filtered:=false;
ADOTable1.Filter:=Combobox1.Text + ' LIKE ' + #39 + Edit1.Text + '%' + #39;
ADOTable1.Filtered:=true;
end
else ADOTable1.Filtered:=false;
end;

Прокомментирую код: если Edit не пустой (при пустом вылетит ошибка), отключаем фильтрацию, формируем строку фильтра, запускаем фильтрацию, если Edit пустой - отключаем фильтрацию.
В самом простом случае, если не нужно давать возможность выбора определенного столбца, а фильтровать по одному конкретному полю(например "ФАМИЛИЯ"), строка фильтра выглядела бы следующим образом: ADOTable1.Filter:='ФАМИЛИЯ LIKE '+ #39 + Edit1.Text + '%' + #39;

 

Строка-условие фильтра означает следующее - выбрать те записи из столбца 'ФАМИЛИЯ', которые начинаются с тех же символов, что и набраны в Edit1.Text.

Особое внимание обратите на пробелы - "потеряете" пробел - не будет работать.

Ключевое слово LIKE позволяет по заданному шаблону сравнивать строки. При этом нужно знать следующее:

символ '_' (подчеркивание) – заменяет любой одиночный символ,

символ '%' (процент) – заменяет любую последовательность из символов.

Знак #39 - означает номер символа ' (одинарная кавычка) в кодовой таблице ASCII. Дело в том, что значение на фильтрацию нужно указывать в одинарных кавычках, а так как одинарные кавычки используются в Delphi для ограничения строк, то чтобы внутри строки поставить одинарную кавычку, её нужно поставить дважды. Конструкция #39 + Edit1.Text + '%' + #39 идентична '''' + Edit1.Text + '%' + ''''.

Если, например, нужно искать любое вхождение искомой строки в записях, а не начиная с первого символа, то строка фильтра выглядела бы следующим образом:

ADOTable1.Filter:='ФАМИЛИЯ LIKE ' + #39 + '%' + Edit1.Text + '%' + #39;

Заметили '%' перед Edit1.Text? Переводится так - выбрать те записи из столбца 'ФАМИЛИЯ', в которых есть последовательность символов, которые набраны в Edit1.Text.

Часто нужно фильтровать по нескольким столбцам. Тут применяется немного иная конструкция.

Добавим еще два компонента Edit на форму. Combobox использовать не будем, его можно удалить, т.к. у нас каждое поле (Edit) будет отвечать за ввод информации по определенному столбцу. Еще добавим кнопочку, она будет запускать фильтрацию. Казалось бы, следующая конструкция должна корректно работать:

procedure TForm1.Button1Click(Sender: TObject);
begin
ADOTable1.Filtered:=false;
ADOTable1.Filter:='ФАМИЛИЯ LIKE '+ #39 + Edit2.Text + '%' + #39 +' AND ' + 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39 + ' AND ' + 'ОТЧЕСТВО LIKE ' + #39 + Edit4.Text + '%' + #39;
ADOTable1.Filtered:=true;
end;

Она и работает, но только в том случае, если данные введены во все три поля. Если одно из полей ввода(Edit) пустое - вылетает ошибка "Аргументы имеют неверный тип". Впрочем, есть способ с этим бороться. Сначала код:

procedure TForm1.Button1Click(Sender: TObject);
var filtr, // формируемая строка фильтра
add: string;
begin
ADOTable1.filtered:=false;
filtr:='';
if length(edit2.text) > 0 then
filtr:= 'ФАМИЛИЯ LIKE '+ #39 + Edit2.Text + '%' + #39;
if length(edit3.text) > 0 then
begin
if length(filtr) > 0 then add:= ' and ' else add:='';
filtr:=filtr + add + 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39;
end;
if length(edit4.text) > 0 then
begin
if length(filtr) > 0 then add:= ' and ' else add:='';
filtr:=filtr + add + 'ОТЧЕСТВО LIKE '+ #39 + Edit4.Text + '%' + #39;
end;
if length(filtr) > 0 then
begin
ADOTable1.Filter:= filtr;
ADOTable1.filtered:=true;
end
else Showmessage('Все поля пусты!');
end;

Смысл такой: нужно провести проверку, пустое поле ввода или нет, а затем уже формировать строку фильтра. Причем начиная со второго поля ввода нужно проверять и строку фильтра. Это нужно для последующего правильного формирования строки.

Например, если поле Edit2 (Фамилия) пустое, то соответственно и строка фильтра будет пуста (filtr:=''), а, например, поле Edit3 (ИМЯ) заполнено, это значит, строка фильтра должна иметь вид 'ИМЯ LIKE ' + #39 + Edit3.Text + '%' + #39, а не ' and ' + 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39, (т.е. без ' and ' вначале). Следующий фрагмент кода это и выполняет:

.....
if length(edit3.text) > 0 then
begin
if length(filtr) > 0 then add:= ' and ' else add:='';
filtr:=filtr + add + 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39;
end;
.....

Если Edit3 не пустое, то проверяем строку фильтра(filtr) если она не пуста, то прибавляем к сторке фильтра ' and ' + 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39, если пуста, то просто 'ИМЯ LIKE '+ #39 + Edit3.Text + '%' + #39.

Присваиваем сформированную строку(filtr) свойству ADOTable1.Filter и запускаем фильтрацию.

.....
if length(filtr) > 0 then
begin
ADOTable1.Filter:= filtr;
ADOTable1.filtered:=true;
end
else Showmessage('Все поля пусты!');
.....

Соответственно, если на этом этапе filtr='', значит, ни одно из полей не было заполнено, о чем и выводим соответствующую надпись.

Кроме операции and можно использовать и другие логические операции or, not, xor, при формирования строки-условия фильтрации по нескольким столбцам, хотя такая необходимость возникает достаточно редко.

8. Теперь рассмотрим организацию поиска через ADOQuery. Поиск можно осуществлять как на текущей, так и на другой форме.

9. Приступим к организации самого поиска. Для этого нам нужен компонент ADOQuery. Предварительно не забудьте «познакомить» формы и юниты друг с другом (см. рисунок ниже).

После этого в свойстве Connection компонента ADOQuery станет доступен компонент ADOConnection с формы1.

Следующее свойство, самое важное, отвечающее за сам поиск – свойство SQL. В него мы должны внести запрос, формирующий результирующую таблицу. К примеру, запрос на рисунке выбирает все поля из таблицы base, в которых значение поля price равно 55000. Последнее свойство, которое нужно указать – свойство Active устанавливаем в true.

Для отображения результата поиска нужны еще 2 компонента: DataSource (в свойстве DataSet указываем ADOQuery) для привязки результата к сетке таблицы на форме и сама таблица DBGrid (в свойстве DataSource указываем тот DataSource, который только что поместили на форму). Результат должен уже отобразиться в таблице.

 

10. Если вы хотите осуществлять несколько видов поиска, не обязательно для каждого из них делать отдельную форму и использовать отдельный компонент ADOQuery. К примеру, можно организовать это следующим образом:

Т.е. вносить значение в свойство SQL не вручную, а программно, по нажатию на кнопку ИСКАТЬ, в зависимости от выбранной радиокнопки. Это можно сделать при помощи команды ADOQuery.SQL.Add(…). В скобках указывается строка запроса.


Дата добавления: 2015-11-28; просмотров: 389 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.008 сек.)