Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет1_FoxPro_2011.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
414.21 Кб
Скачать

5.1. Фільтрація записів.

Попередній відбір потрібних записів активного файлу бази даних для забезпечення їх подальшої обробки здійснюється командою:

SET FILTER TO [<умова>]

Задана < умова > діє, як фільтр, і визначає сукупність записів, які залишаються доступними для подальшої обробки іншими командами. Записи, що задовольняють умову фільтрації, називаються активними.

Наприклад, команда

SET FILTER TO NGRUP="EN-1-2"

забезпечує доступ для обробки тільки записів, які відносяться до студентів групи EN-1-2.

Команда SET FILTER діє тільки на активний файл бази даних, і тому для кожного активного файлу даних можна задати свою незалежну умову фільтрації.

Команда SET FILTER TO без параметра відміняє поточну установу фільтра.

Розглянемо, наприклад, виведення записів файлу даних SPISOK.DBF, які містять відомості про студентів групи EN-1-2. Для цього створимо командний файл FIL_GRUP.PRG:

USE SPISOK.DBF

SET FILTER TO NGRUP="EN-1-2"

GO TOP

LIST NGRUP, PRIZV, NAME

USE

П ісля виконання цих команд на екрані бачимо результат відбору студентів групи EN-1-2. в трьох полях: NGRUP, PRIZV, NAME (Рис.5.1.)

Рис.5.1

Фільтр починає діяти тільки у випадку, коли після команди SET FILTER TO < умова >, виконується переміщення покажчика записів командою GO TOP, яка встановлює покажчик на перший активний запис.

Оскільки для великих файлів даних команда SET FILTER TO виконується дуже повільно, то перевага віддається застосуванню значно бистріших способів фільтрації. Для цього використовується параметр KEY в команді BROWSE, або індексація з FOR – умовою, або оптимізуюча технологія Rushmore.

5.2. Пошук окремого запису в базі даних

В FoxPro є різні команди пошуку окремих записів, які реалізують послідовний і прискорений алгоритм пошуку. Головна мета пошуку – зробити шуканий запис поточним для подальшої його обробки іншими командами.

Послідовний пошук

Послідовний пошук застосовується для індексованих файлів даних і забезпечує швидкий доступ до потрібних записів.

Послідовний пошук складається з двох етапів: початкового пошуку та продовження пошуку.

Початковий пошук

Для послідовного пошуку одного самого першого запису в БД, що задовольняє задану FOR – умову використовується команда:

LOCATE FOR < умова > [< область дії >] [WHILE< умова >]

Пошук виконується серед записів, які належать вказаній < області дії >, і доти, поки виконується WHILE – умова ( якщо вона задана).

Якщо < область дії > або WHILE - умову не задано, команда LOCATE починає пошук запису в усьому файлі завжди з початку. Вона послідовно перевіряє всі записи і встановлює покажчик на перший запис, який задовольняє умову. При цьому, записи помічені на вилучення, пропускаються, якщо встановлено команду SET DELETED ON.

Якщо потрібний запис знайдено, про це можна дізнатись за допомогою спеціальної функції FOUND( ), що оцінює результат пошуку, і повертає значення "Істина" (.Т.). А номер знайденого запису можна визначити за допомогою функції RECNO( ).

Якщо потрібний запис не знайдено, функція FOUND( ) = .F. , функція RECNO( ) дорівнює числу записів в базі даних плюс 1, а функція, що визначає досягнення кінця файлу, EOF( ) повертає значення .Т.

Продовження пошуку

Другий етап - продовження пошуку запису, починаючи з поточного, забезпечується командою:

CONTINUE

Тут так само використовуються функції FOUND( ), RECNO( ) та

EOF( ).

Розглянемо приклади запису команди LOCATE :

LOCATE FOR NGRUP="EN-1-2" && знайти запис, що задовольняє умову

LOCATE FOR INF2=39 NEXT 7 && знайти запис за умовою

FOR INF2=39 серед наступних 7 записів, починаючи з поточного

LOCATE WHILE INF2 <37 && шукати запис, починаючи з поточного, до першого невиконання заданої умови: бал з інформатики не перевищує 37.

Для вірного використання WHILE – умови відповідну базу даних RETING.DBF необхідно попередньо проіндексувати по ключовому полю INF2, з метою упорядкування всіх записів за зростанням балів.

Для продовження пошуку далі використовується команда

CONTINUE

По досягненню межи пошуку виводиться повідомлення:

END OF LOCATE SCOPE && кінець області пошуку..

Розглянемо такий приклад. В базі даних RETING.DBF знайти всі записи про студентів BMISP<25 балів. Для цього введемо необхідні команди і побачимо реакцію системи:

USE RETING.DBF

INDEX ON BMISP TO BAL_ BMISP

LOCATE WHILE BMISP<25

Record=7 (запис 7, BMISP=20)

CONTINUE

Record=15 (запис 15, BMISP=22)

CONTINUE

В прикладі використовується БД RETING.DBF, яка індексується по полю BMISP. Команда LOCATE… знаходить перший запис, де BMISP=20. Продовження пошуку інших записів здійснюється командою CONTINUE і т.д. (див.рис.5.2.) По досягненню межи пошуку виводиться повідомлення.

END OF LOCATE SCOPE

Р ис.5.2.

Якщо задавати пошук командою

LOCATE FOR BMISP>25 то індексувати попередньо БД по полю BMISP непотрібно оскільки умова пошуку задається фразою FOR, що забезпечує перевірку абсолютно всіх записів.

У FoxPro для організації потрібного пошуку існує спеціальна функція:

LOOKUP (<поле 1>,<вир>,<поле 2>)

Функція шукає самий перший запис, в якому заданий вираз зустрічається в указаному <полі 2> активного файлу даних і повертає значення

<поля 1> цього файлу.

Якщо файл проіндексовано і індекс відкрито, пошук виконується прискореним методом, а якщо ні – послідовним.

Якщо потрібного запису не знайдено, функція повертає порожній рядок, а покажчик записів розташовується нижче останнього запису бази даних

(EOF( )=.T.)

Наприклад, в базі даних SPISOK.DBF треба знайти в полі PRIZV перше прізвище, що починається з літери "В" і вивести відповідний номер залікової книжки NZAL:

USE SPISOK

? LOOKUP (NZAL, "В", PRIZV) PRIZV, RECNO ( )

Результат:

11099 Волков 4

Функція знайшла запис з номером 4, в якому вперше зустрічається прізвище з літери "В" і вказала номер залікової книжки 11099.