Locate, Бази даних, Delphi, статті на
Цей універсальний метод пошуку встановлює поточний запис як перший рядок, який відповідає набору критеріїв пошуку. Використовуючи метод Locate, ми можемо шукати значення одного або більше полів, розташованих у масиві змінних. У наведеному нижче коді метод Locate шукає перший запис, що містить рядок "Zoom" у полі "Name". Якщо виклик Locate повертає True - запис знайдено і встановлено як поточний.
Метод Lookup не переміщує курсор у відповідний рядок, а лише повертає його значення. Lookup повертає масив змінних, що містять значення з полів, зазначених у розділеному точкою з комою списку імен, значення яких повинні бути повернені з рядка, що цікавить нас. Якщо відповідних нашому запиту рядків не знайдено, Lookup поверне порожню (Null) змінну.
Наступний приклад заповнює заповнює масив змінних LookupRes
Одна з переваг методів Locate і Lookup полягає в тому, що вони не вимагають, щоб таблиця була проіндексована. Однак, функція Locate буде працювати швидше, якщо таблиця буде проіндексована.
Індексування
Індексування допомагає знаходити та сортувати записи набагато швидше. Ви можете створювати індекси на одному полі або на декількох полях. Індексування кількох полів дозволяє розрізняти записи, в яких перше поле може мати те саме значення. У більшості випадків при частому пошуку/сортуванні бажано індексувати поля. Наприклад, якщо Ви шукаєте певний тип програми в полі Type, Ви можете створити індекс на це поле для прискорення пошуку за типом. Слід зазначити, що первинний ключ таблиці автоматично проіндексований, а також Ви не можете індексувати поля з типом даних OLE Object. І ще, зверніть увагу, що якщо багато хто ззначень у полі ті самі, індексування в даному випадку не прискорить процес отримання даних з БД.
BDE (не ADO) Delphi надає нам певні функції для роботи з таблицями бази даних, які дозволяють нам шукати необхідні значення. Ось деякі з них Goto, GoToKey, GoToNearest, Find, FindKey, Find Nearest і т.д. Для більш повної довідки за цими методами, Вам слід переглянути у довідці Delphi, у розділі: Searching for records based on indexed fields. ADO навпаки не підтримує ці методи. Натомість він представляє метод Seek.
В ADO метод Seek використовує індекс пошуку даних. Наприклад, при пошуку в базі даних Access, якщо не задати індекс, база даних буде використовувати Первинний індексний ключ.
Seek використовується для пошуку записів із зазначеним значенням (або значеннями) у полі (або полях), на яких заснований поточний індекс. Якщо Seek не знаходить бажаний рядок, то жодної помилки не видається, а курсор встановлюється на кінець даних. Seek повертає значення boolean, що вказує на успішність пошуку: True якщо запис було знайдено або False якщо записів, які відповідають нашим вимогам, не було знайдено.
Метод GetIndexNames у компоненті TADOTable повертає список (наприклад: комірок combo box) доступних індексів для таблиці.
Цей же список доступний у режимі розробки як IndexName компонента TADOTable. Властивість IndexFieldNames може використовуватися як альтернативний метод для визначення індексу, що використовується в таблиці. У IndexFieldNames ми вказуємо ім'я кожного поля для використання в таблиці.
Метод Seek має таке визначення:
- KeyValues масив значень Variant. Так як індекс складається з одного або більше стовпців, масив містить значення, які будутьпорівнюватися з відповідними стовпцями.
- SeekOption вказує на тип порівняння між колонками індексу та відповідним KeyValues.
- SeekOption - Призначення
- soFirstEQ - Покажчик на запис позиціонується в перший запис, що задовольняє вимогам, якщо він знайдений, або в кінець таблиці, якщо не знайдений
- soLastEQ - Покажчик на запис позиціонується на останній запис, що задовольняє вимогам, якщо він знайдений, або в кінець таблиці якщо ні.
- soAfterEQ - Покажчик на запис позиціонується на запис, що задовольняє вимогам, якщо такий знайдений, або відразу після того, який був знайдений.
- soAfter - Покажчик на запис позиціонується відразу після того, який був знайдений.
- soBeforeEQ - Покажчик на запис позиціонується на запис, що задовольняє вимогам, якщо такий знайдений, або перед тим, який був знайдений.
- soBefore - Покажчик на запис позиціонується перед тим записом, який було знайдено.
Примітка 1: метод Seek підтримує курсори лише з боку сервера (server-side). Seek не працюватиме, якщо значення властивості CursorLocation дорівнює clUseClient. Для цього використовується метод Supports для визначення основного провайдера Seek.
Примітка 2: коли Ви використовуєте метод Seek для кількох полів, Seek поля повинні бути в тому ж порядку як поля в основній таблиці. Якщо це не так, то метод Seek видасть помилку.
Примітка 3: Ви не зможете використовувати метод Seek у компоненті TADOQuery.
Щоб визначити, чи було знайдено відповідний запис, ми використовуємо властивості BOF або EOF (залежно від напрямку пошуку). Наступний код використовує індекс, зазначений у ComboBox, щоб знайти значення, що міститься у вікніредагування Edit1.