Форум: "Базы";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
ВнизГлюк в клиентской 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c