Текущий архив: 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.49 MB
Время: 0.103 c