Робота з бд пошук і фільтрація
Робота з БД: Пошук і фільтрація.
Робота з БД: Пошук і фільтрація.
1. Метод Locate: Метод Locate шукає перший запис, що задовольняє критерію пошуку, і якщо такий запис знайдено, робить її поточною. У цьому випадку в якості результату повертається True. Якщо запис не знайдено - False.
Список KeyFields вказує поле, або кілька полів, за якими ведеться пошук. У разі декількох пошукових полів їх назви розділяються крапкою з комою. Критерії пошуку задаються в варіантному масиві KeyValues так, що i-е значення KeyValues ставиться у відповідність i-му полю в KeyFields.Options дозволяє вказати необов'язкові значення режимів пошуку:
- loCaseInsensitive - пошук ведеться без урахування регістру літер, тобто KeyValues буде вважати слова "принтер" і "ПРИНТЕР", а також "принтер" однаковими.
- loPartialKey - запис вважається задовольняє умовам пошуку, якщо вона містить частину пошукового контексту, наприклад, що задовольняють контексту "Ма" будуть визнані слова: "Мама", "Машина" і т.д.
У разі, якщо поля входять в який-небудь індекс, Locate використовує цей індекс при пошуку. Якщо шукані поля входять в кілька індексів, важко сказати, який з них буде використаний. Відповідно важко передбачити, яка запис з безлічі записів, що задовольняють критерію пошуку, буде зроблена поточної - особливо в разі, якщо пошук ведеться не за поточним індексом.
При пошуку по полях, що не входять ні в один індекс, застосовується фільтр BDE. Ось приклад використання Locate: В цьому прикладі пошук проведений за допомогою одного рядка коду:
Метод Lookup знаходить знаходь потрібний запис, але не робить її поточної, а повертає значення деяких полів цього запису. Тип результату - Variant чи варіантний масив. Незалежно від успіху пошуку записи, покажчик поточного запису в таблиці не змінюється. На відміну від Locate, Lookup здійснює пошук лише на точну відповідність критерію пошуку та значення полів запису. У KeyFields вказується список полів, за якими необхідно здійснювати пошук. При наявності в цьому списку більш ніж одного поля сусідні поля розділяються крапкою з комою. KeyValues вказує пошукові значення полів, список яких міститься в KeyFields.
За наявності кількох пошукових полів, кожному i-му полю в KeyFields ставиться у відповідність i-е значення в KeyValues. При наявності одного поля його пошукове значення можна вказувати в якості KeyValues безпосередньо; в разі декількох полів їх необхідно приводити до типу вариантного масиву за допомогою VarArrayOf.
Як пошукових полів можна вказувати поля як входять до будь-якої індекс, так і не входять в нього; тип поточного індексу не має значення. Якщо пошукові поля входять в будь-які індекси, їх використання проводиться автоматично; в іншому випадку використовуються фільтри BDE.
Якщо в результаті пошуку запис не знайдено, метод Lookup повертає Null, що можна перевірити за допомогою оператора: В іншому випадку Lookup повертає з цього запису значення полів, список яких містить ResultFields. При цьому розмірність результату залежить від того, скільки результуючих полів зазначено в ResultFields:- одне поле - результатом буде значення відповідного типу або Null, якщо поле знайденої запису містить пусте значення;
- кілька полів - результатом буде варіантний масив, число елементів в якому менше або дорівнює числу результуючих полів (деякі поля знайденої запису можуть містити порожні значення).
Ф І Л Ь Т Р А Ц І Я
Властивість Filter компонента TTable дозволяє задати критерій фільтрації. В цьому випадку база буде відфільтрована, як тільки властивість Filtered дорівнюватиме TRUE. Синтаксис опису критерію схожий на синтаксис секції WHERE SQL-запиту з тим винятком, що імена змінних програми вказувати не можна, можна вказувати імена полів і літерали (явно задані значення); можна використовувати звичайні операції відносини і логічні оператори AND, NOT і OR, наприклад:
Ця запис фільтра залишить в таблиці записи, в яких поля Doljnost = 'доцент' і TabNum більше 3000 Рядок критерію фільтрації можна ввести під час прогону програми або на етапі конструювання. Наприклад, за допомогою такого обробника події OnChecked компонента CheckBox1 критерій фільтрації зчитується з поля Edit1 і поміщається в властивість Filter компонента Table1: За допомогою властивості можна визначити додаткові властивості фільтрації строкових полів:- foCaseInsensitive - фільтрація проводиться без урахування різниці регістра
- foNoPartialCompare - пошук проводиться на точну відповідність.
Подія OnFilterRecord виникає при встановленні значення True в властивість Filtered. Обробник події має два параметри: ім'я фильтруемого набору даних і змінну Accept, в яку програма повинна помістити True, якщо поточна запис задовольняє умові фільтрації.
На відміну від критерію в рядку Filtered, обмеженого рамками синтаксису умовного виразу, критерій, який реалізується в обробнику події OnFilterRecord, визначається синтаксисом Object Pascal і може організувати складні алгоритми фільтрації. Однак слід пам'ятати, що в обробнику OnFilterrecord послідовно перебираються всі записи БД, в той час як методи SetRange, ApplyRange і їм супутні методи компонента TTable використовують індексного-послідовний метод, тобто працюють з частиною записів у фізичній БД. Це робить використання обробника OnFilterRecord кращим для фільтрації невеликих об'ємів записів і сильно обмежує його застосування при великих обсягах даних.
Всякий раз, коли додаток обробляє подія OnFilterRecord, набір даних перекладається зі стану dsBrowse в стан dsFilter. Це запобігає модифікацію набору даних під час фільтрації. Після завершення поточного виклику обробника події ObFilterRecord набір даних переводиться в стан dsBrowse.
Приклад: щоб створити набір даних з тих записів бази даних, в яких поле "Посада" містить значення "викладач", можна використовувати такий обробник: Ще один приклад: відфільтрувати базу "Співробітники" за умовою "Відібрати всіх, у кого табличний номер (поле "#") більше значення, що вводиться користувачем в Edit1, і в поле "ПІБ" є підрядок символів, що вводяться користувачем в Edit2 ":
Якщо в рядку Filter і обробнику події OnFilterRecord задані різні критерії фільтрації, виконуються обидва.
Методи розширеної фільтрації
1. Методи фільтрації
Крім описаних нижче методів, властивих тільки TTable, набори даних мають також загальні властивості, методи і події для фільтрації - Filter, Filtered, OnFilteredRecord, FindFirst, FindLast, FindNext, FindPrior.
Для фільтрації записів TTable має наступні методи:- SetRangeStart - встановлює нижню межу фільтра;
- EditRangeEnd - утанавлівается верхню межу фільтра;
- ApplyRange - здійснює фільтрацію записів в TTable;
- SetRange - має той же ефект, що і послідовне виконання методів SetRangeStart, EditRangeEnd і ApplyRange.
Фільтрація методами ApplyRange, SetRange має проводитися за ключовими полям.По замовчуванням береться поточний індекс, який визначається властивістю TTable.IndexName або TTable.IndexFieldNames. Якщо значення цих властивостей не встановлені, за замовчуванням використовується головний індекс. Тому, якщо потрібно використовувати індекс, відмінний від головного, необхідно явно перевстановити значення властивості TTable.IndexName (ім'я поточного індексу) або TTable.IndexFieldNames (список полів поточного індексу).
2. Використання SetRange
Метод показує не тільки записи, індексні поля яких лежать в діапазоні [StartValues..EndValues].
Приклад: Нехай в наборі даних Table1 показуються всі записи. Включимо в структуру запису набору даних два поля: "Номер групи" і "Найменування товару". Нехай поточний індекс побудований по полю "Номер групи".
Напишемо такий обробник події: CheckBox1.Click: В відфільтрованому наборі даних показуються тільки ті записи, індексне поле поточного індексу у яких (в нашому випадку "Номер групи") має значення, що лежить в заданому діапазоні. В даному випадку діапазон визначається змінної GrNumTmp. Тому для GrNumTmp = 3 будуть показані записи, що належать до групи 3.
Якби ми захотіли, щоб у наборі даних фільтрувалися записи з декількох груп, то нам слід було б додати в форму другий компонент Edit2, в якому вводився б номер кінцевої групи, в той час як в Edit1 вводився б номер початкової групи: procedure TForm1.CheckBox1Click (Sender: TObject);