Відношення один-до-багатьох для зв‘язаних таблиць

Відношення один-до-багатьох для зв‘язаних таблиць називають моделлю головний/підлеглий. Її визначають властивості Master Source та Master Fields деякого об‘єкта ADOTable.

1) Для підлеглого об‘єкта ADOTable властивість Master Source вміщує назву Data Source з‘єднаного з головним об‘єктом ADOTable. В той час, як для головного об‘єкта ADOTable властивість Master Source залишається порожньою.

2) Властивість Master Fields для підлеглого об‘єкта ADOTable вміщує рядок з назвою одного або декількох полів, що пов‘язують цей об‘єкт з головною таблицею. Для головної таблиці властивість Master Fields залишається порожньою. Якщо зв‘язуючих полів декілька, то слід відділити їх одне від одного за допомогою коми з крапкою. Слід також заповнити поля IndexFieldName або IndexName.

3) Для відображення даних зі зв‘язаних таблиць слід використати компоненти TDBGrid для кожної таблиці розташувавши їх на одній формі.

4) Для навігації по даним використати компонент TDBNavigator.

 

Питання для самоперевірки

1) Які компоненти з середовища Delphi забезпечують зв‘язок з БД?

2) Яка компонента забезпечує зв‘язок таблиці (запита) з компонентами інтерфейсу?

3) Які компоненти слугують для побудови інтерфейсу користувача БД ?

4) Які засоби в середовищі Delphi забезпечують виведення даних зі зв‘язаних таблиць?

 

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

Тема:Організація контрольованого введення даних. Обробка виключень.

Мета: Набути навичок програмування подій при роботі з компонентою TADOTable в середовищі Delphi.

Завдання:

1. Забезпечити контрольоване введення даних до таблиці БД за допомогою :

¾ Поля зі списком;

¾ Поля зі списком, пов‘язаного з довідником;

¾ Масок введення даних;

¾ Методу Сancel.

2. Запрограмувати обробку виключень на події:

¾ Дублювання ключів;

¾ Помилка перевірки БД;

¾ Помилковий стан БД для даної операції.

 

Теоретичні положення

Контрольоване введення даних - це забезпечення захисту інформації від помилок користувача при введенні даних. Для цього використовують наступні методи:

a) Побудова компонент вибору замість компонент вільного введення даних (використання поля зі списком);

b) Формування вхідних масок;

c) Введення обмежень на рівні бази даних - правил валідації та значень по замовчуванню;

d) Використання методу Cancel.

(а) Заповнення таблиці даними, використовуючи поле зі списком.

При роботі з таблицями редактор полів(Field Editor) викликають шляхом подвійного натискання лівої клавіші миші, курсор якої знаходиться на зображені об‘єкта ADOTable. Редактор полів має режими: AddFields, NewField та AllFields, які дозволяють сформувати бажаний набір даних з доступних полів таблиці. Також існує можливість створення нових полів. Кожне поле з набору полів представлене об‘єктом в класі форми. Для завдання властивостей полів використовується Інспектор об‘єктів. Add Field слугує для додавання в об‘єкт ADOTable фізичних стовпців з набору даних. Якщо поле не додавати в редакторі полів, воно не буде виводитись на форму.

Приклад1:

1) Необхідно заповнити таблицю "Учасник_рекламної_акції", використовуючи дані з пов‘язаної з нею таблиці "Тип населеного пункту" по полю Код_типу. Для цього помістимо на форму об‘єкти компонент:

ADOConnection1- об‘єкт для під‘єднання до БД; ADOTable1, ADOTable2 - відповідають таблицям: Тип населеного пункту, Учасник_рекламної_акції; DataSource1, DataSource2 - джерела даних для під‘єднання візуальних компонентів до відповідних таблиць;DBLookupComboBox1- поле зі списком "Тип селища"; DBEdit1, DBEdit2, DBEdit3, DBEdit4, DBEdit5 - поля для перегляду та внесення даних: ПІБ, Вік, Назва населеного пункту, Дата реєстрації, Стать.

DBNavigator1 - для навігації по таблиці "Учасник_рекламної_акції";

DBGrid1 - для перегляду змін в таблиці "Учасник_рекламної_акції";

2) Встановлюємо зв’язки за допомогою компонентів ADOConnection, ADOTable, DataSource з таблицями бази даних: "Тип населеного пункту" та "Учасник_рекламної_акції".

3) Створюємо поле зі списком "Тип селища". Для цього в Інспекторі об’єктів задамо властивості компонента DBLookupComboBox1 наступним чином: Властивість DataSource ставимо в DataSource2, в ListSource вибираємо джерело даних DataSource1, яке зв’язане з таблицею "Тип населеного пункту", в KeyField - Код_типу , а ListField – Тип міста, DataField – Код_типу.

4) В DBEdit1, DBEdit2, DBEdit3, DBEdit4, DBEdit5 властивість DataSource ставимо в DataSource2, DataField відповідно ПІБ, Вік, Назва населеного пункту, Дата реєстрації, Стать.

5) Підключаємо DBNavigator1 та DBGrid1.

6) Запускаємо програму на виконання. Результати проектування наведені на рисунку 3.

 

Рисунок 5. Форма введення та перегляду даних для таблиці "Учасник_рекламної_акції"

Приклад 2: Побудова поля зі списком в таблиці представленій на формі за допомогою компоненти DBGrid.

1) Необхідно заповнити таблицю "Рахунок_фактура", використовуючи дані з пов‘язаної з нею таблиці "Клієнти" по полю Код клієнта. Для цього помістимо на форму об‘єкти компонент:

ADOConnection1- об‘єкт для під‘єднання до БД; ADOTable1, ADOTable2 - відповідають таблицям: "Клієнти", "Рахунок_фактура" відповідно; DataSource1, DataSource2 - джерела даних для під‘єднання візуальних компонентів до відповідних таблиць; DBNavigator1 - для навігації по "Рахунок_фактура";

DBGrid1 - для перегляду змін в таблиці "Рахунок_фактура".

Для того щоб побудувати поле зі списком у компоненті DBGrid1 (Рис 5) слід звернутися до постачальника даних, компоненти із класа DataSet - ADOTable2 .

Поле із списком з‘виться у таблиці на формі, коли воно буде сформоване, як нове поле типу Lookup у об‘єкті ADOTable2. Спершу потрібно встановити властивість ADOTable2.Active у позицію False, щоб мати змогу змінювати зміст полів. Для того, щоб додати поле зі списком, слід викликати редактор полів. Після чого, з контекстного меню вибрати опцію New Field. Відкриється вікно зображене на рисунку 4.

 
 

Рисунок 6. Побудова поля із списком за допомогою редактора полів

 

Для отримання бажаного результату слід заповнити відповідним чином всі пункти запиту:

Name - ім’я нового поля (Назва клієнта) ;

Type - тип даних поля зі списком (String);

Field type – тип створюваного поля (Lookup);

Key Fields – ключове поле підлеглої таблиці, за яким вона зв‘язана з головною (зовнішній ключ).

Dataset – набір даних, з якого формується список (ADOTable1);

Lookup Keys – ключове поле головної таблиці з якої ми беремо дані для списку;

Result Field – поле, на основі якого формується список.

Після того, як нове поле сформоване, встановлюємо властивість Active ADOTable2 у позицію True і під‘єднуємо об‘єкт ADOTable2 до об‘єкта DBGrid1. Результат проектування наведено на рисунку 5.

 
 

Рисунок 7. Використання поля зі списком у об‘єкті DBGrid для забезпечення контрольованого введення даних

 

 

(b) Використання вхідних масок.

Delphi має редактор Mask Editor для побудови масок. Для того, щоб відкрити діалогове вікно Mask Editor слід подвійно клацнути лівою клавішею маніпулятора миша на властивості EditMask об‘єкта TField (маска повинна бути встановлена для кожного поля, яке її потребує). Mask Editor має список типових масок, а також поля для введення нових масок та їх тестування. Аналогічно для кожного поля можна виставити значення по замовчуванню, використовуючи властивість Default.

(d) Використання методу Cancel.

Дані, що вводяться, проходять перевірку на відповідність певній умові, якщо умова не виконується, то введення даних слід відмінити і сформувати попереджувальне повідомлення. Наприклад: Заповнити 4 поле таблиці числовими даними , якщо їх значення менше 0.

Помістимо на форму компоненти ADOTable1, DataSource1, Edit1, Button1. Організуємо введення даних при натискуванні кнопки Button1. Якщо оператор помилково введе позитивне число, слід сформувати повідомлення і відмінити дію. Процедура на натиснення кнопки буде виглядати наступним чином:

Procedure TForm1.Button1.Click (Sender: TObject);

Begin

Table1.Edit;

While not (EOF) do

If StrtoInt (Edit1.text) <0 then

Table1.Fields[4]. AsInt := strtoInt (Edit1.text);

Table1.Post

Else

Begin

Application.MessageBox ("Позитивне число", Помилкові дані, MB_OK);

Table1.Cancel;

End;

End;