Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.06.13;
Скачать: [xml.tar.bz2];

Вниз

Ошибка в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.038 c
3-1085143540
Бульбаш
2004-05-21 16:45
2004.06.13
Есть ли грид с возможностью группировки данных


6-1082635274
Atlante
2004-04-22 16:01
2004.06.13
Как узнать дату последнего изменения файла через инет


1-1085711439
R
2004-05-28 06:30
2004.06.13
Qutlook Express и Delphi


1-1086182669
Dysan
2004-06-02 17:24
2004.06.13
универсальная система отчетов


1-1086214858
Win64
2004-06-03 02:20
2004.06.13
Как скомпилить проэкт без запуска Дельфей?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский