Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторні роботи_ООП.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
7.3 Mб
Скачать

Лабораторна робота №17

Тема: Робота з фільтрами в базах даних Delphi.

Мета роботи: Навчити вибирати набори даних за допомогою фільтрів.

Завдання

Створити програму для фільтрації даних.

Хід роботи

1. Відкрийте попередній проект і доповніть інтерфейс ще однієї формою і пунктом меню Фільтр, який робить видимою цю форму. На новій формі розмістіть компоненти, як показано на рисунку.

3. В ролі компонентів, що висвітлюють Прізвище, Код Покупця, Товар та Код товару використовуються компоненти TDBText, компоненти TBDNavigation приєднуються до наборів даних Покупець та Товар.

4. Запишіть коди для обробників натискування на обидві кнопки Фільтація, за допомогою яких здійснюється фільтрація набору Замовлення за заданими значеннями Код Покупця або Код товару.

5. Перевірте роботу програми.

6. Запишіть код для обробки натискування на кнопку Відміна, який дозволяє ліквідувати заданe фільтрацію.

7. Реалізуйте обробник події OnFilterRecord для таблиці Замовлення, який дозволить відфільтрувати всі записи, в яких покупки здійснювалися після 1.01.2003 в кількості більше 5 (Властивість Filtered при цьому повинна бути встановлена в True).

8. Перевірте роботу програми.

9. Запишіть проект на диск.

Теоретичні відомості

Найбільш ефективним способом відбору записів до набору даних (особливо з великих таблиць) є створення і виконання відповідного запиту SQL. Але для цього необхідно використовувати компоненти TQuery. Якщо ж набір даних функціонує на базі компонента TТable, використовується вбудований в набір даних механізм фільтрації даних. Використання фільтру базується всього на двох основних властивостях і одній допоміжній. Текст фільтру повинен міститися у властивості Filter, a властивість Filtered включає і відключає фільтр. Параметри фільтру визначаються властивістю FilterOptions. При використанні фільтра його текст транслюється BDE в синтаксис SQL і передається для виконання на сервер або через відповідний драйвер в локальну СУБД.

Фільтри можна створювати двома способами:

за допомогою властивості Filter створюються досить прості фільтри, для яких досить надаваного механізмом фільтрації синтаксису;

для створення більш складних фільтрів з використанням всіх можливих засобів мови програмування використовується метод-обробник набору даних OnFiiterRecord.

Фільтри можна поділити на статичні і динамічні. Статичні фільтри створюються під час розробки програми и можуть використовувати як властивість Filter, так і метод OnFiiterRecord. Динамічні фільтри можна створювати і редагувати під час виконання програми, для них використовується лише властивість Filter. При створенні тексту фільтра для властивості Filter використовуються імена полів відповідної таблиці БД, а для завдання відношень використовуються всі оператори порівняння (>, >=, <, <=, =, <>) і логічні оператора AND, OR, NOT: (Fieldl>100) AND (Field2=20)

Порівнювати між собою два поля не можна. Такий фільтр викличе помилку при спробі використання: (ItemCount – Balance) AND (InputPrice>OutputPrice)

При створенні динамічних фільтрів можна змінювати як вираз фільтра цілком, так і його частини. Наприклад, обмежуюче значення для поля можна задавати за допомогою елементів керування форми, що дозволяє користувачу програми керувати фільтрацією набору даних:

procedure TFormI.EditlChange(Sender: TObject);

begin with Tablel do begin

Filtered := False;

Filter := 'Fieldl>=' + (Sender as TEdit).Text;

Filtered := True;

end;

end;

В фільтрах можна проводити відбір по частинам рядків для рядкових полів, для цього використовується символ зірочки (*): ItemName = 'A*'

Фільтр починає працювати лише після того, як властивості Filtered присвоюється істинне значення. Перед зміною тексту динамічного фільтра або для відключення фільтра властивості Filtered присвоюється значення False.

Параметри фільтра визначаються властивістю FilterOptions:

property FilterOptions: TFilterOptions;

TFilterOption – (foCaseInsensitive, foNoPartialCompare);

TFilterOptions = set of TFilterOption;

Параметр foCaseInsensitive, будучи включеним, відключає порівняння рядкових значень з урахуванням регістра символів. Параметр foNoPartialCompare відключає відбір строкових значень по частині рядка.

Метод-обробник ОnFilterRecord має таку декларацію:

type TFilterRecordEvent = procedure(DataSet: TDataSet; var Accept: Boolean) of object;

property OnFilterRecord: TFilterRecordEvent;

Якщо цей метод створений для набору даних, то він викликається для кожного його запису. Програмний код методу повинен присвоювати параметру Accept істинне або хибне значення. В результаті запис передається в набір даних або відсікається:

procedure TFormI.TablelFilterRecord(DataSet: TDataSet; var Accept: Boolean);

begin

Accept := ArchOrdersArchDat.AsString >= DateEditI.Text;

end;

Важлива перевага методу OnFilterRecord в порівнянні із властивістю Filter в тому, що в цьому методі-обробнику можна порівнювати поля і здійснювати обчислення над їх значеннями. Недоліком методу є недостатня гнучкість, хоча такий фільтр можна модифікувати шляхом присвоєння методу процедурної змінної, що містить посилання на новий метод.

Обробник подій доповнює, а не заміщує властивість Filter, тобто якщо включено фільтрацію (Filtered := True) і властивість фільтр містить значення фільтра, то дія в обробнику подій і фільтр пов’язані логічним відношенням "AND".

Питання для самоконтролю:

  1. Що таке фільтрація даних?

  2. Які методи можна використати для фільтрації даних?

  3. Яка властивість визначає параметри фільтру?