
- •Оглавление
- •Часть 1. Краткое описание Delphi 8
- •Часть 2. Технология ado для баз данных access 186
- •9.1. Общие сведения 289
- •Введение
- •Часть 1. Краткое описание Delphi
- •1. Работа со средой delphi
- •1.1. Ознакомление с delphi
- •1.2. Вкладка дизайнера формы (design)
- •1.3. Вкладка редактора кода программы
- •1.4. Окно object inspector
- •1.5. Окно project manager
- •1.6. Окно палитры инструментов
- •1.7. Создание первого проекта приложения
- •1.8. Сохранение проекта
- •1.8. Сохранение проекта
- •1.9. Компиляция
- •2. Основа языка delphi
- •2.1. Основные понятия языка
- •2.1.1. Элементы языка
- •2.1.2. Пример простой программы
- •2.1.3. Типы данных
- •2.1.4. Операции и выражения
- •2.1.5. Стандартные функции
- •2.1.6. Ввод и вывод на дисплей
- •2.1.7. Оператор присваивания
- •2.2. Операторы языка паскаль
- •2.2.1. Составной оператор
- •2.2.2. Условный оператор
- •2.2.3. Сложные условия
- •2.2.4. Оператор выбора case
- •2.2.5. Оператор цикла for
- •2.2.6. Оператор цикла while
- •2.2.7. Оператор цикла repeat
- •2.2.8. Вложенные циклы
- •2.2.9. Прочие операторы
- •2.3. Общая структура программы
- •2.3.1. Перечень разделов программы
- •2.4. Массивы
- •2.4.1. Одномерные массивы
- •2.4.2. Сортировка массивов и поиск элемента в массиве
- •2.4.3. Многомерные массивы
- •2.5. Функции и процедуры
- •2.5.1. Описание функций
- •2.5.2. Обращение к функции
- •2.5.3. Процедуры
- •2.5.4. Параметры-значения и параметры-переменные
- •2.5.5. Локальные и глобальные переменные
- •2.5.6. Pекурсия
- •2.6. Строки символов
- •2.6.1. Задание строк
- •Var имя: string[длина];
- •2.6.2. Функции и процедуры для обработки строк
- •2.7. Порядковые типы данных
- •2.7.1. Перечисляемый тип данных
- •2.7.2. Интервальный тип данных
- •2.7.3. Порядковые типы данных
- •2.7.4. Дополнение:тип данных tDateTime (дата-время)
- •2.8. Множества
- •2.8.1. Значения типа множество
- •2.8.2. Операции на множествах
- •2.9. Записи
- •2.9.1. Поля записи
- •2.9.2. Оператор with
- •2.9.3. Последовательный поиск в массиве записей
- •2.9.4. Двоичный поиск в массиве записей
- •2.10. Файлы
- •2.10.1. Основные свойства файлов
- •2.10.2. Типизированные файлы
- •2.10.3. Текстовые файлы
- •2.10.4. Поиск файлов
- •2.11. Динамическая память
- •2.11.1. Динамические переменные и указатели
- •2.11.2. Динамические списки
- •2.11.3. Деревья
- •2.12. Программные модули
- •2.12.1. Модули, формируемые пользователем
- •2.12.2. Стандартные модули
- •2.12.3. Примеры программ
- •3. Главная форма
- •3.1. Свойства главной формы
- •3.2. События главной формы
- •4. Описание некоторых компонентов
- •4.1. Компонент tpanel (панели)
- •4.2. Компонент tbutton (кнопка)
- •4.3. Дополнительные кнопки
- •4.4. Компонент tlabel (надписи)
- •4.5. Компонент tedit (Строки ввода)
- •4.6. Компонент тМето (многостроч. Поле ввода)
- •4.7. Свойства и методы класса tstrings
- •4.8. Компонент checkbox (флажок)
- •4.9. Компонент tradiobutton (кнопки выбора)
- •4.10. Компонент MainMenu (главное меню программы)
- •4.11. Компонент timage
- •4.12. Компонент tstringgrid (сетка)
- •4.13. Компонент ttimer(таймер)
- •5. Отладка программ
- •5.1. Типы ошибок
- •5.2. Отладка программы
- •5.2.1. Трассировка программы
- •5.2.2. Точки останова программы
- •5.2.3. Наблюдение значений переменных
- •Часть 2. Технология ado для баз данных access
- •6. Создание баз данных access
- •6.1. Определение понятия баз данных
- •6.2. Интерфейс программы access
- •6.3. Создание базы данных в access 2007
- •6.3.1. Создание двухтабличной базы данных
- •6.3.2. Создание базы данных с вычисляемыми полями
- •6.4. Выбop формата для новой базы данных
- •6.5. Создание пустой базы данных
- •6.6. Открытие и закрытие базы данных
- •6.7. Создание таблиц в режиме конструктора
- •6.7.1. Выбор первичного ключа
- •6.7.2. Изменение полей и таблиц
- •6.7.3. Копирование полей
- •6.7.4. Перемещение полей
- •6.7.5. Удаление полей
- •6.7.6. Операции с таблицами
- •6.8. Создание базы данных в access 2003
- •6.9. Установление связей между таблицами
- •6.10. Обеспечение целостности записей в базе данных
- •6.11. Редактирование и удаление связей
- •7. Система доступа к данным ado
- •7.1. Общие сведения
- •7.2. Компонент adoConnection
- •7.2.1. Свойства компонента adoConnection.
- •7.2.2. Методы компонента adoConnection
- •7.3.Компонент аdоТable
- •7.3.1. Свойства компонента tadoTable
- •7.3.2. Методы компонента tadoTable
- •7.4. Компонент adoQuery
- •7.5. Компонент adoDataSet
- •7.5.1.Свойства компонента adoDataSet
- •7.5.2. Методы компонента adoDataSet
- •7.5.3. Cобытия компонента adoDataSet
- •7.6. Компонент DataSource
- •7.7.Комнонент DataGrid
- •7.7.1 Cвойства компонента DataGrid
- •7.7.2. Методы и события компонента DataGrid
- •7.8. Компонент adocommand
- •8. Управление базами данных
- •8.1. Приложение для управления базами данных
- •8.2. Свойства полей базы данных
- •8.3. Редактирование базы данных
- •8.4. Сортировка данных
- •8.5. Поиск данных в базе
- •8.5.1. Фильтрация данных в базе
- •8.5.2. Нахождения информации методом Locate
- •9.1. Общие сведения
- •9.2. Основные операторы запроса
- •9.2.1. Агрегатные функции
- •9.2.2. Подзапросы
- •9.3. Операторы наполнения баз данных sql
- •9.3.1. Ввод значений
- •9.3.2. Удаление значений
- •9.3.3. Изменение значений
- •9.4. Операторы создания баз данных sql
- •9.4.1. Команда создания таблицы.
- •9.4.2. Первичные ключи таблицы
- •9.4.3. Индексы таблицы
- •9.4.4. Добавление в таблицу новых столбцов
- •10. Реализация sql- запросов
- •10.1. Компонент tadoQuery для sql- запросов
- •10.2. Форма для реализация sql-запроса
- •11. Генератор отчетов Quick Reports
- •11.1.Описание Quick Reports
- •11.2. Печать записи с помощью Quick Reports
- •11.3. Печать таблиц с помощью Quick Reports
- •394026 Воронеж, Московский просп., 14
8.5.1. Фильтрация данных в базе
Для поиска в базе данных по технологии ADO у компонента TADOTаblе есть свойство Filter.
В нем можно указывать условие, по которому будут отображаться данные.
Например, Вы можете указать там отображение только записей, в которых поле Фамилия содержит значение Иванов.
Но для того, чтобы фильтр заработал, надо установить свойство Filtered компонента TADOTаblе в true. После этого можно изменять свойство Filter и все изменения сразу же будут вступать в силу.
Свойство Filter - это строка. В ней нужно писать текст условия в виде:
Поле [Оператор сравнения] 'Значение'
Например, если вы хотите отобразить все записи, в которых поле Фамилия равно значению Иванов, то нужно написать:
ADOTablel.Filter:='Фамилия=''Иванов''';
Значение нужно указывать в одинарных кавычках Но так как одинарные кавычки используются в Delphi для ограничения строк то, чтобы внутри строки поставить одинарную кавычку, ее нужно поставить дважды, например:
' Идет текст далее стоит одинарная кавычка'' и после продолжение текста’
Именно так записывается значение с кавычкой внутри текста. И именно таким способом мы ставим перед значением одинарную кавычку.
Поэтому указанная ниже строка имеет такой вид
ADOTablel.Filter:='Фамилия=''Сидоров''';
После записи значения нужно поставить одинарную кавычку и закрыть строку, поэтому ставятся три одинарных кавычки (две для того, чтобы поставить кавычку для значения, и одна для конца строки).
Если вы не хотите мучиться с такими кавычками, то можете воспользоваться функцией QuotedStr. Ей нужно передать строку, а она вернет вам ее в кавычках.
Таким образом, ваш код может упроститься до следующего:
ADOTablel.Filter:='Фамилия='+ QuotedStr(Сидоров);
Это был пример простейшего условия на равенство. Вы можете использовать любые другие операторы сравнения (больше или меньше). Можно даже создавать составные операторы сравнения, в которых сравнивается сразу два или более значений. Например:
ADOTablel.Filter:='Фамилия=''Иванов'' or Телефон=''2462523' ";
В этом примере происходит поиск всех записей, в которых поле Фамилия равно значению Иванов и поле Телефон имеет значение 2462523.
Для объединения двух условий используется оператор or. Можно также использовать оператор логического типа — and.
Если имя поля состоит из двух слов, то его нужно заключать в квадратные скобки [ ]. Допустим, что у нас поле Город состоит из двух слов, например, :— Название города, в этом случае фильтр по этому полю будет выглядеть так:
ADOTablel.Filter:=' [Название города]=''Москва' " ;
Теперь можно перейти к доработке нашего приложения.
Для этого нужно открыть наше приложение и добавить к нему возможность поиска.
Для начала можно изменить Главную форму, а именно на форму установить компонент TLabel c текстом Найти и компонент и TEdit (строка ввода) с именем FindEdit. Теперь можно создать следующий обработчик события onChange для строки ввода.
Если пользователь изменил текст в строке ввода, то нужно изменить и фильтр.
С учетом сказанного напишем в этом обработчике следующий код:
Procedure TForml.FindEditChange(Sender: TObject);
begin
if Length-(FindEdit.Text)>0 then DataModulel.BookTable.Filtered:=true
else
DataModulel.BookTable.Filtered:=false;
DataModulel.BookTable.Filter:='Фамилия>'''+FindEdit.Text+'''';
End;
в этом обработчике сначала проверяется строка. Если в строке поиска что-то есть, то включаем фильтр, иначе его можно отключить, чтобы показать всю таблицу.
После этого создается условие фильтра: 'Фамилия>'''+FindEdit. Text+''''. Здесь используется знак больше, чтобы отображать все похожие записи на введенный текст.
Если установить знак равенства и пользователь введет букву "с", то в таблице ничего отображаться не будет, потому что нет такой фамилии. А при знаке "больше" будут отображаться все фамилии, начинающиеся на букву "с"
Знак "больше" в базах данных Access работает не очень хорошо. Компонент ADOTable хорошо и быстро работает только со знаком равенства (жесткий поиск). Там, где поиск должен быть не жестким, лучше использовать запросы SQL, использование которых рассмотрим ниже.
Как уже говорилось, фильтры в ADO работают плохо. Но Delphi представляет очень хорошую возможность расширить возможности фильтрации.
Перейдем в модуль данных (DataModuieUnit) и создадим для компонента SpisokTable обработчик события OnFiiterRecord.
Он вызывается при включенной фильтрации и каждый раз, когда программе надо выяснить, соответствует ли строка фильтру. Здесь можно самостоятельно управлять логикой фильтрации.
Напишем в созданном обработчике следующий код:
procedureTDataModulel.SpisokFilterRecord(DataSet:TDataSet;
var Accept: Boolean);
begin
Accept:=false;
if copy(SpisokTableDSDesigner.AsString,1,Length(Forml.FindEdit.Text))=
Forml.FindEdit.Text then
Accept:=true;
end;
В качестве второго параметра в обработчик передается логическая переменная Accept. Если в нее заносится значение false, то текущая строка не соответствует фильтру. Если true, то строка соответствует и ее можно отображать.
В самом начале переменной Accept дается ложное значение. После этого происходит проверка соответствия текущей строки фильтру. вторую строку рассмотрим ее по частям:
Copy(SpisokTableDSDesigner.AsString,1,Length(Forml.FindEdit.Text))
:Здесь SpisokTableDSDesigner — имя поля Фамилия. Если дважды щелкнуть по компоненту SpisokTable и в появившемся редакторе полей посмотреть свойство Name поля Фамилия, то вы должны увидеть именно это имя.
Итак, функция Сору возвращает из строки, указанной в качестве первого параметра, символы, начиная с позиции, указанной в качестве второго параметра и количество возвращаемых символов равно третьему параметру. У нас возвращаются символы фамилии, начиная с первого, и столько же символов, сколько и в строке ввода для фильтра на главной форме.
Результат сравнивается с содержимым строки ввода для фильтра. Если фамилия в текущей строке базы данных начинается с текста, указанного в качестве фильтра, то эта строка будет отображаться.
Теперь наш фильтр стабилен и отлично работает. Если изначально ADO плохо работает с этим механизмом, то теперь проблем нет.
Таким образом, можно сделать фильтрацию любой сложности. Единственный недостаток — медленная скорость обработки фильтров.
Запросы SQL с большими данными работают быстрее.