![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Почему не обновляется RecordCount?
Ega23 © (2005-06-14 19:00:00)Имеем следующую ситуацию:
TTreeDataLink = class(TDataLink)
private
FTree: TCustomKdrDBTreeView;
public
constructor Create(ATree:TCustomKdrDBTreeView);
procedure DataSetChanged; override;
end;
constructor TTreeDataLink.Create(ATree: TCustomKdrDBTreeView);
begin
inherited Create;
FTree:=ATree;
VisualControl:=True;
end;
//*****************************************************************************
procedure TTreeDataLink.DataSetChanged;
begin
inherited;
showmessage(IntToStr(DataSet.RecordCount));
end;
//*****************************************************************************
Я точно знаю, что у данного DataSet'а RecordCount>0 (есть DBGrid, привязанный к этому же DataSet'у).
sniknik (2005-06-16 10:32:00) [1]Disable/EnableControls значит не проходит, а самому "отвязывать" DataSet-ы есть где... действие то аналогичное (в данном смысле, чтобы контролы не реагировали).
как попробуеш, после замени в месте "отвязки" на DisableControls, а в "привязке" на EnableControls, и будет стандарт.
Ega23 (2005-06-16 09:39:00) [2]А-а-а! DataSource от DataSet'а отвязать!
Немножко не так понял.
Щас попробую!
ANB (2005-06-16 09:28:00) [3]Как, интересно, они будут реагировать, если они к сурсу привязаны, а ты его от дейтасета отвязал ? Откуда они узнают, что что то происходит ?
Ega23 (2005-06-15 18:27:00) [4]ANB © (15.06.05 16:56) [36]
Интересное решение. Но вот в чём вопрос: будет ли это "бегание" синхронным или асинхронным? Т.е. если я "захватил" обработку этого датасета, будут ли остальные компаненты на его изменение реагировать?
-=XP=- (2005-06-15 17:01:00) [5]ANB © (15.06.05 16:56) [36]
Точно-точно, прям как в Disable/Enable Controls. :)
ANB (2005-06-15 16:56:00) [6]Хм. Есть мысля.
При перезагрузке дерева (открытие или рефреш дейтасета, например) :
1. Запоминаешь дэйтасет
2. Отвязываешь от него дэйтасурс
3. Делаешь дэйтасет.ласт, дэйтасет.First
4. Загружаешь дерево напрямую из дейтасета
5. Подключаешь дейтасет обратно в дейтасурс.
У меня была как то давно проблема, когда надо было гулять по НД, при этом все моргало, а создавать отдельный дейтасурс было влом. Вот так и спасся.
Ega23 (2005-06-15 15:01:00) [7]Так. Переписать методы не получится. Можно попробовать с DataSet.State поиграться. Но возникает вопрос - а как потом Event послать?
Ega23 (2005-06-15 14:57:00) [8]DisabledControls. если его у тебя еще нет, самое время о нем подумать. (вернее правильную обработку уже имеющегося)
А разве можно свою обработку enable/disableControls реализовать? Вообще-то я об этом не подумал... Сейчас посмотрю...
sniknik (2005-06-15 14:48:00) [9]> Проблема в том, что когда я в своём дереве сделаю Last это же событие отловит мой графический план.
DisabledControls. если его у тебя еще нет, самое время о нем подумать. (вернее правильную обработку уже имеющегося)
> И вот в этом месте они входят в клинч.
и переменную которая позволяет делать Last в дереве только 1 раз тоже нельзя завести?
Ega23 (2005-06-15 14:28:00) [10]Вот -=XP=- © [30] правильно всё написал.
Проблема в том, что когда я в своём дереве сделаю Last это же событие отловит мой графический план. Который тоже должен сделать Last (а иначе он не сможет при изменении НД все зоны отрисовать).
И вот в этом месте они входят в клинч.
Если есть другие способы, то с удовольствием их выслушаю. Ибо задача уже задолбала, шеф волком смотрит.
sniknik (2005-06-15 14:23:00) [11]ANB © (15.06.05 14:06) [29]
про что и сказ. а все записи нужны обязательно, иначе узлы/листья дерева будут неполные/разнородные в разные моменты открытия рекордсета.
(ну скажем родитель в начале рекордсета, а детки в конце, а возможно и наоборот)
-=XP=- (2005-06-15 14:14:00) [12]Не проще напрямую к дейтасету или дэйтасурсу подключаться (Имхо)?
DataLink используется для оповещения пользователя DataSource в случае изменений в НД. Пользователей данных много, DataSource - один. :)
Трехуровневое дерево:
DataSet - DataSource - DataLink - Пользователь данных
DataLink - Пользователь данных
DataSource - DataLink - Пользователь данных
DataLink - Пользователь данных
DataLink - Пользователь данных
DataSource - DataLink - Пользователь данных
DataLink - Пользователь данных
ANB (2005-06-15 14:06:00) [13]
> sniknik © (15.06.05 14:03) [28]
- а зачем ему тогда количество строк ???? Если хочет в дереве отображать весь НД, так надо по любому Last при загрузке делать, чтобы все профетчить.
sniknik (2005-06-15 14:03:00) [14]ANB © (15.06.05 13:56) [26]
проблема у него не в DataLink-е, а в том что упорно не хочет признавать реальность. ;о) (имхо)
ну а разница на прямом подключении? если количество строк все одно нужно.
sniknik (2005-06-15 14:01:00) [15]> В моём случае надо получить ВСЕ строки.
единственный способ получить "ВСЕ строки" это фетч ВСЕГО рекордсета на клиента, что в общем случае достигается переходом на последнюю строку (ну не у всех есть метод FetchAll/клиентский курсор/етс.).
от этого и пляши, если хочеш универсальности. все остальное это танцы с бубном.
ANB (2005-06-15 13:56:00) [16]Это, а зачем тебе вообще TGridDataLink ? Не проще напрямую к дейтасету или дэйтасурсу подключаться (Имхо)?
Ega23 (2005-06-15 13:36:00) [17]2 ANB © (15.06.05 13:03) [23]
1. Ты не написал ответ на мой вопрос 21 (-1 или правильное число).
Попробовал на TRXQuery и на TADOQuery.
В первом случае RecordCount возвращается корректно, если в выборке нет BLOB'ов. Во втором случае RecordCount корректен всегда. Сейчас попробую с TQuery.
2 sniknik © (15.06.05 13:13) [24]
не обращал внимания на поведение скрола? когда рекордсет с неопределяемым количеством там всего 3 положения, иначе более деталезированное. (т.е. они это учитывают)
правильно. DBGrid устанавлевает BufferCount в TGridDataLink'е равным количеству видимых строк грида. В моём случае надо получить ВСЕ строки.
sniknik (2005-06-15 13:13:00) [18]Ega23 © (15.06.05 12:22) [20]
раздели операции, присвоение датасета должно делатся единожды, не при каждом тычке мыши.
> Но вот в DBGrid'е же как-то сделано, что с любым DataSet'ом работать можно?
не обращал внимания на поведение скрола? когда рекордсет с неопределяемым количеством там всего 3 положения, иначе более деталезированное. (т.е. они это учитывают)
ANB (2005-06-15 13:03:00) [19]
> Ega23 © (15.06.05 12:36) [22]
1. Ты не написал ответ на мой вопрос 21 (-1 или правильное число).
2. Грид сам не всегда правильно узнает RecordCount (видел лично, например, в связке с одаком, если не все записи профетчены)
4. Чтобы сделать, как в гриде - надо лезть в его исходники. Это после обеда.
Ega23 (2005-06-15 12:36:00) [20]И опубликуй тип дейтасета. Возможно, товй тип не юзает RecordCount, как уже писал
Это вполне возможно. Но вот в DBGrid'е же как-то сделано, что с любым DataSet'ом работать можно? Не вопрос, я сейчас заточу компонент исключительно под ADOQuery, который вроде всегда RecordCount возвращает. Но как быть со всеми остальными? С каким-нибудь TdxQuery?