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

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

Глюк в клиентской DataSet или я, что не понимаю [D5, ClientDataSet]


V-A-V ©   (2003-03-19 09:03:00) 

Народ помогите разобраться это глюк или нет?
В runtime связываю две клиентских DataSet по Master -> Detail, затем так-же в runtime разъеденяю их, переоткрываю, а они остаются связанными.
Как с этим боротся...


les   (2003-03-19 23:17:00) [1]

Усе работает! Ось так:

procedure TForm1.acOpenMasterExecute(Sender: TObject);
begin
cdsMaster_.CloneCursor(cdsDetail_, False);
cdsDetail_.MasterSource := dsMaster;
cdsDetail_.MasterFields := "type";
cdsMaster_.OnFilterRecord := cdsMasterFilterRecord;
cdsMaster_.Filtered := true;
end;

procedure TForm1.cdsMasterFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin
Accept := not (f_prevType = cdsMaster_type.Value);
if Accept then f_prevType := cdsMaster_type.Value;
end;

Все - один и тот же TClientDataSet сам себе и мастер и детайл. И никаких сканов! Нет все таки что то в етом TClientDataSet есть... V-A-V ти что молчиш?


les   (2003-03-19 17:49:00) [2]

Попробовал - клонируется вполне успешно, хотя опять проблема с агрегатами и соответственно с GetGroupState. Поетому профильтровать по GroupState не получаеться :(.

Ну ничего еще вечером посижу.


les   (2003-03-19 14:02:00) [3]

V-A-V! Обязательно попробуй клонировать TClientDataSet и работать ним же самим для создания такого вида главний-подчиненний как у тебя. Посмотри также GetGroupState.

По теме (если читаешь по-англицки):
http://bdn.borland.com/article/0,1410,29416,00.html

Если будешь пробовать мне скажи что получится/не получится. А черт сейчас сам попробую.


V-A-V   (2003-03-19 12:50:00) [4]

Благодарю всех за советы. Так я ничего и не добился вышеупомянутым способом. Всетаки это наверное глюка ClientDataSet.
Вышел из положения повесив на AfterScroll мастера SetRenge детаила, ну и соответственно вкл/выкл когда надо...


Johnmen   (2003-03-19 11:08:00) [5]

Для начала соблюди правило - изменения свойств объекта-держателя НД (в данном случае ClientDataSet) производятся при "отсутствии активности" (бывают исключения, но здесь не про них)...


dvp   (2003-03-19 11:03:00) [6]

Навскидку попрробуй EmptyDataSet


V-A-V   (2003-03-19 10:48:00) [7]

извеняюсь забыл написать Cln_D.Next в цикле...


V-A-V   (2003-03-19 10:45:00) [8]

Корче... вот пример кода который глючит
Кто поможет буду примного благодарен.

...
Допустим в Cln_D три поля (Id, Type, Name), а
в Cln_M два поля (Id, Name)
...
Procedure Fill_ClnDs();
begin
Cln_D.ProviderName:= "";
Cln_D.RemoteServer:= Nil;
Cln_D.MasterSource:= Nil;
Cln_D.MasterFields:= "";
Cln_D.IndexFieldNames:= "";
Cln_M.Close;
Cln_D.Close;
Cln_D.Open;
...
// Здесь вызываем проседуру загруски данных в Cln_D
...
cln_D.First;
while not Cln_D.Eof do
begin
Cln_D.Edit;
if not cln_M.Locate("Id", Cln_DType.AsInteger, []) then
begin
cln_M.Append;
cln_MId.AsInteger:= Cln_DType.AsInteger;
cln_MName.AsString:= "Группа " + IntToStr(Cln_DType.AsInteger);
cln_M.Post;
end;
Cln_DId.AsInteger:= Cln_DType.AsInteger;
if Cln_D.State in [dsInsert, dsEdit] then Cln_D.Post;
Cln_D.Next;
end;
Cln_D.MasterFields:= "Id";
Cln_D.IndexFieldNames:= "Id";
Cln_D.MasterSource:= dsCln_M;
end;

...

Так вот если этот код вызываеш первй раз все проходит нормально,
а второй раз глюк....


Lord Warlock   (2003-03-19 09:48:00) [9]

Тк в клиентском датасете записи хранятся локально, попробуй сделать сброс локально закачанной базы и ее повторную закачку, кажется FetchAll, FetchDetails, что-то в этом духе


V-A-V   (2003-03-19 09:40:00) [10]

Задача на мой взгляд простая:
Надо открыть clnDetail (пока еще несвязанную с мастером)? затем
закачать туда данные, поле пробегая по clnDetail, группируем несколько записей в какую-нибудь группу и заносим Id и наименование группы в clnMaster (предварительно его открыв конечно), а потом устанавливаем связку по Id.
Вот эта часть задачи работает хорошо, но только один раз.
Если мы разодвем связь закроем обе табли и проделаем тоже самое сначала возникает глюк.


Lord Warlock   (2003-03-19 09:39:00) [11]

Обнули MasterFields, те MasterFields:=""


dvp   (2003-03-19 09:36:00) [12]

>V-A-V
Ну неважно, главное полностью переинициализировать компонент,
переопредели то откуда данные поступают, не знаю что это там,
RemoteSErver, ConnectionBroker,ProviderName ...


Vovchik_A   (2003-03-19 09:28:00) [13]

Гм... Ну тогда либо код покажи, либо освети полнстью что есть


V-A-V   (2003-03-19 09:24:00) [14]

В том то и дело, что в ClientDataSet нет проперти TableName...


dvp   (2003-03-19 09:17:00) [15]

Была такая проблема с ODAC 3.6 избавлялся путем
with TOraTable do
begin
close;
TableName:="";
TableName:=Table;
Open;
end;


Наверх

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