![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
inceremental fetch tclientdataset баг? [D6]
_jk_ © (2004-08-24 14:55:00)Привет всем.
натолкнулся на ситуацию не знаю как самому справится :((
есть база оракл9и (важно) в ней есть таблица atab с полем afield
в таблице много записей с повторяющмися(важно) значениями в поле afield
в приложении открывается запрос
"select * from atab order by afield"
через TDataSetProvider в клиентдатасете используется PacketRecords=50 (фетчим по 50 записей, FetchOnDemand=true)
клиентдатасет подвязан в гриду.
так вот при открытии запроса фетчится 50 записей, скроллим грид кнопкой вниз, датасет фетчит еще несколько раз по 50 записей и потом вдруг перестает фетчить, якобы уже конец таблицы :((, на самом деле он зафетчил только 150 записей :(, далее если я нажму в гриде "вверх", а потом опять "вниз" - он продолжает фетчить оставшиеся записи... версия midas.dll 7.1.1692.668 (самая последняя вроде)
вот собствено проблема.
далее мой анализ ситуации:
при открытии запроса - открывается набор даныых где есть ряд записей (95 записей) с одинаковвым значением поля afield="ммм", когда клиентдатасет фетчит их - то он фетчит сначала часть из них,
при скроллинге вниз, он фетчит оставшуюся часть этих записей и вызывается метод TCustomClientDataSet.AddDataPacket
который вызывает уже midas.dll -
FDSBase.AppendData(VarToDataPacket(Data), HitEOF)
так вот "прикол" в том что этот метод добавляет данные НЕ В КОНЕЦ датасета, а в середину - как раз туда где начинается ряд записей с afield="ммм", а грид такого финта не замечает и сам clientdataset возращает Eof после такого финта %-(
кстати если поставить PacketRecords=96 (на 1 больше чем кол-во записей с одинковым значением поля) то глюка нет! но беда в том что я не могу знать зараннее сколько там таких записей есть, и подсчиттывать это тоже не карсиво...
на других субд(файрберд, мсскл) такого глюка не обнаружено - все работает четко.
никто с таким глюком не сталкивался?
_jk_ (2004-09-14 10:50:00) [1]разобрался!
все дело в провайдере, точнее в его опциях -
надо вклюить флаг poRetainServerOrder и тогда клиент датасет не будет заниматься фигней.
_jk_ (2004-08-27 18:38:00) [2]а нету в момент глюка в клиентдасете локальных индексов %-(
roottim (2004-08-25 08:08:00) [3]а локальные индексы тут не причем?
_jk_ (2004-08-24 16:42:00) [4]в предидущей мессаге надо читать так:
... При зачитывании записей с маленькими буквами они вставляются НЕ в конец (как их вернул оракл) а вперед...
_jk_ (2004-08-24 16:33:00) [5]нашел закономерность...
дело в том что значение идут не совсем одинаковые, они отличаются регистром. т.о. при открытии запроса из dbexplore, оракл возращает след. набор данных
AAAA
AAAA
AAAA
AAAA
aaaa
aaaa
aaaa
aaaa
а при открытии в клиент датасете получается след. картина:
1. фетчатся записи в с заглавными буквами:
АААА
АААА
АААА
АААА
АААА < курсор
2. При зачитывании записей с маленькими буквами они вставляютсяне в конец (как их вернул оракл) а вперед:
аааа
аааа
аааа
аааа < вставка
аааа
АААА
АААА
АААА
АААА
АААА < курсор
и после этого клиентдатасет возращает Eof, пока его не передернешь в гриде вверх вниз...
и почему клиент датасет не так возращает данные как оракл?
ЗЫ. возможно и под другими субд есть что нить похожее - просто на своих тестах у меня были не одинаковые данные...