Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.008 c
1-19646
Мария В.
2003-03-25 17:07
2003.04.07
Можно ли из Delphi создавать отчеты в OpenOffice?


14-19814
Товарищъ
2003-03-20 11:21
2003.04.07
Стих! (собственный:)


1-19595
StarCon
2003-03-28 14:49
2003.04.07
Указатели, структуры и DLL


7-19910
Dark WandeR
2003-02-11 23:37
2003.04.07
Проблема с памятью


1-19617
Tolyan
2003-03-25 11:20
2003.04.07
Алгоритм контраста.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский