Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск, параметры Locate 
V
    Опции темы
Exai1e
Дата 5.4.2007, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здарсти. Возникла вот такая проблема. Вот код
Код

procedure TMainForm.Button1Click(Sender: TObject);
begin
  If IBTable1.Locate('MEDNAME',Trim(Edit1.Text), [loPartialKey, loCaseInsensitive]) then
    begin
      Edit2.Text := IBTable1.FieldByname('MEDNAME'  ).AsString;
      Edit3.Text := IBTable1.FieldByname('MEDTYPE'  ).AsString;
      Edit4.Text := IBTable1.FieldByname('MEDCOUNT' ).AsString;
      Edit5.Text := IBTable1.FieldByname('MEDPRICE' ).AsString;
      Edit6.Text := IBTable1.FieldByname('MEDABOUT' ).AsString;
    end
  else
   ShowMessage('По вашему запросу ничего не найдено');
end;


Все норм, находит. Но поиск чувствителен к реестру... Хотя 
Код
loCaseInsensitive
 этот ключ вроде должен отвечать за чувствительность к реестру... хм... в чем проблема ? подскажите плз.
Спасибо


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Akella
Дата 5.4.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



Убери из параметров loCaseInsensitive и попробуй искать.
PM MAIL   Вверх
Exai1e
Дата 5.4.2007, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не помогло...


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
DimW
Дата 5.4.2007, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

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



Цитата

TLocateOptions defines the values for the Options parameter of the Locate method of a dataset.

Unit

DB

Delphi syntax:

type
  TLocateOption = (loCaseInsensitive, loPartialKey);
  TLocateOptions = set of TLocateOption;

C++ syntax:

enum TLocateOption { loCaseInsensitive, loPartialKey };

typedef Set<TLocateOption, loCaseInsensitive, loPartialKey>  TLocateOptions;

Description

TLocateOptions is the type of the Options parameter to a dataset’s Locate method. The following table lists the possible values:

Value    Description

loCaseInsensitive    Key fields and key values are matched without regard to case.

loPartialKey    Key values can include only part of the matching key field value; for example, 'HAM' would match both 'HAMM' and 'HAMMER.'


Это сообщение отредактировал(а) DimW - 5.4.2007, 13:42
PM MAIL ICQ   Вверх
Exai1e
Дата 5.4.2007, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хм..
Цитата

Для поиска независимого от регистра последний параметр [loCaseInsensitive, loPartialKey].


Так ведь у мя он прописан, а все равно не пашет... О_о

//-------------------------------------------------------------------------------------

Мона еще узнать, почему не работает поиск через LIKE ?
Код:

Код

procedure TMainForm.SpeedButton1Click(Sender: TObject);
begin
  IBQuery6.Params.ParamByName('Par').Value := Edit1.Text;
  IBQuery6.ExecSQL;

  IBQuery1.Close;
  IBQuery1.Open;
end;


sql запрос в IBQuery6 :
Код

SELECT * FROM MEDICAMENTS WHERE MEDNAME LIKE :Par


При попытке поиска выдает вот такую ошибочку...
вот

Полазил по форуму, вроде бы все правильно...

:-| Попробывал вот так
Код

  IBQuery6.Active := false;
  IBQuery6.SQL.Text := 'SELECT * FROM MEDICAMENTS WHERE MEDNAME LIKE %:Par%';
  IBQuery6.Params.ParseSQL(IBQuery6.SQL.Text, true);
  IBQuery6.Params.ParamByName('Par').Value := Edit1.Text;
  IBQuery6.Active := true;
  IBQuery6.ExecSQL;


Так при попытке поиска, вылетаеш ошибка что в ibquery6 нет парамерта Par, хотя он там есть :-/

хм.. получаеться надо использовать этот запрос с LIKE в главной кверти ?

Код

  IBQuery1.Active := false;
  //IBQuery6.SQL.Text := 'SELECT * FROM MEDICAMENTS WHERE MEDNAME LIKE %:Par%';
  IBQuery1.SQL.Text := 'SELECT * FROM MEDICAMENTS WHERE MEDNAME LIKE' + Edit1.text;
  IBQuery1.Params.ParseSQL(IBQuery1.SQL.Text, true);
  //IBQuery6.Params.ParamByName('Par').Value := Edit1.Text;
  IBQuery1.Active := true;
  IBQuery1.ExecSQL;


Выкидывает ошибку при попытке поиска, "Dynamic SQL Error. SQL Error code - 104 Unexpected end of command"

Пробывал заменять это
Код

  IBQuery1.SQL.Text := 'SELECT * FROM MEDICAMENTS WHERE MEDNAME LIKE' + Edit1.text;

на это
Код

IBQuery1.SQL.Text := 'SELECT * FROM MEDICAMENTS WHERE MEDNAME LIKE' + ' ' + Edit1.text;


Непомогает...

Вроде порыскал по форуму, везде так делают... хм.. а у мя чет невыходит :(



-----------------------------------------------------------------------------------------------------------------------

хм, пробую делать вот так:
Код

procedure TMainForm.SpeedButton1Click(Sender: TObject);
begin
  IBQuery1.Close;
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Text := 'SELECT * FROM MEDICAMENTS';
  IBQuery1.SQL.Text := 'WHERE MEDNAME LIKE' + ' ' + AnsiUpperCase(Edit1.text);
  //IBQuery1.Params.ParseSQL(IBQuery1.SQL.Text, true);
  IBQuery1.Open;
  //IBQuery1.ExecSQL;

  {IBTransaction1.CommitRetaining;
  IBQuery1.Close;
  IBQuery1.Open;   }
end;

Так как походу запрос надо добавлять в 2 строки то тогда получаеться вот ттакая лабуда:
вот

-----------------------------------------------------------------------------------------------------------------------

Это сообщение отредактировал(а) Exai1e - 5.4.2007, 23:02


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
SergeBS
Дата 6.4.2007, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Exai1e
Цитата
Полазил по форуму, вроде бы все правильно...

Плохо лазил.
Делай так:
Код

s := 'SELECT * FROM MEDICAMENTS WHERE MEDNAME LIKE' + '% ' + trim(AnsiUpperCase(Edit1.text))+'%';
IBQuery1.SQL.Text := s;

TRIM!!!

Добавлено через 1 минуту и 29 секунд
Блин, пробел после % естественно лишний! Очепятка.

Добавлено через 6 минут и 10 секунд
А чтобы от регистра не зависело, надо:
Код

s := 'SELECT * FROM MEDICAMENTS WHERE UPPER(MEDNAME) LIKE' + '%' + trim(AnsiUpperCase(Edit1.text))+'%';
IBQuery1.SQL.Text := s;

Тормозно, но дубово.

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


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

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



SergeBS, ну это понятно, а как же с locate быть? Я тоже сталкивался с этой проблемой, давненько, правда. Так и не решил её. Реализовал с пом. SQL.
PM MAIL   Вверх
Exai1e
Дата 6.4.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ошибка

Код

procedure TMainForm.SpeedButton1Click(Sender: TObject);
var
  s : string;
begin
  IBQuery1.Close;
  IBQuery1.SQL.Clear;
  s := 'SELECT * FROM MEDICAMENTS WHERE UPPER(MEDNAME) LIKE' + '%' + trim(AnsiUpperCase(Edit1.text))+'%';
  IBQuery1.SQL.Text := s;
  IBQuery1.Open;
end;



--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
SergeBS
Дата 6.4.2007, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Akella
Цитата
ну это понятно, а как же с locate быть? 

 А никак не быть. В Борланде тоже люди работают и что-то могут криво делать. А порой ну очень криво. Например в DualListBox выставь MultiSelect в false и пронаблюдай результат нажатия на "все вправо"/"все влево". Чтобы исправить - нужно все переписать. Было бы время и желание. Да ни того, ни другого нет.
Для dbf-ников я ручками поиск делал типа
if pos(s1,Field1) > 0 then
  if pos(s2,Field2) > 0 then
 ...
Заодно и повторный поиск получался. Что часто нужно, а нету в locate. Почему он мне и неинтересен, по большому счету. Ну нету ничего идеального. :(

Добавлено через 5 минут и 25 секунд
Exai1e, Пробел после LIKE поставь. Лентяй.

Добавлено через 6 минут и 53 секунды
Exai1e, А ежели чуть подумаешь, то и строка короче будет. Это же очевидно...
PM MAIL   Вверх
Exai1e
Дата 6.4.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SergeBS, Поставил пробел. А все равно таж самая ошибка :(


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
SergeBS
Дата 6.4.2007, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Exai1e
Блин. Ну что, совсем все писать надо? НА:
Код

s := 'SELECT * FROM MEDICAMENTS WHERE UPPER(MEDNAME) LIKE ''%' + trim(AnsiUpperCase(Edit1.text))+'%''';
IBQuery1.SQL.Text := s;

PM MAIL   Вверх
Exai1e
Дата 6.4.2007, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SergeBS, Спасибо. Ошибку не выдает smile , но непоказывает выбранные данные :(. Если использовать ExecSQL то вылетает ошибка. Попробую пошаманить ченить, чтобы заработало ;)
Спасибо

Добавлено @ 11:06
Хм.. можеш подсказать плз, почему когда вводиш первые буквы слова которое хочеш найти  то все нормально, данные выбираются,  а когда слово целиком то не выводит их ?

Добавлено @ 11:07
Т.е. если ввести первую букву то норм, а если 2-3 буквы или целиком то тогда не пашет...

Это сообщение отредактировал(а) Exai1e - 6.4.2007, 11:15


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
SergeBS
Дата 6.4.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Exai1e
А посмотреть, какая строка в запросе получается (кодировка и т.п.) религия не позволяет? Ведь проще не придумать - сформировать запрос "ручками" в IBExpert или что еще, отладить кодовую страницу и впихнуть результат в Query. ExecSQL - ну это вообще... Доки читать надо: ExecSQL - для НЕ возвращающих данные запросов. 
PM MAIL   Вверх
SergeBS
Дата 6.4.2007, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



showmessage(s) - тоже никто не отменял. А у edit-а есть параметр CharCase. До кучи smile
PM MAIL   Вверх
Exai1e
Дата 6.4.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



SergeBS, ShowMessage показывает как бы то что надо
к прмиеру ввел букву А он показывает 
Цитата
SELECT * FROM MEDICAMENTS WHERE UPPER(MEDNAME) LIKE '%А%'
 , записи показались на букву А
ввел Ан, ShowMessage выдал 
Цитата

SELECT * FROM MEDICAMENTS WHERE UPPER(MEDNAME) LIKE '%АН%'
 , но данные не выбрались smile или как это правильно сказать. Хотя ведь запрос правельный показывает ShowMessage


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1319 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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