Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.07;
Скачать: CL | DM;

Вниз

Глюк в клиентской DataSet или я, что не понимаю   Найти похожие ветки 

 
V-A-V ©   (2003-03-19 09:03) [0]

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


 
dvp ©   (2003-03-19 09:17) [1]

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


 
V-A-V ©   (2003-03-19 09:24) [2]

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


 
Vovchik_A ©   (2003-03-19 09:28) [3]

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


 
dvp ©   (2003-03-19 09:36) [4]

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


 
Lord Warlock ©   (2003-03-19 09:39) [5]

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


 
V-A-V ©   (2003-03-19 09:40) [6]

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


 
Lord Warlock ©   (2003-03-19 09:48) [7]

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


 
V-A-V ©   (2003-03-19 10:45) [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;

...

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


 
V-A-V ©   (2003-03-19 10:48) [9]

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


 
dvp ©   (2003-03-19 11:03) [10]

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


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

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


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

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


 
les ©   (2003-03-19 14:02) [13]

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

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

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


 
les ©   (2003-03-19 17:49) [14]

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

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


 
les ©   (2003-03-19 23:17) [15]

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

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 ти что молчиш?



Страницы: 1 вся ветка

Текущий архив: 2003.04.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
6-19739
Sr_pr
2003-02-16 02:00
2003.04.07
Receive bytes (Winsock)


1-19636
AFrolov
2003-03-25 14:20
2003.04.07
Использование DLL из программы


14-19843
Tornado
2003-03-21 08:00
2003.04.07
Помогите с InstallShield


14-19850
partizan
2003-03-21 11:38
2003.04.07
No war in Iraq


1-19630
GrayWolf
2003-03-24 09:22
2003.04.07
Реакция на MenuItem.OnClick