![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ошибка в 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"
"Не могу выполнить эту операцию на закрытомнаборе данных"