Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не работает Locate! [D6, Win2k]


Snake ©   (2002-05-06 16:12:00) 

Здравствуйте! Что такое - в ClientDataSet не работает метод Locate на русском языке. Причем компилирую на другой машине - все нормально, exe работает на моей. Кто знает, в чем дело? Спрашивал в конференции по БД - никто не отвечает :(


Snake   (2002-05-09 15:27:00) [1]

Спасибо всем, ребята, правда вот все равно ничего не получается :( А не может ли это быть из-за того, что у меня установлен dxDBGrid и прочие dx-овские компоненты?


Andrey007   (2002-05-08 12:50:00) [2]

Я использовал метод TQuery.Locate. Он нормально работал с Paradox"овскими таблицами, но в случае работы с Oracle"освкими выдавал ошибку "Operation not applicable" при поиске по двум полям символьного типа, содержащими русские буквы. Проблему решил использованием компонент прямого доступа к Oracle (Direct Oracle Access). Насчёт ClientDataSet. У него та же ошибка - он же наследник TDataSet, как и TQuery, только для TQuery TDataSet является предком более высокого уровня, чем для TDataSet. TClientDataSet - прямой наследник TDataSet, а TQuery - наследник третьего уровня (TQuery - TDBDataSet - TBDEDataSet - TDataSet). А функция Locate находится в разделе public класса TDataSet, хотя там она виртуальная и всегда возвращает False. По-нормальному она прописана в классе TBDEDataSet, и, соответственно, в TClientDataSet, причём они прописаны однаковыми, в чём Вы можете убедиться:

function TClientDataSet.Locate(const KeyFields: string;
const KeyValues: Variant; Options: TLocateOptions): Boolean;
begin
DoBeforeScroll;
Result := LocateRecord(KeyFields, KeyValues, Options, True);
if Result then
begin
Resync([rmExact, rmCenter]);
DoAfterScroll;
end;
end;

function TBDEDataSet.Locate(const KeyFields: string;
const KeyValues: Variant; Options: TLocateOptions): Boolean;
begin
DoBeforeScroll;
Result := LocateRecord(KeyFields, KeyValues, Options, True);
if Result then
begin
Resync([rmExact, rmCenter]);
DoAfterScroll;
end;
end;

Если сравните функции LocateRecord обоих классов, то увидите, что они аналогично. Наверное написали один раз и размножили.


Кулюкин Олег   (2002-05-08 11:02:00) [3]

2 Andrey007 (08.05.02 10:36)
Считал ClientDataSet достаточно безглючным компонентом.
Вы знаете его подводные камни?
Расскажите?
Я как раз на нем делал эмуляцию БД (сохранение информации в файл/чтение).
Перед этим тестировал его, все было ОК.


Andrey007   (2002-05-08 10:36:00) [4]

Конечно, не должен. Однако практика показывает, что это не всегда так.


Кулюкин Олег   (2002-05-08 10:25:00) [5]

2 Andrey007 (08.05.02 10:05)
ClientDataSet не должен зависеть от версии BDE или типа СУБД.


Andrey007   (2002-05-08 10:05:00) [6]

2Snake: А Вы, небось, через BDE работаете? И что за СУБД?


Кулюкин Олег   (2002-05-07 16:32:00) [7]

В Win2k в региональных опциях выбираются языковые настройки.
У меня кириллица по умолчанию.

Правда, у меня D5


Snake   (2002-05-07 15:58:00) [8]

Да вот то-то и оно, что точно так и делаю :( Почему - сам не знаю. Может быть где-нить в языковых настройках это делается?


Кулюкин Олег   (2002-05-06 16:48:00) [9]

У меня работает
CDS1.Locate("Field1","искомый текст", [loCaseInsensitive]);

А какие-нибудь опции указывали?


Наверх

Титульная страница Поиск, карта сайта Написать письмо