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