Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Locate не работает с параметрами! 
:(
    Опции темы
RinOSpro
Дата 10.1.2007, 00:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Функция 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



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

Добавлено @ 15:55 
RinOSpro
Вдогонку: учебники зачем цитировать? Для солидности? smile 
PM MAIL   Вверх
RinOSpro
Дата 12.1.2007, 22:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



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

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

PM MAIL   Вверх
Sansa
Дата 15.1.2007, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 173
Регистрация: 18.10.2006
Где: Королев

Репутация: 2
Всего: 6



RinOSpro, эти константы определены в DB.pas. Возможно, он у тебя не подключен в uses
--------------------
- Здравствуйте, я Ваш патологоанатом
PM MAIL ICQ   Вверх
bagira
Дата 5.2.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2858
Регистрация: 25.10.2003
Где: в тайге Уральских гор

Репутация: нет
Всего: 123



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


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

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

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

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



--------------------
Сегодня ты не бродил, не искал, не любил - можно сказать - и не жил...
Ф.Х. Дагларджа (Турция)
http://zveriolginovour.ru/
https://vmeste.yandex.ru/zveriolginovour 
PM MAIL WWW ICQ   Вверх
SergeBS
Дата 6.2.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



bagira
НУ СКОЛЬКО МОЖНО? Еще раз: trim(Edit.Text)!!!! 
Иначе естественно НИЧЕГО не найдет, поскольку будет искать  "Иванов                                   ". А с trim - на ура. Проверено. Учтите так ищет с начала строки! Хотите чтобы везде - пишите не 'ванов', а '%ванов' (ADO = SQL!).
PM MAIL   Вверх
bagira
Дата 6.2.2007, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2858
Регистрация: 25.10.2003
Где: в тайге Уральских гор

Репутация: нет
Всего: 123



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


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


--------------------
Сегодня ты не бродил, не искал, не любил - можно сказать - и не жил...
Ф.Х. Дагларджа (Турция)
http://zveriolginovour.ru/
https://vmeste.yandex.ru/zveriolginovour 
PM MAIL WWW ICQ   Вверх
Данкинг
Дата 6.2.2007, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Код

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

 smile 



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
SergeBS
Дата 6.2.2007, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



Данкинг
Еще раз:
Код

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) угробит поиск
PM MAIL   Вверх
bagira
Дата 8.2.2007, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2858
Регистрация: 25.10.2003
Где: в тайге Уральских гор

Репутация: нет
Всего: 123



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


--------------------
Сегодня ты не бродил, не искал, не любил - можно сказать - и не жил...
Ф.Х. Дагларджа (Турция)
http://zveriolginovour.ru/
https://vmeste.yandex.ru/zveriolginovour 
PM MAIL WWW ICQ   Вверх
SergeBS
Дата 9.2.2007, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1111
Регистрация: 10.6.2005
Где: Владимир

Репутация: 11
Всего: 22



bagira
Цитата
Если текст русский - параметры эти просто игнорируются... 

Что-то из области фантастики... СУБД какая? И код в студию.
PM MAIL   Вверх
Sportsmen
  Дата 18.5.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 3.11.2006
Где: Раша Родина наша- Старый Оскол

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Sportsmen - 18.5.2007, 19:27
PM MAIL ICQ   Вверх
RinOSpro
Дата 13.9.2007, 10:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











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

Код

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


  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0813 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.