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

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

Почему не обновляется RecordCount?


Страницы:   1 2 3

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?


Страницы:   1 2 3

Наверх

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