Как сделать поиск в делфи
Поиск в Базе Данных
Поиск в ADoquery, Delphi, поиск в базе данных
Доброго времени суток многоуважаемые пользователи данного сайта! Есть очень глупая проблема, с.
Реализовать поиск и выбор данных в форме в базе данных Access
Здравствуйте! Подскажите пожалуйста,как реализовать поиск и выбор данных в форме в базе данных.
Поиск в базе данных (поиск далее)
Добрый вечер! Нужна ваша помощь. Делаю поиск по базе, использую компонент AdoTable. В базе есть.
Поиск по базе данных
Всем мир и привет! Как найти нужную запись по запросам sql если не знаешь в какой таблице.
я делал через ADOQuery. У тебя может другой компонент связи но в нем должно быть событие OnFilterRecord
на компоненте ADOQuery
Вложения
ДОВІДНИК.rar (480.2 Кб, 606 просмотров) |
рекомендую IBExpert поставить http://ibexpert.net/ibe/index. nloadTrial
для пользователей с exUSSR бесплатно
Там создашь подключение к БД и будешь видеть все по ней, ну и куча доп возможностей появится
рекомендую IBExpert поставить http://ibexpert.net/ibe/index. nloadTrial
для пользователей с exUSSR бесплатно
Там создашь подключение к БД и будешь видеть все по ней, ну и куча доп возможностей появится
в этом и проблемка, по дефолту нет поддержки иных кодировок, тока латинка
Если вы не укажете кодировку при создании БД, то в rdb$character_set_name будет указано NONE. То есть все строковые столбцы и переменные, для которых не указана кодировка, будут иметь кодировку NONE, и символы будут рассматриваться как «без кодировки». В этом случае можно указывать кодировку строковых столбцов при создании таблиц, процедур и триггеров
Если вы ошиблись при создании БД, и не указали кодировку,извлеките скрипт БД вместе с данными, и создайте БД из этого скрипта, указав DEFAULT CHARACTER SET WIN1251.
Поиск в базе данных
В данной статье будут рассмотрены различные способы поиска данных разработке ADO-приложений в Delphi
Обычно алгоритм поиска строится по следующей схеме: начинаем поиск с начала таблицы, проверяем поле в каждой строке на предмет удовлетворения нашему критерию, останавливаем цикл на выбранной записи.
Давайте рассмотрим несколько способов расположения данных, полученных из БД посредствам компонента ADODataset (для Таблицы и для Запроса).
Locate
Lookup
Метод 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 имеет следующее определение:
Примечание 1: метод Seek поддерживает курсоры только на стороне сервера (server-side). Seek не будет работать, если значение свойства CursorLocation равно clUseClient. Для этого используется метод Supports для определения основного провайдера, поддерживающего Seek.
Примечание 2: когда Вы используйте метод Seek для нескольких полей, то Seek поля должны быть в том же самом порядке как поля в основной таблице. Если это не так, то метод Seek выдаст ошибку.
Примечание 3: Вы не сможете использовать метод Seek в компоненте TADOQuery.
Чтобы определять, была ли соответствующая запись найдена, мы используем свойства BOF или EOF (в зависимости от направления поиска). Следующий код использует индекс, указанный в ComboBox, чтобы найти значение, содержащееся в окне редактирования Edit1.
Поиск в Delphi7 через Edit
Поиск в StringGrid через edit
Всем доброго времени суток. У меня возникли сложности с заданием в колледже. У меня есть stringgrid.
Поиск в ListBox через Edit
Данный код находит совпадения, но он выводит сообщение Нет совпадений Я так понимаю это потому.
Поиск элементов через Edit в StringGrid’e
Мне нужно чтобы при вводе названия продукта в Edit, и по нажатию кнопки выходила информация об его.
Поиск в файле через поле Edit
Привет всем. Есть программа которая записывает введенные данные в поле Edit в файл. Вот сам код.
Да.
procedure TForm1.Edit5Change(Sender: TObject);
Добавлено через 1 минуту
Можешь чуток по подробнее?
Добавлено через 6 секунд
Можешь чуток по подробнее?
Поиск через edit
Помогите плиз. Есть 2 DBGrid, у каждой есть 2 колонки с названием «Наименование » нужно сделать так.
Поиск через Edit
Скажите как осуществить поиск по БД, по определенному полю,используя Edit? AdoQuery,Adotable..как.
ADOTable: поиск через 2 Edit-a
Доброго времени суток. Столкнулся с очень неприятной ситуацией. В общем у меня есть две формы. На.
Поиск в dbgrid через 2 edit-а
В общем, у меня есть форма, на ней dbgrid, где записаны пациенты, их персональные данные и еще на.
Поиск и фильтрация данных в Delphi
Базы данных являются удобным средством хранения структурированной информации. Однако само по себе накопление и хранение информации делает базу данных большой кучей мусора. Удобно организованный поиск и отбор информации способен резко повысить эффективность ее использования. В данной статье мы попытаемся разобраться в методах поиска информации, реализованных в Delphi. Предполагается, что Вы в общих чертах знакомы с теорией реляционных баз данных и имеете некоторый опыт программирования на Delphi.
Для понимания реализации методов поиска Delphi необходимо сделать краткое отступление относительно идеологии построения баз данных. Итак, всю систему работы с БД можно представить в виде трех слоев или модулей (рис.1). Хранилище данных отвечает за хранение информации и обеспечение ее целостности и непротиворечивости. Бизнес логика реализует набор правил предметной области приложения, т.е правил изменения и дополнения информации. Презентационный слой выводит данные в форме доступной пользователю и обеспечивает интерфейс для взаимодействия с бизнес логикой.
Очевидно, что нас будет интересовать взаимодействие двух верхних модулей с хранилищем данных. В зависимости от специфики реализации базы данных данные слои могут объединяться или реализовываться как отдельные независимые модули.
Для нашей задачи системы управления базами данных можно классифицировать по следующим признакам:
По типу хранилища данных:
— файловые
— серверные
По количеству слоев:
— Двухуровневые
— Многослойные
Универсальные методы класса TDataSet
Класс TDataSet является базовым классом компонента, реализующим функции доступа к БД. Многие из его методов являются абстрактными и реализуются в потомках. Он имеет два метода для поиска данных: Locate и Lookup. Данные методы ищут запись, удовлетворяющую заданным условиям.
Разница между ними в том, что функция Locate при поиске записи позиционирует курсор на найденную запись, а Lookup не делает этого. Если поля указанные для поиска индексированы, то поиск производится с использованием индекса, что значительно ускоряет поиск. В качестве примера рассмотрим использование данных методов на примере TTable в двухуровневом приложении. Итак, начнем с генерации нового приложения File/New Application. Мы получим проект приложения с главной формой. На данную форму поместим компонент Table с закладки Data Access, по умолчанию он будет иметь имя Table1. Теперь настроим компонент Table1 на взаимодействие с таблицей country из базы данных DBDEMOS. Для этого необходимо установить следующие свойства Table1 в следующей последовательности:
1. DatabaseName ==> DBDEMOS
2. TableName ==> country.db
Теперь можно активизировать компонент Table1, установив его свойство Active в значение true. Далее разместим на форме компонент DataSource, позволяющий сделать данные Table1 доступными для визуальных компонентов отображения данных. Свяжем DataSource1 c Table1, установив св-во DataSet компонента DataSource1 равным Table1. Разместим визуальные компоненты отображения данных со страницы Data Controls: DBGrid и DBNavigator. Установим св-во DataSource обоих равным DataSource1. В результате мы получим форму, изображенную на рис. 2. Откомпилировав и запустив данный проект, мы сможем просматривать и редактировать данные таблицы country. Остается добавить элементы для организации поиска в таблице. Разместим на форме компонент Edit1 и две кнопки. Св-во Caption кнопки Button1 установим равным «Locate», а Button2 «Lookup». Далее в обработчике события OnClick кнопки Button1 организуем вызов метода Locate. Код обработчика события приведен ниже:
Рис. 1.
Рис. 2.
Теперь пришло время протестировать наш пример. Запустим программу на выполнение, в строке ввода пишем Cuba и нажимаем кнопку Locate. Курсор в DBGrid1 должен переместиться на запись, имеющую в поле Name введенное значение (рис.3).
Однако наш пример имеет пока один недостаток, в строку редактирования необходимо вводить полное имя c учетом регистра, т.е если мы вместо Cuba введем, например Cu или cuba, то наш поиск будет безрезультатным. Естественно это не может нас не устраивать. Поэтому пришло время рассмотреть более подробно опции поиска. Данный параметр имеет тип TlocateOptions и позволяет задавать набор из двух параметров поиска: loCaseInsensitive и loPartialKey. Установка первого из них отменяет чувствительность к регистру в текстовых полях, а второй позволяет искать запись частично соответствующие заданному условию. С учетом вышесказанного код обработчика событий будет выглядеть следующим образом:
Следующей проблемой является поиск записи по нескольким полям. Для организации поиска по имени страны и континенту добавим на форму еще один компонент Edit2. Код обработчика события нажатия на кнопку Locate изменим следующим образом:
Как видно, при поиске по нескольким полям, все они перечисляются в параметре функции Locate
В ходе написания этой статьи выяснилась одна особенность. Частичный поиск при поиске по нескольким полям работает лишь для последнего поля, указанного в списке.
Модифицируем наш пример для использования функции Lookup. Ниже приведен код обработчика события нажатия на кнопку Lookup:
Как видно из кода, мы проводим поиск по полям Continent, Name. При нахождении записи мы выдаем сообщение о площади страны, при это курсор на найденную запись не перемещается. К сожалению в параметрах функции отсутствует LocateOptions.
Исходный код данного примера расположен в файле.
Итак, подведем некоторые итоги. Функции Locate и Lookup предназначены для поиска в базе данных одной записи, удовлетворяющей заданным условиям. Данные методы определены в классе TDataSet как виртуальные и могут быть переопределены в классах потомках. Метод Locate устанавливает курсор на обнаруженную запись, Lookup этого не делает. Метод Locate, хотя и с некоторыми оговорками, может искать записи по частично заданному ключу.
Необходимо отметить, что очень часто необходимо найти сразу несколько записей. Для решения такого рода задач нужно применять методы, предоставляемые классом Ttable, Tquery …, либо проводить фильтрацию. Как это сделать описано ниже.
Методы класса TTable
Компонент TTable предназначен для работы с таблицей база данных. Данный компонент используется в двухуровневых приложениях баз данных, либо в сервере приложений в трехуровневой БД. Как правило, использование TTable для работы с клиент-серверной БД оказывается менее эффективным, чем TQuery, поскольку TTable извлекает сразу ВСЕ записи из таблицы, а в TQuery лишь удовлетворяющие условиям запроса.
Компонент имеет несколько специфических методов для поиска данных. Данные методы используются для поиска только по индексированным полям (для dBase и Paradox как минимум). Все они делятся на две группы:
— Методы поиска одной записи
— Методы поиска диапазона записей.
Рассмотрим сначала первую группу методов. К ним относятся GotoKey, FindKey, GotoNearest, FindNearest. Первые два метода используются для поиска строго соответствия, другие ищут частичное соответствие.
В качестве примера создадим новое приложение, на главной форме разместим компоненты Table, DataSource, DBGrid, DBNavigator. Установим св-ва данных компонентов в соответствии с таблицей 1. Отметим, что таблица country.db имеет индексированное поле Name, по которому мы далее организуем поиск.
Table1 | |
DatabaseName | BCDEMOS |
TableName | Country.db |
Active | true |
DataSource1 | |
DataSet | Table1 |
DBNavigator1, DBGrid1 | |
DataSource | DataSource1 |
Далее разместим на форме компонент Edit и четыре кнопки, установив их св-во Caption в GotoKey, GotoNearest, FindKey, FindNearest. Ниже приведен код обработчиков событий нажатия на эти кнопки.
Прокомментируем вышеприведенный код. Методы GotoKey, FindKey проводят поиск на точное соответствие заданному ключу. Они возвращают значение типа boolean, говорящее об успехе поиска.
Методы GotoNearest, FindNearest проводят поиск первой записи хотя бы частично соответствующей ключу. Они не возвращают значений, т.к такой вид поиска всегда будет успешным.
Перед вызовом методов GotoKey, GotoNearest необходимо вызывать метод EditKey или SetKey, чтобы перевести компонент Table в режим редактирования ключа поиска.
Методы поиска диапазона записей позволяют отобразить записи таблицы, лежащие в указанном диапазоне значений поля. Для таблиц Paradox и dBase данные методы работают только для индексированных полей. К данным методам относятся SetRangeStart, SetRangeEnd, EditRangeStart, EditRangeEnd, ApplyRange, CancelRange. Техника использования данных функций очень проста.
Сначала необходимо установить начало и конец диапазона вызовом функций SetRangeStart, SetRangeEnd, EditRangeStart, EditRangeEnd, указывая при этом значения полей формирования диапазона. Затем вызовом ApplyRange применить указанный диапазон. Сброс установленного диапазона позволяет вновь отобразить все записи таблицы. Он выполняется вызовом функции CancelRange.
Для иллюстрации вышесказанного создадим новый проект, на главную форму поместим компоненты Table, DataSource, DBGrid, DBNavigator. Установим их свойства как указано в таблице 1. Далее разместим две строки ввода и две кнопки SetRange и CancelRange. Обработчики событий нажатия этих кнопок приведены ниже.
Компонент TQuery предназначен для извлечения данных с помощью языка SQL (Structured query language). Компонент используется в двухуровневых приложениях работы с базами данных и в сервере приложений в трехуровневых. Он, как правило, применяется для работы с клиент-серверными базами данных.
Сам компонент TQuery не имеет специальных методов поиска записей, однако, возможности поиска заложены в языке SQL.Ограничения на простые данные, получаемые предложением select, реализуются с помощью предложения where.
В качестве иллюстрации приведем следующий пример. Создадим новое приложение, разместим на его главной форме компоненты: Query, DataSource, DBGrid, DBNavigator, Memo, две кнопки Button1 и Button2.
Установим свойства компонентов, как это указано в таблице 2.
Query1 | |
DatabaseName | BCDEMOS |
SQL | SELECT Name, Capital, Continent, Area, PopulationFROM «country.db» CountryWHERE (Area > 50000) AND (Population > 20000000) |
Active | true |
DataSource1 | |
DataSet | Query1 |
DBNavigator1, DBGrid1 | |
DataSource | DataSource1 |
Button1 | |
Caption | Применить |
Button2 | |
Caption | Отменить |
Вид главной формы на этапе разработки приведен на рис. 4.
Рис. 3.
В обработчике события OnCreate формы реализуем копирование текста запроса из Query1, код приведен ниже.
Кнопка Button1 при нажатии будет переносить текст запроса, исправленный пользователем, из Memo1 обратно в Query1. Обработчик нажатия Button1 будет выглядеть так:
Обработчик события нажатия Button2 установим, указывающим на FormCreate.
Откомпилируем и запустим нашу программу. Убедимся в том, что при изменении текста запроса (площади и населения) происходит изменение записей в DBGrid1.
Данный подход имеет ряд существенных недостатков, затрудняющих его практическое использование.
По указанным выше причинам, данный подход применяется редко. Как правило, применение данного подхода оправдана при написании приложений для администраторов БД или разработчиков отчетов.
Более приемлемым является применение параметризированных запросов. В этом случае в тексте запроса содержатся параметры для дальнейшей подстановки конкретных значений на этапе выполнения. Параметры в тексте запроса начинаются с двоеточия.
Итак, создадим новое приложение, разместим на главной форме компоненты Query, DataSource, DBGrid, DBNavigator, кноку Button1. Установим их свойства аналогично предыдущему примеру.
Далее текст св-ва SQL компонента установим равным:
В последней строке мы определили параметр запроса Name_param. Теперь открыв в инспекторе объектов редактор св-ва Params компонента Query1, мы увидим элемент, соответствующий определенному параметру. Выбрав данный элемент отредактируем его свойства.
Обработчик события нажатия на кнопку будет выглядеть следующим образом:
Для увеличения скорости поиска в строках 4 и 5 осуществляется проверка подготовки запроса. Если запрос не подготовлен (что случается при старте программы) вызывается метод Prepare. При этом сервер анализирует и компилирует запрос, сохраняя его на сервере. Далее серверу необходимо отсылать лишь значения параметров запроса.
Скомилируем и запустим на выполнение созданное приложение. В строке поиска введем значение Canada и нажмем кнопку «Применить». Результатом поиска будет вывод в строки в DBGrid1, как это показано на рис. 5.
Рис. 4.
Для поиска записей частично соответствующих введенному критерию изменим текст запроса компонента Query1 следующим образом:
В одном запросе можно комбинировать несколько условий поиска с помощью операторов OR, AND итд. Конечно, мы осветили лишь небольшую часть возможностей SQL по поиску данных. Если Вы хотите получить более подробную информацию, рекомендую приобрести какую-либо книгу по SQL.
В отличие от методов поиска, предполагающих извлечение данных из хранилища данных фильтрация предполагает отбор уже извлеченных данных в клиентском приложении. Для реализации данного подхода в Delphi в компонентах доступа к данным введены два свойства Filter и Filtered. Установка свойства Filtered типа boolean в true переводит компонент в режим фильтрации. В свойстве Filter при этом можно определить значение фильтра для отбора записей. Построение фильтра во многом похоже на построение условия where в SQL запросе. Основное отличие в том, что слово where не пишется, используются другие знаки подстановки, в тексте фильтра нельзя после знаков сравнения вставлять имена полей для локальных таблиц. Если имя поля содержит пробелы, то оно заключается в квадратные скобки, например [Home directory] Свойство FilterOptions позволяет установить дополнительные параметры фильтрации, а именно
Пример фильтрации можно найти в проекте Demos\DB\Filter из примеров, поставляемых с Delphi.
Все вышесказанное позволяет реализовывать фильтрацию данных по достаточно простым условиям. В случае, если необходимо реализовать более сложный нестандартный фильтр можно написать обработчик события OnFilterRecord. Тип события определен как
Другими словами в обработчике события можно изменять переменную Accept, указывая будет ли отображаться каждая конкретная запись. Например обработчик может выглядеть так:
Не забывайте, что обработчик события дополняет, а не замещает свойство Filter, т.е если включена фильтрация (Filtered := true) и св-во фильтр содержит значение фильтра, то в обработчике события и фильтр связаны логическим отношением «AND».
Конечно, невозможно изложить в статье все приемы и хитрости поиска данных, а тем более в такой гибкой и мощной среде разработки как Delphi. Мы рассмотрели лишь общие положения. В частности, за рамками статьи остались такие темы, как поиск в трехуровневых приложениях баз данных.
Статья Поиск и фильтрация данных в Delphi раздела Базы данных Поиск может быть полезна для разработчиков на Delphi и FreePascal.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.