Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: Базы данных и репортинг > Locate не работает с параметрами! |
Автор: RinOSpro 10.1.2007, 00:15 | ||||||||
Функция Locate не работает с параметрами. У меня БД, использую функцию Locate по полю ФИО:
Всё работает. Например в БД есть запись с ФИО Иванов Иван Иванович если в Edit1.Text ввожу Иванов Иван Иванович то он находит эту запись в бд а если Иванов то нет. Без параметров эта функция Чувтвительна к регистру и ('Иванов Иван Иванович'<>'Иванов'). Но параметры не работают DataModule1.ADOTable1.Locate('ФИО', Edit1.Text,[loCaseInsensitive, loPartialKey]) вот так это уже не работает. Бд ADO, Связные таблицы. Не много информации о Locate может что я не так делаю. Класс TDataSet является базовым классом компонента, реализующим функции доступа к БД. Многие из его методов являются абстрактными и реализуются в потомках. Он имеет два метода для поиска данных: Locate и Lookup. Данные методы ищут запись, удовлетворяющую заданным условиям.
Разница между ними в том, что функция Locate при поиске записи позиционирует курсор на найденную запись, а Lookup не делает этого. Если поля указанные для поиска индексированы, то поиск производится с использованием индекса, что значительно ускоряет поиск. В качестве примера рассмотрим использование данных методов на примере TTable в двухуровневом приложении. Итак, начнем с генерации нового приложения File/New Application. Мы получим проект приложения с главной формой. На данную форму поместим компонент Table с закладки Data Access, по умолчанию он будет иметь имя Table1. Теперь настроим компонент Table1 на взаимодействие с таблицей country из базы данных DBDEMOS. Для этого необходимо установить следующие свойства Table1 в следующей последовательности:
Разберем код более подробно. Строка Table1.Locate организует поиск записи в таблице Country. Первый параметр этой функции - поля, значения которых нужно проверять. В данном случае мы ищем запись по одному полю Name. Второй параметр, что шаблон поиска и третий опции поиска. Функция возвращает значение типа boolean, указывающее на успешность поиска. Теперь пришло время протестировать наш пример. Запустим программу на выполнение, в строке ввода пишем Cuba и нажимаем кнопку Locate. Курсор в DBGrid1 должен переместиться на запись, имеющую в поле Name введенное значение. Однако наш пример имеет пока один недостаток, в строку редактирования необходимо вводить полное имя c учетом регистра, т.е если мы вместо Cuba введем, например Cu или cuba, то наш поиск будет безрезультатным. Естественно это не может нас не устраивать. Поэтому пришло время рассмотреть более подробно опции поиска. Данный параметр имеет тип TlocateOptions и позволяет задавать набор из двух параметров поиска: loCaseInsensitive и loPartialKey. Установка первого из них отменяет чувствительность к регистру в текстовых полях, а второй позволяет искать запись частично соответствующие заданному условию. С учетом вышесказанного код обработчика событий будет выглядеть следующим образом:
|
Автор: SergeBS 10.1.2007, 15:53 |
RinOSpro, Делай так: DataModule1.ADOTable1.Locate('ФИО', TRIM(Edit1.Text),[loCaseInsensitive, loPartialKey]) во-первых. Во-вторых, за забивку в одно поле и Ф, и И, и О - вообще-то бьют канделябром. Поскольку, например, количество пробелов между Ф и И - штука неизвестная заранее, а потому Иванов Иван Иванов Иван это разные люди. Короче - сам себе злобный буратино ![]() Добавлено @ 15:55 RinOSpro, Вдогонку: учебники зачем цитировать? Для солидности? ![]() |
Автор: RinOSpro 12.1.2007, 22:54 |
SergeBS, я и говорю DataModule1.ADOTable1.Locate('ФИО', TRIM(Edit1.Text),[loCaseInsensitive, loPartialKey]) loCaseInsensitive, loPartialKey delphi пишет что не знает что такое а учебники цетировать что бы было понятно как та или иная функция используется! может эта информация поможет. А вот на счет фио в одной ячейке пофиг мне хотябы вытащить фамилию, БД не оч большая |
Автор: Sansa 15.1.2007, 15:08 |
RinOSpro, эти константы определены в DB.pas. Возможно, он у тебя не подключен в uses |
Автор: bagira 5.2.2007, 19:50 | ||
...Вот и у меня примерно так же... В полном виде работает (без дополнительных параметров, просто с пустыми квадратными скобками - когда ввожу тест полностью и со всеми заглавными буквами) - то все прекрасно! А когда пишу вместе с [loCaseInsensitive, loPartialKey] - и ввожу короткий текст без заглавных букв - не находит! С теми же параметрами - но вводя ПОЛНУЮ информацию - ищет прекрасно!!! ...Сегодня пол-дня вот так промучилась. И спросить-то не у кого... И в интернет с работы выхода нет... ![]() |
Автор: SergeBS 6.2.2007, 11:14 |
bagira, НУ СКОЛЬКО МОЖНО? Еще раз: trim(Edit.Text)!!!! Иначе естественно НИЧЕГО не найдет, поскольку будет искать "Иванов ". А с trim - на ура. Проверено. Учтите так ищет с начала строки! Хотите чтобы везде - пишите не 'ванов', а '%ванов' (ADO = SQL!). |
Автор: bagira 6.2.2007, 12:10 |
Так я ТРИМ использовала тоже до этого... и нифига... ![]() Я тогда подумала, что дело не в нем, и убрала... |
Автор: Данкинг 6.2.2007, 12:29 | ||
![]() |
Автор: SergeBS 6.2.2007, 15:45 | ||||
Данкинг, Еще раз:
или
иначе незаметный пробел при вводе в хвосте/начале или маске (maskedit) угробит поиск |
Автор: bagira 8.2.2007, 16:39 |
Параметры [loCaseInsensitive, loPartialKey] работают у меня, к сожалению, только с латинскими буквами. Если текст русский - параметры эти просто игнорируются... ![]() |
Автор: SergeBS 9.2.2007, 08:43 | ||
bagira,
Что-то из области фантастики... СУБД какая? И код в студию. |
Автор: Sportsmen 18.5.2007, 19:24 |
У меня и с Trim не фига не получаеться... ![]() P.S. Paradox, BDE. |
Автор: RinOSpro 13.9.2007, 10:51 | ||
Если у кого такие же проблемы сначала нужно установить праметры поиска это делается так:
|