Гадский Locate и пр. методы поиска

aag
Дата: 25.02.2003 14:53:13
Добрый день всем!
Вопрос уже задавал, но очень уже допекает....
База VFP, доступ через ADO (OLEDB for ODBC). Делаю:
Locate('rn', '001A', []); - находит, RecNo = 1, и это правильно
Locate('rn', [b]'001a'[/b], []); - находит, RecNo = 1, и это НЕ правильно!!!

Ибо, запись эта есть, но с совершенно др. RecNo.
Пробую Seek - провайдер не поддерживает. Хотя в ADO такой метод есть.
Пробую Filter, пробую через ADO Find - тоже самое. Не делает различий между регистрами. А между тем, rn - primary key.
Хочется понять, это такая особенность Delphi/ADO/VFP или мой личный глюк?
И как тогда вообще можно найти запись по ее первичному ключу???
pkarklin
Дата: 25.02.2003 15:01:15
А зачем тебе RecNo, ведь если запись нашлась, то она становиться текущей.
m_kus
Дата: 25.02.2003 15:30:09
Особенность или глюк не важно, не должно быть такого...
Я бы плюнул и начал бы искать обходные пути, например, если длина ключа строго ограничена создать вычисляемое поле:
rns:=StrToInt(rn[1])+...StrToInt(rn[n]*256^n)

и искать по нему... Конечно, будет работать медленнее, но ведь будет!
Или можно так:

Filter:='rn=001a';
FindFirst;
while not eof and (FieldValues['rn']<>'001a') do FindNext;

Не проверял...
Я думаю "делфийское" сравнение строк (в данном случае <>) не различает регистр. Кстати, надо убедится, что сами FieldValues[] приходят в исходном регистре... :)
aag
Дата: 25.02.2003 15:57:35
> pkarklin
RecNo мне не нужен. он для примера. Дело в том, что в обоих случаях находится одна и таже (первая) запись, хотя на самом деле записи разные - у значения поля "rn" различается регистр.

> m_kus
Дельфийское сравнение регистр различает. Фильтр работает также, т.е. тоже не работает. А обходные пути - сводятся к циклу
while not ADOTable1.Eof do
begin
...
if Value = ADOTable1.FieldByName(...).AsString then ...
end
Но, думаю, это существенно медленнее чем Locate. А для меня это критично.
Вычисляемое поле - так ведь все равно искать не по индексу, не как Locate
Вот ведь напасть - и PK есть, и искать не получается. Если только "select ..." формировать? - дак тоже ведь медленнооооо будет!
m_kus
Дата: 25.02.2003 16:28:48
Да, я и хотел сказать - различает регистр... :)
Что до фильтра, так ведь он вернёт только несколько записей, по ним то уже циклом пройти не так долго, я так понимаю?
aag
Дата: 25.02.2003 17:18:53
> m_kus
Это идея... Вот ведь изврат - по PK делать фильтрацию и искать циклом!
Осталось только проверить - насколько быстро будет фильтрация по PK для 10 тыщ. записей....
Спасибо!
Артем1
Дата: 26.02.2003 14:03:28
А в последних квадратных скобках разве не указываются опции регистронезависимого поиска (и совпадению по части ключа)?