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

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

Ошибка в ClientDataSet [D6, D7]


Andriy Tysh ©   (2004-05-22 10:49:00) 

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


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

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


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

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

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


sniknik   (2004-05-24 13:35:00) [3]

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

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


sniknik   (2004-05-24 13:23:00) [4]

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

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;


31512   (2004-05-24 12:48:00) [5]


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

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


Vlad   (2004-05-24 12:41:00) [6]


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


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

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


31512   (2004-05-24 12:30:00) [7]

Если в 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 уже не надо.


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

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

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


31512   (2004-05-24 12:05:00) [9]


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

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


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


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

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


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


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

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


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

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

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


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

Только-что доследил где точно вылетает.
Есть одна функция, которая удалает записи по условию:
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:13:00) [14]

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


Sergey13   (2004-05-24 10:39:00) [15]

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


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


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

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


Anatoly Podgoretsky   (2004-05-22 14:35:00) [17]

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


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


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

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


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

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


Наверх

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