Базы данных в Delphi. Сортировка и фильтрация набора данных. Поиск записей
Тема: Поиск записей.Сортировка и фильтрация записей в наборе данных
Поиск записейПоиск записи, удовлетворяющей определенным условиям, означает переход на эту запись.Для поиска записей используют методLocate ( KeyField, KeyValues, Options ):Boolean который ищет запись с заданными значениями полей.Указатель устанавливается на первую встреченную запись, удовлетворяющую условию поиска.Если запись найдена, то Locate=true, если нет, то Locate=false.В параметре KeyField указывается список полей (через ;), по которым ведется поиск;KeyValues – указывается значение полей для поиска;
Options – задает значения, которые обычно используются для поиска строк. Параметр Options может принимать комбинацию значений:loCaseInsensitive – регистр букв не учитывается (Петров=ПеТрОв=петров= …);loPartialKey – допускается частичное совпадение значений (петров=п=петр=…).Значения записываются в [].Пример. adotable1.Locate ( ‘Kod’, 123, []); – в результате выполнения оператора указатель записи установится на запись, у которой в поле Kod равно числу123.
Поиск записей по нескольким полямВ методе Locate параметр KeyValues является массивом Variant, в котором содержится несколько значений.Функция VarArrayOf – приводит к типу вариантного массива.Значения функции разделяются « , » и заключаются в []; порядок значений соответствует порядку полей параметра KeyField.Пример adotable1.Locate ( ‘Tovar;Kolvo’, Vararrayof (['Шоколад', '150‘]), [ ] );
Индексирование баз данныхВ таблицах могут определяться ключи и индексы. Ключ – это комбинация полей, данные в которых однозначно определяют каждую запись в таблице. Простой ключ состоит из одного поля, составной из нескольких полей. Поля, по которым построен ключ, называют ключевыми. Индекс, как и ключ, строится по полям таблицы, однако, он может допускать повторение значений составляющих его полей. Установка ключей и создание индексов выполняется в процессе разработки структур таблиц базы данных.В НД adoTable указание текущего индекса возможно с помощью свойства IndexFieldNames, которое содержит имя поля, для которого был создан индекс. Например, adoTable1.IndexFieldNames:='Tovar';
Сортировка набора данныхСортировка – это упорядочивание записей по полю или группе полей в порядке убывания или возрастания содержащихся в них значений.Сортировка НД adoTable выполняется автоматически по текущему индексу. При смене индекса происходит автоматическое переупорядочивание записей. Есть возможность сортировки данных и по неиндексированным полям.Для этого используется свойство НД свойство Sort.
Для сортировки в свойство Sort помещают список полей сортировки, разделенных запятыми. Каждое поле может дополнительно снабжаться признаками ascending (ASC) или descending (DESC) для указания соответственно восходящего или нисходящего порядка сортировки. Если ни одно из этих слов не указано, реализуется восходящая сортировка.Пример: ADOtablel.Sort := 'Name ASC, Date DESC’;
Фильтрация записейФильтрация – это задание ограничений для записей, отбираемых в набор данных. Состав записей в НД в данный момент зависит от установленных ограничений, в том числе и от фильтров.При использовании фильтрации по выражению набор данных ограничивается записями, удовлетворяющими выражению фильтра, задающему условия отбора записей.
Свойство Filter типа Srting компонента adoTable – задает выражение фильтра. В его состав могут входить элементы:имена полей таблиц;литералы – значение, заданное явно (число, строка или символ). В выражение фильтра включаются только выражения строкового типа.операции сравнения (<, >, =, >=, <=, <>);арифметические операции (+, -, *, /);логические операции (and, or, not);( ) и [ ] скобки.
Если имя поля содержит пробелы, то его заключают в [ ] (например, [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;
Для активизации и деактивизации фильтра используется свойство Filtered типа Boolean. Если Filtered=True, то фильтрация включается, и НД отбираются записи, которые удовлетворяют фильтру, записанному в свойстве Filter. Если Filtered=False (по умолчанию), то фильтрация выключена.Например:ADOTable1.Filter:='[ФАМИЛИЯ] LIKE '+#39+Edit1.Text +'%'+ #39;{теперь включаем фильтр}ADOtable1.Filtered:=true;
Разберем строку фильтра:'[ФАМИЛИЯ] LIKE '+#39+Edit1.Text +'%'+ #39;Оно означает следующее - выбрать те записи из столбца 'ФАМИЛИЯ', которые начинаются с тех же символов, что и набраны в Edit1.Text. Особое внимание обратите на пробелы - "потеряете" пробел - не будет работать.Ключевое слово LIKE позволяет по заданному шаблону сравнивать строки. При этом нужно знать следующее: символ '%' (процент) – заменяет любую последовательность из символов. Знак #39 - означает номер символа ' (одинарная кавычка) в кодовой таблице ASCII.
Конструкция #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;
Если, например, нужно искать любое вхождение искомой строки в записях, а не начиная с первого символа, то строка фильтра выглядела бы следующим образом: 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;
Строка фильтра работает, но только в том случае, если данные введены во все три поля. Если одно из полей ввода(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;
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;Т.е., нужно провести проверку, пустое поле ввода или нет, а затем уже формировать строку фильтра. Причем начиная со второго поля ввода нужно проверять и строку фильтра. Это нужно для последующего правильного формирования строки фильтра.