![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не работает 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]);
А какие-нибудь опции указывали?