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

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

Ошибка при удалении записи в ClientDataSet [D7, Sybase]


Страницы:   1 2

Shura ©   (2006-03-09 11:11:00) 

Привет !
Есть следующий набор:
Delphi7 с апдейтами 1 и 1_1, СУБД Sybase.
В программе реализована связка ADOQuery->DataSetProvider->ClientDataSet.
DataSetProvider.ResolveToDataSet:=True.
На экране 2 Grid'а. Один настроен на отображение ClinetDataSet'а, а второй для контроля на ADOQuery. Набор полей в ADOQuery и ClientDataSet'е одинаковый, но в ClientDataSet'е добавлены несколько полей fkInternalCalc для сортировки и фильтрации. Вся работа ведется через ClientDataSet (удаление/добавление). При открытии ClientDataSet'а в нем находится несколько записей. При добавлении туда других записей все нормально, при удалении тоже, но если не удалять первую запись ! Как только удалили первую строку возникает следующий эффект - число записей на экране уменьшается на 1, но первая строка остается пустой. При этом очищаются только поля fkInternalCalc, а базовые вообще не меняются. Дальше опять можно удалить первую запись, но остается все тоже "проглатывание" первой записи. В паралельном Grid'е, завязаном на ADO все отрабатывается нормально, первая запись удаляется корректно.
Изменение свойства AutoCalcFields не помогает.
Спасибо.


Nikolay M.   (2006-03-09 18:27:00) [21]


> (а в 5м было, плюс тогдаже с таймаутами проблемы были, приходилось
> даже "генофонд" править)
> делай выводы сам.


Мне выводы делать не нужно, на 7 я не пишу и описываемых граблей у меня не возникает.


sniknik   (2006-03-09 17:57:00) [22]

> Так все-таки есть или нет?

>> У меня появляется, хотя патчи от этого ставил и апдейты.
а у меня не появляется...
(а в 5м было, плюс тогдаже с таймаутами проблемы были, приходилось даже "генофонд" править)
делай выводы сам.


Nikolay M.   (2006-03-09 17:45:00) [23]

Так все-таки есть или нет?


> уже в 6-й ничего подобного не было. в 7 тем более.



> Shura ©   (09.03.06 16:33) [10]
> У меня появляется, хотя патчи от этого ставил и апдейты.


sniknik   (2006-03-09 17:25:00) [24]

> Разбор на расчитываемые поля делается, а вот фильтр и сортировка по ним невозможна.
расчитываемые поля можно расчитать в View?

> Выяснилось еще вот, что глюки с пропаданием записей появляются также после того, как будет удалена последняя запись из первоначально открытого
> recordset'а.
первая и последняя? подозрительно... а нет случаем в "расчетах" завязки на RecNo?
попробуй сделай такое калькулируемое поле
procedure TForm1.ADODataSet1CalcFields(DataSet: TDataSet);
begin
 DataSet.FieldByName('xxx').AsInteger:= DataSet.RecNo;
end;
и посмотри на значения первой и последней записи. (рекордсет должен быть локальным)

> А в Д7 нет глюка АДО "EOF or BOF is true", как в Д5?
уже в 6-й ничего подобного не было. в 7 тем более.


Shura   (2006-03-09 16:33:00) [25]


> А в Д7 нет глюка АДО "EOF or BOF is true", как в Д5?

У меня появляется, хотя патчи от этого ставил и апдейты. Правда жить она не мешает. Данные все равно удаляются в итоге корректно и для пользователя никаких сообщений не вылазит.


Nikolay M.   (2006-03-09 16:02:00) [26]

А в Д7 нет глюка АДО "EOF or BOF is true", как в Д5?
Слова


> глюки с пропаданием записей появляются также после того,
>  как будет удалена последняя запись из первоначально открытого
> recordset'а.


наводят на такую мысль.


Shura   (2006-03-09 15:39:00) [27]


> Грид не девекспрессовский случайно?

Нет, я пробовал стандартный и DBGridEh. Одно и тоже.


Nikolay M.   (2006-03-09 15:28:00) [28]


> глюки с пропаданием записей появляются также после того,
>  как будет удалена последняя запись из первоначально открытого
> recordset'а. Если очистить все записи разом, то все нормально.


Грид не девекспрессовский случайно?


Shura   (2006-03-09 14:47:00) [29]

to sniknik

> делается аналогично и в ado-шном рекордсете

Разбор на расчитываемые поля делается, а вот фильтр и сортировка по ним невозможна.


>и поэтому нужно сначала получить рекордсет на клиента а потом >сдублировать данные перегнав в другой аналогичный по возможностям (в >используемом плане) рекордсет? лишние операции для уменьшения >времени? оригинально.

ADOQuery возвращает результат View которое выполняется долго - внутри огромный Select - а его результат несколько сотен записей. Поэтому перегонка их в ClientDataSet не так заметна как время выполнения View.


> а как думаеш это же самое будет делаться через индексы ADODataSet?

У меня не получилось поставить индекс на Calc-поля. Только что проделал - выдается ошибка: "Текущий проводник не поддерживает необходимый интерфейс для функции Index".

to Nikolay M.

> А что происходит в OnCalcFields? Обработчик вообще вызывается?
>  "Базовые" значения нормальные, на их основе calculate-поля
> считаются?

Обработчик вызывается, на их основе Calc-поля считаются. Более того пользователь именно их и видит на экране.
Сейчас еще раз прогнал программу. Выяснилось еще вот, что глюки с пропаданием записей появляются также после того, как будет удалена последняя запись из первоначально открытого recordset'а. Если очистить все записи разом, то все нормально.


Nikolay M.   (2006-03-09 12:47:00) [30]


> При этом очищаются только поля fkInternalCalc, а базовые
> вообще не меняются.


А что происходит в OnCalcFields? Обработчик вообще вызывается? "Базовые" значения нормальные, на их основе calculate-поля считаются?


sniknik   (2006-03-09 12:42:00) [31]

вот про то и разговор...
> который затем разбирается на расчитываемые поля
делается аналогично и в ado-шном рекордсете

> по которым нужна сортировка и фильтрация.
делается аналогично и в ado-шном рекордсете

> Причем набор данных довольно большой и сортировка с фильтрацией через SQL занимает много времени
и поэтому нужно сначала получить рекордсет на клиента а потом сдублировать данные перегнав в другой аналогичный по возможностям (в используемом плане) рекордсет? лишние операции для уменьшения времени? оригинально.

> а так через индексы ClientDataSet'а все моментально.
а как думаеш это же самое будет делаться через индексы ADODataSet?


Shura   (2006-03-09 12:23:00) [32]

to Nikolay M.
>Начнем с простого: Grid.Refresh/Invalidate не спасает?
Не спасает.
>Кстати, а зачем DataSetProvider.ResolveToDataSet:=True?
В ClientDataSet'е необходимо иметь значения автоинкрементных ключевых полей, которые завязаны на другие списки. А это позволяет моментально получать их с сервера через ADO.

to sniknik
>зачем? в смысле, тебе ClientDataSet реально необходим?
ADOQuery возвращает результат работы View, который затем разбирается на расчитываемые поля, по которым нужна сортировка и фильтрация. Причем набор данных довольно большой и сортировка с фильтрацией через SQL занимает много времени, а так через индексы ClientDataSet'а все моментально.


sniknik   (2006-03-09 11:49:00) [33]

> В программе реализована связка ADOQuery->DataSetProvider->ClientDataSet.
зачем? в смысле, тебе ClientDataSet реальнонеобходим?

это не по ошибке, просто он здесь лишний, и не вижу смысла искать глюк в "пятой ноге" у собаки... оставь четыре, как положено, и возможно все "само собой"(/при переделке на adoшный рекордсет) в норму придет.


Nikolay M.   (2006-03-09 11:45:00) [34]


>  В паралельном Grid'е, завязаном на ADO все отрабатывается
> нормально, первая запись удаляется корректно.


Начнем с простого: Grid.Refresh/Invalidate не спасает?

Кстати, а зачем DataSetProvider.ResolveToDataSet:=True?


Страницы:   1 2

Наверх

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