Індексування таблиць foxpro

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

Індекси потрібно створювати

1. на прізвище-ім'я-по батькові - основний спосіб, найбільш зручний для операторів
2. по ключовому полю - для зв'язування баз
3. за тими полями, по яким буде часто робитися вибірка - для прискорення роботи програми
4. по тим полях, за якими потрібна сортування, якщо за прізвищами не влаштує - зазвичай це будь-якої номер

Тому першу таблицю потрібно індексувати за кодом (щоб забезпечити унікальність вводятьсязначень) і на прізвище, другу - за кодом (для зв'язку з першою таблицею) і за номером документа (для швидкого пошуку).

Ось тут виникає питання, як це краще зробити. Зрозуміло, що сортування на прізвище недостатньо, бажано врахувати ім'я та по батькові. Але якщо створити індекс найпростішим способом: famil + name + father то він буде великим, що погано. Місце на диску займає, довше вантажиться, легше пошкоджується. І при цьому, більше ніж наполовину він складається з кінцевих пробілів.

Можна зробити так: trim (famil) + left (name, 3) + left (father, 3) При цьому список буде відсортований за прізвищем повністю, а по імені-по батькові - на глибину три символи. Тобто Миколайович може виявитися перед Микитовичем, але практично це непомітно. Мінус способу - не так точно буде працювати пошук. При цьому для отримання точного результату потрібні додаткові хитрощі. Втім, вони все одно будуть потрібні, оскільки у великих базах повні тезки зустрічаються часто.

А при роботі в Project Manager все відбувається навпаки - подвійне клацання (або кнопка Modify) редагує структуру, а кнопка Browse - вміст таблиці.

Ім'я індексу потрібно придумати, тип ж краще поки не чіпати (про це трохи пізніше) .Прідумав і ввівши ім'я індексу, в графі "Expression" (обведено синім) потрібно вказати поле, за яким будується даний індекс, в даному випадку це поле kod.

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

Простіше і найкраще ввести відповідний вираз (наприклад ім'я поля) графу в "Expression" вручну. Але якщо дуже хочеться, можна використовувати будівник. Для цього потрібно клацнути мишкою по кнопці з точками. Відкриється вікно:

Працювати з ним не так-то просто, але в даний момент все, що потрібно - це вибрати не друкуючи руками, ввести в "Expression" слово "kod". Робиться це мишкою, двічі клацнувши на ім'я поля в Field-е. Після чого натискаємо "ОК", і перший індекс створений.

Наступний індекс назвемо pofio. За допомогою миші ставимо курсор в самотню порожню рамочку під словом pokodu і повторюємо всі дії. Тільки цього разу обходимося без будівника, просто впечатав в "Expression" наступний текст

В цьому випадку у прізвищі будуть обрізані хвостові прогалини, і в індекс, для Олександра Сергійовича Пушкіна, потрапить значення ПушкінАлеСер. Для сортування цього достатньо. І пізніше дасть нам можливість повправлятися з пошуком для такого екзотичного рішення.

У підсумку, після натискання на кнопку "ОК" виходить так:

Чорні стрілочки вгору означають, що індекс побудований по зростанню значень, тобто від А до Я, або від 1 до 9.

Кнопочку зі подвійною стрілкою вгору-вниз можна захопити мишкою і перетягнути вище або нижче, помінявши порядок індексів. Практично це впливає тільки на команду set orde to, якщо в ній використовуються порядкові номери індексів.

Робота майже зроблена, залишилося лише одне, але дуже важливе дію - для індексу "pokodu", вказати тип "Primary". Але не поспішайте.

Натисніть ОК, щоб зберегти зміни, і знову відкрийте це вікно, і в ньому - вкладку Indexes. Тепер можна змінити тип індексу на Primary.

В результаті Фокс буде стежити, щоб в цьому полі все значення були унікальними, що необхідно для зв'язування баз. Якщо ця умова порушиться, виникне плутанина, яка зробить вторинну базу непридатною для використання. Адже однозначно зв'язати номер паспорта з прізвищем буде вже неможливо.

А чому так складно, чому не можна було відразу вказати Primary? Можна, але я не знав, заповнили ви таблицю відразу після створення, чи ні. Якщо в таблиці є кілька рядків, в яких не заповнено поле "kod", наприклад порожніх рядків, то при спробі змінити Regular на Primary виникне помилка. І зовсім незрозуміло, що з нею робити, оскільки помилка в одному місці, а ви зараз працюєте в іншому.

Якщо у вас все ж так вийшло, потрібно видалити порожні записи, або ввести в поле kod різні для кожного запису числа (знаки, слова). Якщо ви вирішили видалити рядки, то після цього не забудьте виконати упаковку (командою pack). Адже Фокс не видаляти записи відразу, а тільки позначає їх як вилучені, на випадок, якщо ви передумаєте.

Все, з першої таблицею закінчили.

Тепер всі дії потрібно повторити для другої таблиці, за винятком того, що для поля код тип індексу Regular міняти на Primary НЕ потрібно. Інакше програма не працюватиме. Вірніше буде, але неправильно. Один документ для людини можна буде ввести, а другий - ні.

Структура другої таблиці у нас така:

Індекси потрібно створювати по полю kod і nom_doc (або ser_doc + nom_doc, якщо хочете врахувати серію). Оскільки вони створюються за кодом і по номеру, назвемо їх відповідно pokodu і ponomeru.

Після створення індексів в другій таблиці база буде виглядати так:

Видно поля таблиць, індекси, чітко позначений первинний ключ. Ми отримали дуже важливий результат - база даних створена і готова до роботи.