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

Вниз

Ошибка в ClientDataSet   Найти похожие ветки 

 
Andriy Tysh   (2004-05-22 10:49) [0]

Из-за чего может вылетать ошибка в ClientDataSet: "Cannot perform this operation on a closed dataset", если учесть, что после каждого едита или инсерта корректно стоит пост? Использую грид DBGridEh.


 
Алхимик ©   (2004-05-22 11:01) [1]

"Cannot perform this operation on a closed dataset"
"Не могу выполнить эту операцию на закрытом наборе данных"


 
Andriy Tysh   (2004-05-22 14:25) [2]


> Алхимик ©   (22.05.04 11:01) [1]
> "Cannot perform this operation on a closed dataset"
> "Не могу выполнить эту операцию на закрытом наборе данных"

Сенкс за транслейт!
:-)
Но у меня с этим нет проблемы, а с клиентдатасетом. Он открывается на Шов формы, а закрывается на Клоус.


 
Anatoly Podgoretsky ©   (2004-05-22 14:35) [3]

Из за чего угодно, но в момент выполнения операции набор данных закрыт, хочешь выполнять то сначала открой его.


 
Andriy Tysh   (2004-05-24 10:29) [4]


> Anatoly Podgoretsky ©   (22.05.04 14:35) [3]
> Из за чего угодно, но в момент выполнения операции набор
> данных закрыт, хочешь выполнять то сначала открой его.

Я это прекрасно понимаю. Вот и ставлю вопрос, что может кроме меня его закрыть. Может DBGridEh, или что-то ещё. Так как я точно не закрываю!


 
Sergey13 ©   (2004-05-24 10:39) [5]

2Andriy Tysh   (24.05.04 10:29) [4]
Ну повесь на ОнКлозе месадж и посмотри когда закрывается.


 
31512 ©   (2004-05-24 11:13) [6]

А в каком контексте возикает такая ошибка? Можно привести кусок кода?


 
Andriy Tysh   (2004-05-24 11:37) [7]

Только-что доследил где точно вылетает.
Есть одна функция, которая удалает записи по условию:
function DeleteByFilter(AClient: TDataSet; AFilter: String): Integer;
var ATmpClient: TClientDataSet;
begin
 if not AClient.Active then
   Result:=0
 else
 try
   ATmpClient:=TClientDataSet.Create(nil);
   try
     with ATmpClient do
     begin
3        PacketRecords:=0;
       CloneCursor(TClientDataSet(AClient), True);
       Filter:=AFilter;
       Filtered:=True;
       Result:=RecordCount;
       First;
       while not Eof do
         Delete;
     end;
   finally
     FreeAndNil(ATmpClient);
   end;
 except
   Result:=0;
 end;
end;

Ставлю её на поп-ап меню. Выполняю, соответственно удаляються записи, которые относятся к номеру заказа, напр., 37002.
Потом пробую добавить снова номер 37002:
Client.Append;//State dsBrowse не переходит почему в dsInsert, а остаётся тем же
Client.FieldByName("...").As...:=...;//Здесь и вылетает ошибка
...
Client.Post;


P.S.: Если не вызывать в процессе работы этой ф-ии, то всё ОК


 
31512 ©   (2004-05-24 11:45) [8]

ATmpClient:=TClientDataSet.Create(nil) - Вижу

ATmpClient.Open или ATmpClient.Active := True - не вижу.


 
Andriy Tysh   (2004-05-24 11:49) [9]


> 31512 ©   (24.05.04 11:45) [8]
> ATmpClient:=TClientDataSet.Create(nil) - Вижу
>
> ATmpClient.Open или ATmpClient.Active := True - не вижу.

Действительно нет. Но только-что добавил-эффекта нет. Тот же результат.


 
Vlad ©   (2004-05-24 11:54) [10]


> Andriy Tysh   (24.05.04 11:49) [9]

А чего же ты хочешь, если у тебя FreeAndNil происходит ?


 
31512 ©   (2004-05-24 12:05) [11]


> Andriy Tysh   (24.05.04 11:49) [9]

Равно как не установлен источник данных для ATmpClient.
Смотри внимательнее!


 
sniknik ©   (2004-05-24 12:10) [12]

попробуй его закрыть, перед уничтожением. (лишним не будет)

а сам метод мне чегото не нравится, сам по другому бы сделал, без дублей.


 
31512 ©   (2004-05-24 12:30) [13]

Если в AClient передаётся TClientDataSet то предлагаю написать так:

function DeleteByFilter(AClient: TDataSet; AFilter: String): Integer;
begin
with (AClient as TClientDataSet) do
begin
if not Active then Result:=0
else
try
 PacketRecords:=0;
 Filter:=AFilter;
 Filtered:=True;
 Result:=RecordCount;
 First;
 while not Eof do
   Delete; // тут пожоже надо ещё кое - что типа Next
except
  Result:=0;
end;
end;
end;

А вообще-то вместо TDataSet можно и TClientDataSet. И никаких as уже не надо.


 
Vlad ©   (2004-05-24 12:41) [14]


> 31512 ©   (24.05.04 12:30) [13]


>  while not Eof do
>    Delete; // тут пожоже надо ещё кое - что типа Next

Ничего типа Next там не надо, все итак верно


 
31512 ©   (2004-05-24 12:48) [15]


> Vlad ©   (24.05.04 12:41) [14]

Значит я ошибся.


 
sniknik ©   (2004-05-24 13:23) [16]

попробуй так, если не пройдет значит дело не в этой процедуре

function DeleteByFilter(AClient: TDataSet; AFilter: String): Integer;
var RNo: integer;
begin
 Result:= 0;
 if not AClient.Active then Exit;

 with AClient do begin
   DisableControls;
   try
     try
       RNo:= RecNo;
       Filter:= AFilter;
       Filtered:= True;
       Result:= RecordCount;
       while not Eof do Delete;
       Filtered:= False;
       if RNo <= RecordCount then RecNo:= RNo
                             else RecNo:= RecordCount;
     except
       Result:= 0;
     end;
   finally
     Filtered:= False;
     EnableControls;
   end;
 end;
end;


 
sniknik ©   (2004-05-24 13:35) [17]

заменить, чтобы на пустой не ругалось, мало ли, может последнюю удаляем

 if not isEmpty then
   if RNo <= RecordCount then RecNo:= RNo
                         else RecNo:= RecordCount;


 
Andriy Tysh   (2004-05-24 14:23) [18]

Спасибо, сейчас попробую.

P.S.: Если вместо аппенд поставить инсерт - всё алес гут.


 
Andriy Tysh   (2004-05-24 15:57) [19]

Лучше работает, чем моя ф-ия. Но всё же на протяжении 5 минут тестирования один раз такой же глюк произошёл. Может случайно Ещё я доследил: если после аппенд написать едит, то всё нормально.



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

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

Наверх




Память: 0.51 MB
Время: 0.062 c
8-1081005582
новичок_из_сыктывкара
2004-04-03 19:19
2004.06.13
изменяя положение TTrackBar...


4-1083526677
Tuman
2004-05-02 23:37
2004.06.13
Flash &amp; Desktop


14-1085370471
SammIk
2004-05-24 07:47
2004.06.13
Гребанные вирусы


14-1085337867
Delphin
2004-05-23 22:44
2004.06.13
подключение к PS/2


1-1085932583
TUser
2004-05-30 19:56
2004.06.13
Насколько правиьны эти утверждения