Конструкція like в запиті

Конструкція like в запиті
Всім привіт, сьогодні ми розглянемо урок, пов'язаний з Базами даних, а зокрема ми розглянемо, як зробити підказку користувачу, який вводить дані, наприклад, для пошуку. Дану функцію можна спостерігати в багатьох програмах, а також на багатьох сайтах, наприклад, Вконтакте. коли відбувається пошук людини, з'являється список, що випадає, в якому можна знайти схожі збіги, що полегшує введення даних користувачу, цю функцію ми випробуємо і на Delphi на прикладі Бази даних MS Access, тільки трохи в найпростішому варіанті. Але це підходить і до інших БД, які можна використовувати в Delphi. Ми вже багато розглядали прикладів, для пошуку даних, в цьому випадку ми будемо використовувати SQL -Конструкція LIKE. яку раніше ми також розглядали і використовували. Приклад даної конструкції описаний нижче:

Як видно вище, конструкція LIKE проста для пошуку даних за шаблоном, для неї необхідно вказати один вхідний параметр.

А тепер приступимо до нашого прикладу і завдання. Для початку давайте створимо якусь Базу даних вMSAccess. Не будемо надто ускладнювати приклад, це Ви зможете зробити і самі, а просто зробимо одну табличку, назвемо її Goroda. в ній я створив такі поля:

Тепер нам необхідно трохи заповнити нашу табличку, зовсім не багато, я додав туди всього-на-всього 5 записів:

Конструкція like в запиті

Саму структуру таблиці, ви можете побачити на малюнку:


Йдемо далі, для прикладу, створимо проект в Delphi. на формі розмістимо наступні компоненти:

У властивості Caption компонента TLabel напишемо - «Місто». Далі виділяємо компонент TAdoConnection. в його властивості ConnectionString вказуємо Постачальника даних - в нашому випадку це MicrosoftJet 4.0OLEDBProvider. Переходимо до наступного пункту підключення (вкладці), в якій вказуємо шлях до нашої Базі даних (можна вказати повний шлях до Бази даних, але якщо вона знаходиться в цій папці з проектом, то просто вказуємо повне ім'я нашої Бази даних з розширенням, в нашому випадку * .mdb). Натискаємо OK і переходимо до властивості Mode. в якому вибираємо зі списку cmShareDenyNone. хоча можна просто вибрати читання cmShareDenyRead. Ну і властивість LoginPromt ставимо в False (забороняємо виводити вікно, для запиту введення імені і пароля, який дозволяє отримати доступ до нашої Базі даних), якщо звичайно у Вашій Базі даних не встановлено пароль, в іншому випадку Вам доведеться вводити логін і пароль, можна це забити в нашому підключенні, щоб постійно не вводити одні й ті ж дані. Я пароль на Базу даних не ставив, тому встановлюємо в False. Ну і нарешті нам необхідно активувати підключення до нашої Базі даних, для цього властивість Connected встановлюємо в False.

Тепер переходимо до налаштування нашого компонента TADOQuery. Виділяємо наш компонент TADOQuery і у властивості Connection вказуємо ім'я компонента TADOConnection. в моєму випадку це AdoConnection1. Далі нам знадобитися ще одна властивість компонента TADOQuery - це Parameters. Відкриваємо його і додаємо новий параметр (його назва), я його назвав - gorods. вказуємо йому тип даних (DataType) - ftString і все закриваємо наше вікно. Відразу активувати наш запит не треба, так як в ньому ми не прописали ніякої SQL -конструкції, та й Вам власне це не вдасться. Загальний вигляд мого вікна проекту вийшов таким:

Тепер переходимо до написання коду програми.

Виділяємо наш компонент TEdit і переходимо до списку його подій, знаходимо там подія OnKeyUp і натискаємо подвійним клацанням, для відкриття вікна коду програми для цієї події. Чому саме ця обставина, тому що воно нам саме більше підходить, воно виникає, генерується після того, як користувач ввів черговий символ місто і вже відпускає кнопку, також в дану подію є аргумент Key. який зберігає числовий код натиснутоюклавіші.

Тепер переходимо до написання коду, відкриваємо ще раз наше подія і пишемо туди наступний код:

Тепер давайте детально розберемо наш код. Мінлива pos. нам необхідна для запам'ятовування поточної позиції введення. Далі в умови ми відсіюємо всі коди клавіш які менше 47.

За допомогою ClearSelection ми знімаємо виділення в компоненті TEdit. Далі ми пишемо наш SQL-запит, в якому і присутній конструкція LIKE. а в ній ми вказуємо в умови наш параметр gorods. Уже нижньої рядком ми задаємо нашому параметру значення з TEdit. для початку видаливши всі прогалини, які можуть бути попереду, а також украй нашої записи додаємо символ%, який дає зрозуміти запитом, що після введеного користувачем слова можуть йти зовсім будь-які символи.

В кінці все просто, ми присвоюємо в TEdit. то що знайшли в Базі даних (якщо знайшли звичайно), і виділяємо в слові ті символи, які можливо користувач і шукає, якщо нічого не знайшли, то видаємо просто звуковий сигнал. Ось, що у мене приблизно вийшло:

А що стосується даного прикладу, то основні його гідності полягають у тому, що він не тільки знаходить назву міста, який відповідає шаблоном LIKE. але і також допомагає користувачеві закінчити введення, підставляючи найбільш відповідна назва міста.

Тому використовується в своїх розробках саме цю конструкцію пошуку, щоб полегшити користувачеві працювати у Вашій програмі. Також я викладаю исходники статті, які можна скачати тут. Исходник перевірявся в IDE - Delphi 7.

Схожі записи

Ось, до речі, питання.
Коли Ви будете робити пошук в ComboBox (частина 2), тобто одна з альтернатив (видних на перший погляд):
- додати ORDER BY gorod, щоб в відкидається списку показувати міста за алфавітом;
- вести статистику (динамічну, статичну) по користувачах в містах, щоб потім упорядкувати «підказки» міст по їх популярності;

У будь-якому випадку - удачі!

да, приблизно так і планую організувати

конструкція
ADOQuery1.Active:=True;
with ADOQuery1 do
begin
if Active then
Close;
Open;
.
Для чого це зроблено? Адже всередині Open відбувається якраз Active: = True. Виходить що спочатку ви робите Open, потім перевіряєте активний чи квері, якщо так, то закриваєте і потім тут же знову відкриваєте. Але при такому коді у вас завжди квері перед перевіркою буде відкритий. Поясніть, навіщо це зроблено?
З.И. Так до речі, можливо варто зробити паузу між введенням останнього символу і пошуком даних. Оскільки якщо даних в БД буде багато, то після кожного введення символу будуть гальма, що може не сподобатися користувачеві. Пауза в півсекунди цілком прийнятно (якщо користувач вводить текст швидко)

Багато разів робив автозавершення вводиться слова - перепробував масу варіантів. Так ось найоптимальніший - форматувати пошук по таймеру. Тобто користувач натиснув кнопку - таймер почав відлік (наприклад 500 мс), якщо натиснув ще раз - то починається відлік заново. За спрацьовування таймера - виконання запиту.
Ну і взагалі, якщо довідник не великий - то простіше зафетчіть його весь в комбобокс, а вже він сам все буде завершувати без винаходу велосипеда. Ось на великих таблицях - доводиться перекручуватися

доброго часу доби, допоможіть мені будь ласка, натрапив на цю сторінку в мережі, спасибі Вам за таке пояснення у всьому, але у мене є проблема:
У мене є Б / Д, 2 таблиці вони між собою не пов'язані.
Таблиці були пов'язані з допомогою компонентів ADOQUERY, ADOCONNECTION, DBGRID, DATASOURCE.
і таких 2 таблиці, скажіть мені будь ласка як зв'язати їх між собою. чи можливо це без ADOTABLE.
і мені потрібно щоб з таблиці №2 по вибраному рядку він вирізав запис і вставляв в табліцу№1. Чи можлива реалізація такого коду, з такою конструкцією.

Андрій, у Вас настільки корисний сайт. Дякую Вам за нього. Маю питання \ є запитання. При програмуванні на Delphi, я використовую таблиці БД Paradox і результат мене не дуже радує. Іноді дані в таблицю не заносяться зовсім. А де створювати таблиці БД порадили б Ви? Дякуємо.

здрастуйте, я б використовував якісь безкоштовні СУБД, MySQL - хороша, MS Access теж хороша, але треба купувати, ще мені подобатися FireBird, MS SQL відмінна, взагалі ряд є СУБД хороших як платних так і безкоштовних, дивлячись для яких Ви цілей будете використовувати

Андрій, здрастуйте. У мене чомусь синтаксична помилка в цьому рядку: ADOQuery1.SQL.Add ( 'SELECT FIO * FROM tbFamilii WHERE FIO LIKE: familia');
Від чого це може бути?