Слайд 1Тема:
Поиск записей.
Сортировка и фильтрация записей в наборе данных
Слайд 2Поиск записей
Поиск записи, удовлетворяющей определенным условиям, означает переход на эту запись.
Для
поиска записей используют метод
Locate ( KeyField, KeyValues, Options ):Boolean
который ищет запись с заданными значениями полей.
Указатель устанавливается на первую встреченную запись, удовлетворяющую условию поиска.
Если запись найдена, то Locate=true, если нет, то Locate=false.
В параметре KeyField указывается список полей (через ;), по которым ведется поиск;
KeyValues – указывается значение полей для поиска;
Слайд 3Options – задает значения, которые обычно используются для поиска строк.
Параметр
Options может принимать комбинацию значений:
loCaseInsensitive – регистр букв не учитывается (Петров=ПеТрОв=петров= …);
loPartialKey – допускается частичное совпадение значений (петров=п=петр=…).
Значения записываются в [].
Пример.
adotable1.Locate ( ‘Kod’, 123, []);
– в результате выполнения оператора указатель записи установится на запись, у которой в поле Kod равно числу123.
Слайд 4Поиск записей по нескольким полям
В методе Locate параметр KeyValues является массивом
Variant, в котором содержится несколько значений.
Функция VarArrayOf – приводит к типу вариантного массива.
Значения функции разделяются « , » и заключаются в []; порядок значений соответствует порядку полей параметра KeyField.
Пример
adotable1.Locate ( ‘Tovar;Kolvo’,
Vararrayof (['Шоколад', '150‘]), [ ] );
Слайд 5Индексирование баз данных
В таблицах могут определяться ключи и индексы. Ключ –
это комбинация полей, данные в которых однозначно определяют каждую запись в таблице. Простой ключ состоит из одного поля, составной из нескольких полей. Поля, по которым построен ключ, называют ключевыми.
Индекс, как и ключ, строится по полям таблицы, однако, он может допускать повторение значений составляющих его полей.
Установка ключей и создание индексов выполняется в процессе разработки структур таблиц базы данных.
В НД adoTable указание текущего индекса возможно с помощью свойства IndexFieldNames, которое содержит имя поля, для которого был создан индекс.
Например,
adoTable1.IndexFieldNames:='Tovar';
Слайд 6Сортировка набора данных
Сортировка – это упорядочивание записей по полю или группе
полей в порядке убывания или возрастания содержащихся в них значений.
Сортировка НД adoTable выполняется автоматически по текущему индексу. При смене индекса происходит автоматическое переупорядочивание записей.
Есть возможность сортировки данных и по неиндексированным полям.
Для этого используется свойство НД свойство Sort.
Слайд 7
Для сортировки в свойство Sort помещают список полей сортировки, разделенных запятыми.
Каждое поле может дополнительно снабжаться признаками ascending (ASC) или descending (DESC) для указания соответственно восходящего или нисходящего порядка сортировки.
Если ни одно из этих слов не указано, реализуется восходящая сортировка.
Пример:
ADOtablel.Sort := 'Name ASC, Date DESC’;
Слайд 8Фильтрация записей
Фильтрация – это задание ограничений для записей, отбираемых в набор
данных.
Состав записей в НД в данный момент зависит от установленных ограничений, в том числе и от фильтров.
При использовании фильтрации по выражению набор данных ограничивается записями, удовлетворяющими выражению фильтра, задающему условия отбора записей.
Слайд 9Свойство Filter типа Srting компонента adoTable – задает выражение фильтра.
В
его состав могут входить элементы:
имена полей таблиц;
литералы – значение, заданное явно (число, строка или символ). В выражение фильтра включаются только выражения строкового типа.
операции сравнения (<, >, =, >=, <=, <>);
арифметические операции (+, -, *, /);
логические операции (and, or, not);
( ) и [ ] скобки.
Слайд 10Если имя поля содержит пробелы, то его заключают в [ ]
(например, [Name Firma] = 'Слад&Ко'), в противном случае [ ] необязательны.
Нельзя использовать в выражении фильтра имена переменных. Если в выражение фильтра требуется включить значение переменной или свойство какого-нибудь компонента, то это значение должно быть преобразовано в строковый тип.
Для того чтобы вставить в выражение апостроф, удобнее пользоваться обращением по коду, зная что код апострофа в кодовой таблице равен 39 (в программе#39).
Например,
ADOTable1.Filter:=' Tovar = '+#39+'Макароны'+#39;
ADOTable1.Filter:=' Tovar = '+#39+ edit1.text +#39;
ADOTable1.Filter:= ' Cena >=150 and Cena <= 500';
ADOtable1.Filter:= ' [количество товара] < 100';
ADOtable1.Filter:='[количество товара]< '+#39+edit1.text+#39;
Слайд 11Для активизации и деактивизации фильтра используется свойство Filtered типа Boolean.
Если
Filtered=True, то фильтрация включается, и НД отбираются записи, которые удовлетворяют фильтру, записанному в свойстве Filter.
Если Filtered=False (по умолчанию), то фильтрация выключена.
Например:
ADOTable1.Filter:='[ФАМИЛИЯ] LIKE '+#39+Edit1.Text +'%'+ #39;
{теперь включаем фильтр}
ADOtable1.Filtered:=true;
Слайд 12Разберем строку фильтра:
'[ФАМИЛИЯ] LIKE '+#39+Edit1.Text +'%'+ #39;
Оно означает следующее - выбрать
те записи из столбца 'ФАМИЛИЯ', которые начинаются с тех же символов, что и набраны в Edit1.Text. Особое внимание обратите на пробелы - "потеряете" пробел - не будет работать.
Ключевое слово LIKE позволяет по заданному шаблону сравнивать строки. При этом нужно знать следующее:
символ '%' (процент) – заменяет любую последовательность из символов.
Знак #39 - означает номер символа ' (одинарная кавычка) в кодовой таблице ASCII.
Слайд 13Конструкция
#39 + Edit1.Text + '%' + #39
идентична
'''' + Edit1.Text + '%'
+ ''''
Можно также использовать спец. функцию QuotedStr, которая возвращает строку окаймленную одинарными кавычками.
Примеры одинаковых фильтров в разных формах записи:
ADOTable1.Filter:='ФАМИЛИЯ LIKE '+ '''' + Edit1.Text + '%' + '''';
ADOTable1.Filter:='ФАМИЛИЯ LIKE '+ QuotedStr(edit1.Text+ '%');
ADOTable1.Filter:='ФАМИЛИЯ LIKE '+ #39 + Edit1.Text + '%' + #39;
Слайд 14Если, например, нужно искать любое вхождение искомой строки в записях, а не начиная
с первого символа, то строка фильтра выглядела бы следующим образом:
ADOTable1.Filter:='ФАМИЛИЯ LIKE ' + #39 + '%' + Edit1.Text + '%' + #39;
Часто нужно фильтровать по нескольким столбцам, например по Фамилии, Имени и Отчеству. Это можно сделать так:
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOTable1.Filtered:=false;
ADOTable1.Filter:='ФАМИЛИЯ LIKE ‘
+ #39 + Edit1.Text + '%' + #39 +' AND '
+ 'ИМЯ LIKE '+ #39 + Edit2.Text + '%' + #39
+ ' AND ' + 'ОТЧЕСТВО LIKE ' + #39 + Edit3.Text +
'%' + #39;
ADOTable1.Filtered:=true;
end;
Слайд 15Строка фильтра работает, но только в том случае, если данные введены во
все три поля. Если одно из полей ввода(Edit) пустое - вылетает ошибка "Аргументы имеют неверный тип".
Чтобы избежать этой ошибки, код может быть записан в виде:
var filtr, // формируемая строка фильтра
add: string; //название логической операций
begin
ADOTable1.filtered:=false;
filtr:='';
if length(edit1.text) > 0 then
filtr:= 'ФАМИЛИЯ LIKE '+ #39 + Edit1.Text + '%' + #39;
if length(edit2.text) > 0 then
begin
if length(filtr) > 0 then add:= ' and ' else add:='';
filtr:=filtr + add + 'ИМЯ LIKE '+ #39 + Edit2.Text + '%' + #39;
end;
Слайд 16
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(filtr) > 0 then
begin
ADOTable1.Filter:= filtr;
ADOTable1.filtered:=true;
end
else Showmessage('Все поля пусты!');
end;
Т.е., нужно провести проверку, пустое поле ввода или нет, а затем уже формировать строку фильтра. Причем начиная со второго поля ввода нужно проверять и строку фильтра. Это нужно для последующего правильного формирования строки фильтра.