Компонент TTable. b> p>
Зміст b> p>
Огляд p>
Створення таблиць за допомогою компонента TTable p>
Висновок p>
Огляд b>
На цьому невеликому уроці ми завершимо вивчення можливостей створення
таблиць. Як Ви пам'ятаєте, ми вже освоїли два способи створення таблиць - з
допомогою утиліти Database Desktop, що входить в постачання Delphi (урок 11) і з
допомогою SQL-запитів (урок 12), які можна використовувати як у WISQL
(Windows Interactive SQL - клієнтська частина Local InterBase), так і в
компоненті TQuery. Тепер ми розглянемо, як можна створювати локальні
таблиці в режимі виконання за допомогою компонента TTable.
Створення таблиць за допомогою компонента TTable b>
Для створення таблиць компонент TTable має метод CreateTable. Цей метод створює нову порожню таблицю заданої структури. Даний метод (процедура)
може створювати тільки локальні таблиці формату dBase або Paradox. p>
Компонент TTable можна помістити на форму в режимі проектування або створити динамічно під час виконання. В останньому випадку перед використанням
його необхідно створити, наприклад, за допомогою наступної конструкції: p>
· var p>
Table1: TTable; p>
... p>
Table1: = TTable.Create (nil); p>
... p>
Перед викликом методу CreateTable необхідно встановити значення властивостей p>
TableType - тип таблиці
DatabaseName - база даних
TableName - ім'я таблиці
FieldDefs - масив описів полів
IndexDefs - масив описів індексів.
Властивість TableType має тип TTableType і визначає тип таблиці в базі даних. Якщо це властивість встановлено в ttDefault, тип таблиці визначається за
розширення файлу, що містить цю таблицю: p>
Розширення. DB або без розширення: таблиця Paradox
Розширення. DBF: таблиця dBASE
Розширення. TXT: таблиця ASCII (текстовий файл).
Якщо значення властивості TableType не дорівнює ttDefault, що створюється таблиця завжди буде мати встановлений тип, незалежно від розширення: p>
ttASCII: текстовий файл
ttDBase: таблиця dBASE
ttParadox: таблиця Paradox.
Властивість DatabaseName визначає базу даних, в якій знаходиться таблиця. Ця властивість може містити: p>
BDE аліас
директорій для локальних БД
директорій та ім'я файлу бази даних для Local InterBase
локальний аліас, визначений через компонент TDatabase.
Властивість TableName визначає ім'я таблиці бази даних. p>
Властивість FieldDefs (що має тип TFieldDefs) для існуючої таблиці містить інформацію про всі поля таблиці. Ця інформація доступна тільки в
режимі виконання і зберігається у вигляді масиву екземплярів класу TFieldDef, що зберігають дані про фізичних полях таблиці (таким чином обчислюються на рівні клієнта
поля не мають свого об'єкта TFieldDef). Число полів визначається властивістю Count, а доступ до елементів масиву здійснюється через властивість Items: p>
· property Items [Index: Integer]: TFieldDef; p>
При створенні таблиці, перед викликом методу CreateTable, потрібно сформувати ці елементи. Для цього у класу TFieldDefs є метод Add: p>
· procedure Add (const Name: string; DataType: TFieldType; Size: Word; Required: Boolean); p>
Параметр Name, що має тип string, визначає ім'я поля. Параметр DataType (тип TFieldType) означає тип поля. Він може мати одне з
наступних значень, зміст яких ясний з їх назви: p>
· TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat, ftCurrency, ftBCD, ftDate,
ftTime, ftDateTime, ftBytes, ftVarBytes, ftBlob, ftMemo, p>
ftGraphic); p>
Параметр Size (тип word) являє собою розмір поля. Цей параметр має сенс лише для полів типу ftString, ftBytes, ftVarBytes,
ftBlob, ftMemo, ftGraphic, розмір яких може сильно варіюватися. Поля інших типів завжди мають строго фіксований розмір, так що даний
параметр для них не береться до уваги. Четвертий параметр - Required - визначає, чи може поле мати пусте значення при записі в базу даних. Якщо
значення цього параметра - true, то поле є "необхідним", тобто не може мати порожнього значення. В іншому разі поле не є "необхідним" і,
отже, допускає запис значення NULL. Відзначимо, що в документації по Delphi і online-довіднику допущена помилка - там відсутня згадка про
четвертому параметрі для методу Add b>. p>
Якщо Ви бажаєте індексувати таблицю по одному або декількох полях, використовуйте метод Add для властивості IndexDefs, яке, як можна здогадатися,
також є об'єктом, тобто екземпляром класу TIndexDefs. Властивість IndexDefs для існуючої таблиці містить інформацію про всі індекси таблиці. Ця
інформація доступна тільки в режимі виконання і зберігається у вигляді масиву екземплярів класу TIndexDef, що зберігають дані про індекси таблиці. Число
індексів визначається властивістю Count, а доступ до елементів масиву здійснюється через властивість Items: p>
· property Items [Index: Integer]: TIndexDef; p>
Метод Add класу TIndexDefs має такий вигляд: p>
· procedure Add (const Name, Fields: string;
Options: TIndexOptions); p>
Параметр Name, що має тип string, визначає ім'я індексу. Параметр Fields (також має тип string) означає ім'я поля, яке повинно бути
індексувати, тобто ім'я індексованих поля. Складовою індекс, який використовує кілька полів, може бути заданий списком імен полів, розділених
крапкою з комою ";", наприклад: 'Field1; Field2; Field4'. Останній параметр - Options - визначає тип індексу. Він може мати набір значень, що описуються
типом TIndexOptions: p>
· TIndexOptions = set of (ixPrimary, ixUnique, ixDescending, p>
ixCaseInsensitive, ixExpression); p>
Пояснимо ці значення. ixPrimary означає первинний ключ, ixUnique - унікальний індекс, ixDescending - індекс, відсортований по зменшенню
значень (для рядків - у порядку, зворотному алфавітному), ixCaseInsensitive - індекс, "нечутливий" до регістру букв, ixExpression - індекс за висловом.
Відзначимо, що згадка про останньому значенні також не міститься в документації і online-довіднику. Опція ixExpression дозволяє для таблиць
формату dBase створювати індекс за висловом. Для цього досить у параметрі Fields вказати бажане вираз, наприклад: 'Field1 * Field2 + Field3'. Взагалі
кажучи, не всі опції індексів застосовні до всіх форматів таблиць. Нижче ми наведемо список допустимих значень для таблиць dBase і Paradox: p>
· Опції індексів dBASE Paradox p>
--------------------------------------- p>
ixPrimary ь p>
ixUnique ь ь p>
ixDescending ь ь p>
ixCaseInsensitive ь p>
ixExpression ь p>
Необхідно дотримуватися зазначеного порядку застосування опцій індексів щоб уникнути некоректної роботи. Слід зазначити, що для формату Paradox опція
ixUnique може використовуватися тільки разом з опцією ixPrimary (див. приклад на диску - Рис. 0-1). p>
Отже, після заповнення всіх зазначених вище властивостей і виклику методів Add для FieldDefs і IndexDefs необхідно викликати метод класу TTable - CreateTable: p>
· with Table1 do p>
begin p>
DatabaseName: = 'dbdemos'; p>
TableName: = 'mytest'; p>
TableType: = ttParadox; p>
(Створити поля) p>
with FieldDefs do p>
begin p>
Add ( 'Surname', ftString, 30, true); p>
Add ( 'Name', ftString, 25, true); p>
Add ( 'Patronymic', ftString, 25, true); p>
Add ( 'Age', ftInteger, 0, false); p>
Add ( 'Weight', ftFloat, 0, false); p>
end; p>
(Згенерувати індекси) p>
with IndexDefs do p>
begin p>
Add ( 'I_Name', 'Surname; Name; Patronymic',
[ixPrimary, ixUnique ]); p>
Add ( 'I_Age', 'Age', [ixCaseInsensitive ]); p>
end; p>
CreateTable; p>
end; p>
Індекси можна згенерувати і не тільки при створенні таблиці. Для того щоб
згенерувати індекси для існуючої таблиці, потрібно викликати метод AddIndex класу TTable, набір параметрів якого повністю повторює набір параметрів
для методу Add класу TIndexDefs: p>
· procedure AddIndex (const Name, Fields: string;
Options: TIndexOptions); p>
При цьому для методу AddIndex справедливі всі зауваження з приводу запису полів і опцій індексів, зроблені вище. p>
Висновок b>
Отже, ми познайомилися з ще одним способом створення таблиць - способом, що використовує метод CreateTable класу TTable. Використання даного способу
додасть Вашому додатку максимальну гнучкість, і Ви зможете будувати локальні таблиці "на льоту". Супутнім методом є метод AddIndex класу TTable,
що дозволяє створювати індекси для вже існуючої таблиці. Підкреслимо ще раз, що цей спосіб застосовується тільки для локальних таблиць. Більш загальний спосіб
полягає у використанні SQL-запитів, який ми розглядали на уроці 12. p>