Витяг даних індексу таблиці - delphi sources faq

Отримати під час виконання додатка список індексів, асоційованих з таблицею також просто, як викликати метод GetIndexNames для компонентів TTable, TQuery або TStoredProc. Метод GetIndexNames повертає список, доступний в наборі даних для компонента TStrignList, встановленого на формі (для нашого прикладу), або інших візуальних компонентів, таких як TListBox, через властивість Items:

Природно, список TStrings, що повертається методом GetIndexNames, не повинен використовуватися візуальним компонентом. Він може являти собою масив імен індексів, зберігатися в пам'яті і використовуватися в якості списку або масиву.

Але існує можливість отримання додаткової інформації про індекси таблиці, а не тільки їх імена. Інші описувані атрибути є ім'я кожного індексу, імена полів, які включають кожен індекс і опції індексу, що використовуються при їх створенні. Отримання цих величин трохи важче, ніж просте використання GetIndexNames. В основному, дані значення можна отримати за допомогою простої ітерації властивості IndexDefs компонента TTable, TQuery або TStoredProc. Властивість IndexDefs по суті є масивом записів, по одному запису на кожен індекс таблиці.

Кожна індексна запис (index record) містить інформацію про індекс. Процес отримання масиву записів, що містять інформацію окремо про кожного індексі, досить простий в реалізації.

Властивість IndexDefs компонента TTable містить інформацію про індекси таблиці, використовуваної компонентом TTable, TQuery або TStoredProc. Саме властивість IndexDefs в свою чергу також має різні властивості, які містять специфічну інформацію про видобутих індексах. Об'єкт IndexDefs містить дві властивості: доступно тільки під час виконання програми і має прапор тільки для читання; вказує на кількість елементів у властивості Items (наприклад, кількість індексів в таблиці). доступно тільки під час виконання програми і має прапор тільки для читання; масив об'єктів TIndexDef, кожен об'єкт описує один індекс таблиці.

Властивість Count об'єкта IndexDefs є основою для створення лічильника циклу, в тілі якого за допомогою елементів властивості Items витягується інформація про кожного індексі таблиці. Кожен об'єкт IndexDef, що міститься у властивості Items, складається з безлічі властивостей, що описують характеристики кожного індексу окремо. Всі властивості об'єкта IndexDef доступні тільки під час виконання програми і мають прапор "тільки для читання". Ось ці властивості: Перед отриманням будь-якої інформації про індекс (Count або Items) необхідно викликати метод Update об'єкта IndexDefs. Це оновлює (або инициализирует) набір індексів для об'єктів IndexDef.

Ось приклад простого For-циклу, що використовує в якості лічильника властивість Count об'єкта IndexDefs, і витягає ім'я кожного індексу (якщо який-небудь існує) таблиці, представленої компонентом TTable з ім'ям Table1:

Нижче наведено приклад, який показує як можна витягти інформацію про індекси під час виконання програми з виведенням її в компонент TStringGrid (з ім'ям SG1).

При роботі з таблицями різних типів при необхідно враховувати їх особливості. За допомогою Delphi можна отримати доступ до декількох типів таблиць, і у кожної є свої специфічні особливості, пов'язані з витягується інформацією про індекси.

При роботі з індексами dBASE, властивості Fields і Expression заповнюються в залежності від типу індексу, який може бути як простим (заснованим на одному полі), так і складним (що базуються на кількох полях або dBASE-виразах). Якщо індекс є простим, властивість Fields буде містити ім'я поля таблиці, на основі якого побудований індекс, а властивість Expression буде порожнім. Якщо індекс складний, властивість Expression буде містити вираз, на основі якого був побудований індекс (наприклад, "Field1 + Field2"), а властивість Fields буде порожнім.

При роботі з первинними індексами Paradox, властивість Name буде порожнім, властивість Fields буде містити поле (я), на основі яких створено індекс, а властивість Options буде містити ixPrimary. При роботі з вторинними індексами, властивість Name буде містити ім'я вторинного індексу, властивість Fields буде містити поле (я), на основі яких створено індекс, а властивість Options може як містити будь-яке значення, так і бути порожнім.

Властивість Fields у індексів, заснованих більш ніж на одному полі, містить імена полів, між якими ставиться крапка з комою. Індекси, засновані тільки на одному полі, у властивості Fields містять ім'я тільки даного поля.

Для обох типів індексів, побудованих як на основі одного, так і декількох полів, властивість Expression буде порожнім. Для індексів, побудованих на основі одного поля, властивість Fields буде містити ім'я поля, на основі якого був створений індекс. Властивість Fields у індексів, заснованих більш ніж на одному полі, містить імена полів, між якими ставиться крапка з комою.

Індекси, певні в команді CREATE TABLE як PRIMARY, у властивості Name будуть містити значення "RDB $ PRIMARYn", де n - порядковий номер символу, однозначно визначає первинний індекс в межах метаданих БД. Вторинні індекси містять фактичне ім'я індексу.

Зовнішні ключі також містять індекси, створені системою. Такі індекси будуть міститися в властивості IndexDefs і мати ім'я "RDB $ FOREIGNn", де n - порядковий номер символу, однозначно визначає індекс в межах метаданих БД.

Властивість Fields у індексів, заснованих більш ніж на одному полі, містить імена полів, між якими ставиться крапка з комою. Індекси, засновані тільки на одному полі, у властивості Fields містять ім'я тільки даного поля.