Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Locate не работает с параметрами!


Автор: RinOSpro 10.1.2007, 00:15
Функция Locate не работает с параметрами.
У меня БД, использую функцию Locate по полю ФИО:
Код

 DataModule1.ADOTable1.Locate('ФИО', Edit1.Text,[])

Всё работает. Например в БД есть запись с ФИО Иванов Иван Иванович если в Edit1.Text
ввожу Иванов Иван Иванович то он находит эту запись в бд а если Иванов то нет.
Без параметров эта функция Чувтвительна к регистру и ('Иванов Иван Иванович'<>'Иванов').
Но параметры не работают
 DataModule1.ADOTable1.Locate('ФИО', Edit1.Text,[loCaseInsensitive, loPartialKey])
вот так это уже не работает.

Бд ADO, Связные таблицы.



Не много информации о Locate может что я не так делаю.



Класс TDataSet является базовым классом компонента, реализующим функции доступа к БД. Многие из его методов являются абстрактными и реализуются в потомках. Он имеет два метода для поиска данных: Locate и Lookup. Данные методы ищут запись, удовлетворяющую заданным условиям. 
Код

function Locate(const KeyFields: string; const KeyValues: Variant;
  Options: TLocateOptions): Boolean; virtual;

function Lookup(const KeyFields: string; const KeyValues: Variant;
  const ResultFields: string): Variant; virtual;

Разница между ними в том, что функция Locate при поиске записи позиционирует курсор на найденную запись, а Lookup не делает этого. Если поля указанные для поиска индексированы, то поиск производится с использованием индекса, что значительно ускоряет поиск. В качестве примера рассмотрим использование данных методов на примере TTable в двухуровневом приложении. Итак, начнем с генерации нового приложения File/New Application. Мы получим проект приложения с главной формой. На данную форму поместим компонент Table с закладки Data Access, по умолчанию он будет иметь имя Table1. Теперь настроим компонент Table1 на взаимодействие с таблицей country из базы данных DBDEMOS. Для этого необходимо установить следующие свойства Table1 в следующей последовательности: 


Код

TForm1.Button1Click(Sender: TObject);
begin
  if not Table1.Locate('Name', Edit1.Text, []) then
    ShowMessage('Запись не найдена');
end;


Разберем код более подробно. Строка Table1.Locate организует поиск записи в таблице Country. Первый параметр этой функции - поля, значения которых нужно проверять. В данном случае мы ищем запись по одному полю Name. Второй параметр, что шаблон поиска и третий опции поиска. Функция возвращает значение типа boolean, указывающее на успешность поиска. 

Теперь пришло время протестировать наш пример. Запустим программу на выполнение, в строке ввода пишем Cuba и нажимаем кнопку Locate. Курсор в DBGrid1 должен переместиться на запись, имеющую в поле Name введенное значение. 

Однако наш пример имеет пока один недостаток, в строку редактирования необходимо вводить полное имя c учетом регистра, т.е если мы вместо Cuba введем, например Cu или cuba, то наш поиск будет безрезультатным. Естественно это не может нас не устраивать. Поэтому пришло время рассмотреть более подробно опции поиска. Данный параметр имеет тип TlocateOptions и позволяет задавать набор из двух параметров поиска: loCaseInsensitive и loPartialKey. Установка первого из них отменяет чувствительность к регистру в текстовых полях, а второй позволяет искать запись частично соответствующие заданному условию. С учетом вышесказанного код обработчика событий будет выглядеть следующим образом: 
Код

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Table1.Locate('Name', Edit1.Text, [loCaseInsensitive,
    loPartialKey]) then
    ShowMessage('Запись не найдена');
end;



Автор: SergeBS 10.1.2007, 15:53
RinOSpro
Делай так:
DataModule1.ADOTable1.Locate('ФИО', TRIM(Edit1.Text),[loCaseInsensitive, loPartialKey])
во-первых.
Во-вторых, за забивку в одно поле и Ф, и И, и О - вообще-то бьют канделябром. Поскольку, например, количество пробелов между Ф и И - штука неизвестная заранее, а потому
Иванов Иван
Иванов   Иван
это разные люди. Короче - сам себе злобный буратино smile

Добавлено @ 15:55 
RinOSpro
Вдогонку: учебники зачем цитировать? Для солидности? smile 

Автор: RinOSpro 12.1.2007, 22:54
SergeBS, я и говорю DataModule1.ADOTable1.Locate('ФИО', TRIM(Edit1.Text),[loCaseInsensitive, loPartialKey])
loCaseInsensitive, loPartialKey delphi пишет что не знает что такое 
а учебники цетировать что бы было понятно как та или иная функция используется! может эта информация поможет.
А вот на счет фио в одной ячейке пофиг мне хотябы вытащить фамилию, БД не оч большая

Автор: Savek 13.1.2007, 10:05
Цитата(RinOSpro @  12.1.2007,  22:54 Найти цитируемый пост)
SergeBS, я и говорю DataModule1.ADOTable1.Locate('ФИО', TRIM(Edit1.Text),[loCaseInsensitive, loPartialKey])
loCaseInsensitive, loPartialKey delphi пишет что не знает что такое 

Это как? Undeclared identifer  что-ли?

Автор: Sansa 15.1.2007, 15:08
RinOSpro, эти константы определены в DB.pas. Возможно, он у тебя не подключен в uses

Автор: bagira 5.2.2007, 19:50
Цитата(RinOSpro @  10.1.2007,  02:15 Найти цитируемый пост)
Например в БД есть запись с ФИО Иванов Иван Иванович если в Edit1.Text
ввожу Иванов Иван Иванович то он находит эту запись в бд а если Иванов то нет.
Без параметров эта функция Чувтвительна к регистру и ('Иванов Иван Иванович'<>'Иванов').
Но параметры не работают
 DataModule1.ADOTable1.Locate('ФИО', Edit1.Text,[loCaseInsensitive, loPartialKey])
вот так это уже не работает.


...Вот и у меня примерно так же... В полном виде работает (без дополнительных параметров, просто с пустыми квадратными скобками - когда ввожу тест полностью и со всеми заглавными буквами) - то все прекрасно!

А когда пишу вместе с [loCaseInsensitive, loPartialKey] - и ввожу короткий текст без заглавных букв - не находит!

С теми же параметрами - но вводя ПОЛНУЮ информацию - ищет прекрасно!!!

...Сегодня пол-дня вот так промучилась. И спросить-то не у кого... И в интернет с работы выхода нет...  smile 

Автор: SergeBS 6.2.2007, 11:14
bagira
НУ СКОЛЬКО МОЖНО? Еще раз: trim(Edit.Text)!!!! 
Иначе естественно НИЧЕГО не найдет, поскольку будет искать  "Иванов                                   ". А с trim - на ура. Проверено. Учтите так ищет с начала строки! Хотите чтобы везде - пишите не 'ванов', а '%ванов' (ADO = SQL!).

Автор: bagira 6.2.2007, 12:10
Цитата(SergeBS @  6.2.2007,  13:14 Найти цитируемый пост)
bagira, 
НУ СКОЛЬКО МОЖНО? Еще раз: trim(Edit.Text)!!!! 


Так я ТРИМ использовала тоже до этого... 
и нифига...  smile 
Я тогда подумала, что дело не в нем, и убрала...

Автор: Данкинг 6.2.2007, 12:29
Код

DataModule1.ADOTable1.Locate(ansiuppercase('ФИО'), ansiuppercase(Edit1.Text),[loPartialKey])

 smile 

Автор: SergeBS 6.2.2007, 15:45
Данкинг
Еще раз:
Код

var
    F : Variant;
...
  F := '%' + trim(Edit1.Text);
  if ADOTable1.Locate('ФИО',F,[loCaseInsensitive, loPartialKey]) then
    showmessage('FOUND')
  else
    showmessage('NOT FOUND!') ;

или
Код

  if ADOTable1.Locate('ФИО','%' + trim(Edit1.Text),[loCaseInsensitive, loPartialKey]) then
    showmessage('FOUND')
  else
    showmessage('NOT FOUND!') ;

иначе незаметный пробел при вводе в хвосте/начале или маске (maskedit) угробит поиск

Автор: bagira 8.2.2007, 16:39
Параметры [loCaseInsensitive, loPartialKey] работают у меня, к сожалению, только с латинскими буквами. Если текст русский - параметры эти просто игнорируются...  smile 

Автор: SergeBS 9.2.2007, 08:43
bagira
Цитата
Если текст русский - параметры эти просто игнорируются... 

Что-то из области фантастики... СУБД какая? И код в студию.

Автор: Sportsmen 18.5.2007, 19:24
У меня и с Trim не фига не получаеться... smile А очень нужно... % тоже не помагает.
P.S. Paradox, BDE.

Автор: RinOSpro 13.9.2007, 10:51
Если у кого такие же проблемы сначала нужно установить праметры поиска это делается так:

Код

...
uses DB
...
var
   LocOpt : TLocateOptions;
begin
   LocOpt := [loCaseInsensitive,loPartialKey];
   DataSource7.DataSet.Locate('ФИО','Иванов', LocOpt);
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)