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


Автор: Exai1e 5.4.2007, 09:15
Здарсти. Возникла вот такая проблема. Вот код
Код

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
 этот ключ вроде должен отвечать за чувствительность к реестру... хм... в чем проблема ? подскажите плз.
Спасибо

Автор: Akella 5.4.2007, 09:29
Убери из параметров loCaseInsensitive и попробуй искать.

Автор: Exai1e 5.4.2007, 13:13
не помогло...

Автор: DimW 5.4.2007, 13:40
Цитата

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.'

Автор: Exai1e 5.4.2007, 18:03
Хм..
Цитата

Для поиска независимого от регистра последний параметр [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


При попытке поиска выдает вот такую ошибочку...
http://img58.imageshack.us/img58/1474/tmpvn7.jpg

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

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

  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 строки то тогда получаеться вот ттакая лабуда:
http://img238.imageshack.us/img238/6203/tmpzc6.jpg

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

Автор: SergeBS 6.4.2007, 08: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;

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

Автор: Akella 6.4.2007, 08:40
SergeBS, ну это понятно, а как же с locate быть? Я тоже сталкивался с этой проблемой, давненько, правда. Так и не решил её. Реализовал с пом. SQL.

Автор: Exai1e 6.4.2007, 09:17
http://img463.imageshack.us/img463/6364/tmpcr9.jpg

Код

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;

Автор: SergeBS 6.4.2007, 09:26
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, А ежели чуть подумаешь, то и строка короче будет. Это же очевидно...

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

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

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

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

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

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

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

Автор: SergeBS 6.4.2007, 12:25
showmessage(s) - тоже никто не отменял. А у edit-а есть параметр CharCase. До кучи smile

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

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

Автор: SergeBS 6.4.2007, 16:50
Exai1e
А они есть такие, чтобы в MEDNAME былоАН? Или ан и т.п.

Автор: Exai1e 6.4.2007, 17:59
Да есть, слова у которых начало на Ан

Добавлено через 9 минут и 5 секунд
Вот есть слово например Анальгин - ввожу А, находит... Ввожу Ан - ненаходит. Попробывал внести запись БАМБУЧА и Баклофен smile)
Пробую
ввожу Б - находит оба, ввожу БА находит БАМБУЧУ... Т.е. если в слове идет загл буква а посл нее незаглавная то он ненаходит ее, а если все например загланые то от слова мона ввести 2первые или даже больше букв.
см. скрины, чтобы лучше понять что я имею ввиду smile
http://img53.imageshack.us/img53/4105/01ne7.jpg
http://img53.imageshack.us/img53/39/02is5.jpg
http://img53.imageshack.us/img53/1056/03jk4.jpg

Добавлено через 11 минут и 2 секунды
Получаеться, если запись в табл введена БОЛЬШИМИ (всмысле заглавными) буквами то все находится, а если маленькими то тогда нет

Автор: Exai1e 6.4.2007, 18:29
Вроде же как UPPER влияет на регистр, но вот это 
Код

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

непомогло... или мб я че не так делаю... ?

Автор: Exai1e 6.4.2007, 23:11
Вот че подумал. Не может ли быть это проблема с UPPER самого IB ?
Гдето толи на этом форуме толи на Source прочитал, что у InterBase проблема с UPPER :-/
У мя 7ая версия InterBase...

Автор: kobra 7.4.2007, 10:00
Цитата(Exai1e @  6.4.2007,  23:11 Найти цитируемый пост)
Не может ли быть это проблема с UPPER самого IB ?
да, савсем даже может быть.
Код
'SELECT UPPER(MEDNAME) FROM MEDICAMENTS
провер.
для латини проблем не будет, для кирилицы может быть.
Цитата(SergeBS @  6.4.2007,  12:07 Найти цитируемый пост)
или что еще, отладить кодовую страницу 


Автор: Exai1e 7.4.2007, 10:16
kobra
Цитата
или что еще, отладить кодовую страницу

Если честно... мне это ничего не говорит...  smile  smile

Добавлено через 6 минут и 15 секунд
мдя...
проверил ток что с англ буквами, там все норм работает... а с русскими нефига не пашет как надо :(

Автор: kobra 7.4.2007, 15:12
мои тебе совет, поиди в раздел/форум интербеисистов, и спроси там, как ето лечится

Автор: SergeBS 9.4.2007, 07:19
Exai1e
Цитата
Если честно... мне это ничего не говорит...  

Если честно, то разбираться с этим все равно придется. Доки читай. На одних советах далеко не уедешь.

Автор: Exai1e 11.4.2007, 13:54
нашел решение этой проблемы с LIKE , если делать вот так то все работает с русским языком


Код

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

Автор: Akella 13.4.2007, 08:46
Цитата(Exai1e @  11.4.2007,  13:54 Найти цитируемый пост)
WHERE UPPER(MEDNAME collate PXW_CYRL)

желательно ещё при создании поля указывать направление сортировки

Автор: Exai1e 13.4.2007, 23:27
Akella, Да я вроде указывал же Win1251... или ты имееш ввиду чтото другое ?

Автор: Akella 18.4.2007, 10:35
Цитата(Akella @  13.4.2007,  08:46 Найти цитируемый пост)
collate PXW_CYRL

я это имел ввиду
Код

CREATE DOMAIN STRING255 AS
VARCHAR(255) CHARACTER SET WIN1251
COLLATE PXW_CYRL

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