I am just trying to execute the «select» sql statement using TADOQuery component, but when TADOQuery’s «Open» statement is executing I am getting following error:
Cannot perform this operation on a closed dataset...
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * from Table1 where Column1 = <value>');
ADOQuery1.Open;
Any guess why I am getting this error ?
mjn
36.4k28 gold badges175 silver badges378 bronze badges
asked Nov 8, 2012 at 11:21
Vishal TiwariVishal Tiwari
7392 gold badges12 silver badges28 bronze badges
5
Your code looks fine.
Check if there are any event handlers (OnBeforeOpen) or master/detail datasources attached to the query. In this case a different dataset, which is still closed, could cause the error.
answered Nov 8, 2012 at 11:44
The issue is resolved, I am using SQL Server 2008 as database.
Here «SetAppRole» was not applied on the database, after applying it, now there is no error.
user229044♦
232k40 gold badges328 silver badges336 bronze badges
answered Nov 9, 2012 at 5:43
Vishal TiwariVishal Tiwari
7392 gold badges12 silver badges28 bronze badges
SashaBucheR 0 / 0 / 0 Регистрация: 11.07.2013 Сообщений: 7 |
||||
1 |
||||
11.07.2013, 12:07. Показов 54137. Ответов 11 Метки нет (Все метки)
Добрый день! Есть такая проблемка: в наследство досталась программа, которая связывается с SQL сервером. Поставил вместо старого sql 2005 b поменял в ADOConnection путь. Теперь выдает ошибку: cannot perform this operation on a closed dataset (сама программа загружается и данные отображаются, это только когда начинаешь редактировать). В коде есть вот такая ерунда:
Пробовал и Integrated Security и через Юзера, толку нет. Самое интересное, что есть еще программа, которая работает с этой же базой, она работает полностью и редактировать данные можно. Где все-таки косяк? В Делфи или SQL (на сервере проверка подлинности стоит и Windows и SQl)?
0 |
478 / 391 / 112 Регистрация: 24.04.2012 Сообщений: 1,622 Записей в блоге: 3 |
|
11.07.2013, 12:31 |
2 |
cannot perform this operation on a closed dataset «невозможно выполнить операцию при закрытом наборе данных», т.е. при редактировании идет обращение к DataSet’у, а он в свою очерез закрыт. А этот код скорее всего с ошибкой никак не связян, т.к. это строка подключения к БД.
0 |
0 / 0 / 0 Регистрация: 11.07.2013 Сообщений: 7 |
|
11.07.2013, 13:37 [ТС] |
3 |
Я понял, что это строка подключения. Просто думал, что он подключается как-то с ограниченным доступом… Сейчас гляну DataSet. Вот только я слабоват… Нашел где DataSet, а что там проверить, прописать, чтобы он был открыт)
0 |
969 / 644 / 97 Регистрация: 01.11.2012 Сообщений: 1,447 |
|
11.07.2013, 15:01 |
4 |
SashaBucheR, попробуйте у всех Датасетов (ADOTable, ADODataSet, ADOQuery), которые были подключены к вашему ADOConnection изменить свойство Active на значение True.
0 |
0 / 0 / 0 Регистрация: 11.07.2013 Сообщений: 7 |
|
11.07.2013, 15:24 [ТС] |
5 |
Это во время CreateForm
0 |
0 / 0 / 0 Регистрация: 11.07.2013 Сообщений: 7 |
|
11.07.2013, 15:46 [ТС] |
6 |
Когда подключаюсь под sa сначала выдает такие две картинки. А потом опять «cannot perform this operation on a closed dataset»
0 |
478 / 391 / 112 Регистрация: 24.04.2012 Сообщений: 1,622 Записей в блоге: 3 |
|
12.07.2013, 05:12 |
7 |
Картинки это конечно хорошо, но еще бы и код немешало бы посмотреть, который их вызывает.
0 |
SashaBucheR 0 / 0 / 0 Регистрация: 11.07.2013 Сообщений: 7 |
||||||||
12.07.2013, 08:45 [ТС] |
8 |
|||||||
Выбивает на строке OpenADOTables
Добавлено через 36 минут
0 |
478 / 391 / 112 Регистрация: 24.04.2012 Сообщений: 1,622 Записей в блоге: 3 |
|
15.07.2013, 09:58 |
9 |
а код OpenADOTables?
0 |
SashaBucheR 0 / 0 / 0 Регистрация: 11.07.2013 Сообщений: 7 |
||||||||
16.07.2013, 11:11 [ТС] |
10 |
|||||||
В том коде, что открытие карточки, я поставил проверку состояния DataSet:
Выбивает Open, то есть, как бы Dataset активен…
0 |
Bit_Man 478 / 391 / 112 Регистрация: 24.04.2012 Сообщений: 1,622 Записей в блоге: 3 |
||||||||||||
17.07.2013, 10:03 |
11 |
|||||||||||
Выбивает на строке OpenADOTables Если так то проверяй Таблицы после открытия
выбивает при создании новой карточки
Добавлено через 3 минуты
??
0 |
0 / 0 / 0 Регистрация: 11.07.2013 Сообщений: 7 |
|
18.07.2013, 11:39 [ТС] |
12 |
Там действительно была проблема в таблицах. В ComboBox как-то DataSource сбились. Вот только теперь выдает «Exception class EDatabaseError with message: Circular datalinks are not allowed» при создании формы. Добавлено через 2 часа 22 минуты
0 |
Проблема: При нажатии на кнопку в программе появляется сообщение об ошибке.
Cannot perform this operation on a closed DataSet
Технические детали: На форме есть DataSet (если вы используете компоненты ADO, тогда это будет ADOQuery, ADOTable, Если UniDac — UniQuery, UniTable… В прочем это не играет большой роли для текущей ситуации). На кнопке был код, который обрабатывал некие данные находящиеся в DataSet’е, при обращении к нему появилась ошибка:
Cannot perform this operation on a closed DataSet
Инструментарий: Delphi XE
Решение: Проблема в том что мы пытаемся обратится к закрытому набору данных DataSet’а, для того чтобы решить данную проблемы пере обращением его нужно открыть.
DataSet.Active
Я к примеру использую процедуру для обновления DataSet’a, если DataSet открыт — обновляем, иначе открываем. Это не универсальное решение, но его можно использовать в большинстве случаев.
procedure RefreshDataSet(DataSet: TDataSet);
begin
if DataSet.Active then
DataSet.Refresh
else
DataSet.Open;
end;
Пример использования:
RefreshDataSet(ADOQuery1);
RefreshDataSet(UniQuery1);
|
|
|
Cannot perform this operation on a closed dataset!
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Добрый день! Пишу небольшую базу данных на делфи! вроде все делаю правильно , но постоянно выходит ошибка Cannot perform this operation on a closed dataset! Работаю с компонентом kmemtable (позволяет создавать таблицу в памяти, выгружать и загружать). Вот сам код
if od.Execute then begin sfCSV.CSVQuote:='»‘; sfCSV.CSVRecordDelimiter:=’,’; showmessage(‘1’); bdcomp1.Active:=true; bdcomp1.Open; if bdcomp1.Active then showmessage(‘îòêðûòà’); bdcomp1.LoadFromFileViaFormat(‘c:1.csv’,sfCSV); showmessage(‘îòêðûò111à’); dsbdcomp.DataSet:=bdcomp1; bdcomp1.Active:=true; end; Не смотрите что код кривой, просто я уже проверки делаю на активность базы. А ошибка выходит на строчке bdcomp1.LoadFromFileViaFormat(‘c:1.csv’,sfCSV); Сообщение отредактировано: Bas — 03.04.09, 05:39 |
Ahil |
|
Full Member Рейтинг (т): 9 |
Прежде чем стото делать с данными их надо открыть. (open or active=true). Компонент мне неизвестен. Что делает загрузка из файла? |
ximik666 |
|
так в том то и дело, что таблица открыта! Загрузка делает загрузку из специального файла! и добавление строчки проходит нормально! Сообщение отредактировано: ximik666 — 03.04.09, 05:53 |
Frees |
|
под дебагом зайди в процедуру LoadFromFileViaFormat и посмотри на чем он ломается |
ximik666 |
|
если несекрет как под дебагерром посмотреть? |
Frees |
|
поставь курсор на эту строку и нажми F5 |
ximik666 |
|
че то пока не могу разобраться! но ведь по идее таблица у меня открыта, почему может быть такая ошибка? Сообщение отредактировано: ximik666 — 03.04.09, 06:02 |
Ahil |
|
Full Member Рейтинг (т): 9 |
Ели bdcomp1 это набор данных то вам достаточно сделать опен. Потом посмотрите есть ли у этого компонента свойство reqwestlife (както так) и сделайте его труе.
if od.Execute then begin sfCSV.CSVQuote:='»‘; sfCSV.CSVRecordDelimiter:=’,’; showmessage(‘1’); bdcomp1.Open; bdcomp1.reqwestlife:=true; //if bdcomp1.Active then showmessage(‘îòêðûòà’); bdcomp1.LoadFromFileViaFormat(‘c:1.csv’,sfCSV); showmessage(‘îòêðûò111à’); //dsbdcomp.DataSet:=bdcomp1; //bdcomp1.Active:=true; end; Добавлено 03.04.09, 06:12 |
ximik666 |
|
такого сойства у него нет! смое главное что добавление с помощью дбнавигатора проходит нормально |
Ahil |
|
Full Member Рейтинг (т): 9 |
Значит проблем в загрузке из файла. |
ximik666 |
|
укороче даже на чистой программе котороя ниже тоже выдает ошибку!
procedure TForm1.FormCreate(Sender: TObject); begin with mem do begin Active := False; // òàáëèöà äîëæíà áûòü çàêðûòà // òåïåðü îïðåäåëÿåì ïîëÿ with FieldDefs do begin Clear; Add(‘fio’, ftString, 60, True); end; CreateTable; end; end; procedure TForm1.sBitBtn1Click(Sender: TObject); begin sfCSV.CSVQuote:='»‘; sfCSV.CSVRecordDelimiter:=’,’; mem.Open; mem.LoadFromFileViaFormat(‘c:1.csv’,sfCSV); mem.Active:=true; end; end. Сообщение отредактировано: Bas — 03.04.09, 06:55 |
Демо |
|
Что же всё-таки такое LoadFromFileViaFormat? |
ximik666 |
|
это процедура компонента kmemtable, которая позволяет загрузить файл определеннго формата! ну короче в этом файле хранится вся конфигурация и данные о виртуальной базе |
ximik666 |
|
Все всем спасибо вопрос решен! Теперь вопрос не по теме где можно посмотреть дизайны программ? ну для сравнения и чтобы для себя что нибудь взять! |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Базы данных
- Следующая тема
[ Script execution time: 0,0380 ] [ 16 queries used ] [ Generated: 24.06.23, 08:57 GMT ]
If you run your application Delphi will restore the open
or closed
state that the dataset had in the Delphi form designer.
If there is an error Delphi can quitly drop this and close the dataset.
Also it’s possible that you accidently closed the dataset in the designer, after with it no longer auto-opens on ptogram start.
When it’s time to use the dataset you will get this error because the dataset is closed.
One option is to explicitly open the dataset in the FormCreate event and add error handling code there, this will allow you to see the error message and debug from there.
procedure TForm1.FormCreate(sender: TObject);
begin
try
MyDBFTable.Open;
except on exception e do
WriteErrorToLogFile('Cannot open MyDBFTable, error is: ' + e.message);
// or
//ShowMessage('Cannot open MyDBFTable, error is: ' + e.message);
end; {try}
end;
I always do opening of datasets explicitly in FormCreate because this allows me to log any errors. If a client app has an exception it gets emailed to me automatically.
Проблема: При нажатии на кнопку в программе появляется сообщение об ошибке.
Cannot perform this operation on a closed DataSet
Технические детали: На форме есть DataSet (если вы используете компоненты ADO, тогда это будет ADOQuery, ADOTable, Если UniDac — UniQuery, UniTable… В прочем это не играет большой роли для текущей ситуации). На кнопке был код, который обрабатывал некие данные находящиеся в DataSet’е, при обращении к нему появилась ошибка:
Cannot perform this operation on a closed DataSet
Инструментарий: Delphi XE
Решение: Проблема в том что мы пытаемся обратится к закрытому набору данных DataSet’а, для того чтобы решить данную проблемы пере обращением его нужно открыть.
DataSet.Active
Я к примеру использую процедуру для обновления DataSet’a, если DataSet открыт — обновляем, иначе открываем. Это не универсальное решение, но его можно использовать в большинстве случаев.
procedure RefreshDataSet(DataSet: TDataSet);
begin
if DataSet.Active then
DataSet.Refresh
else
DataSet.Open;
end;
Пример использования:
RefreshDataSet(ADOQuery1);
RefreshDataSet(UniQuery1);
Программная ошибка
- ds87
- Автор темы
- ds87
- Автор темы
- Репутация: 0
- Сообщения: 13
- Зарегистрирован: 25.10.2014
- С нами: 8 лет 3 месяца
- Профессия: инженер
Здравствуйте.
ПО АРМ Орион 1.0 КД, управляющее ОПС и СКУД на объекте. Отработала 3 года. Система «зависла», после перезагрузки компьютера и запуска «Оперативной задачи» вылетает ошибка «tblEvent: Cannot perform this operation on a closed dataset» и, соответственно, «ОЗ» запускается некорректно — управление невозможно. При запуске «Администратора базы данных» выскакивает путь к файлу «eventlog.db», «АБД» при этом тоже не работает. Удаление прошедших событий через «Мастер системы» не помогло. Что делать?
Спасибо.
- Mixail 51
- Активный участник
- Mixail 51
- Активный участник
- Возраст: 41
- Репутация: 102
- Сообщения: 2810
- Зарегистрирован: 21.03.2015
- С нами: 7 лет 10 месяцев
- Профессия: инженер по ПБ
- Откуда: г. Мурманск
Непрочитанное сообщение #3 Mixail 51 » 22.10.2015, 17:10
Я так понимаю что в системе еще один ПК, или я не прав?
Не ошибается только тот кто не работает.
- ds87
- Автор темы
- ds87
- Автор темы
- Репутация: 0
- Сообщения: 13
- Зарегистрирован: 25.10.2014
- С нами: 8 лет 3 месяца
- Профессия: инженер
- ds87
- Автор темы
- ds87
- Автор темы
- Репутация: 0
- Сообщения: 13
- Зарегистрирован: 25.10.2014
- С нами: 8 лет 3 месяца
- Профессия: инженер
Непрочитанное сообщение #5 ds87 » 26.10.2015, 14:56
Болид ответил: «Выполните проверку БД, через Мастер системы. По результатам проверки выполните Лечение/Модернизацию БД.»
Решение проблемы заняло 1 минуту.
-
- 1
- 1291
google
Перейти к последнему сообщению
25.02.2019, 09:17
-
- 12
- 3655
DruG
Перейти к последнему сообщению
11.04.2022, 17:54
-
- 1
- 868
Shym
Перейти к последнему сообщению
31.01.2020, 19:55
-
- 1
- 1441
MadHacker
Перейти к последнему сообщению
11.05.2018, 16:52
-
- 0
- 2064
graunf
Перейти к последнему сообщению
08.11.2018, 16:30
-
- 1
- 551
DruG
Перейти к последнему сообщению
12.05.2020, 06:36
-
- 3
- 445
DruG
Перейти к последнему сообщению
21.12.2021, 17:31
-
- 0
- 67
deadbeat321
Перейти к последнему сообщению
16.12.2022, 17:00
-
- 4
- 2024
triiks
Перейти к последнему сообщению
20.10.2018, 00:12
-
- 2
- 48
zaets75
Перейти к последнему сообщению
18.01.2023, 16:17
Вернуться в «АРМ Орион»
|
|
|
Cannot perform this operation on a closed dataset!
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Добрый день! Пишу небольшую базу данных на делфи! вроде все делаю правильно , но постоянно выходит ошибка Cannot perform this operation on a closed dataset! Работаю с компонентом kmemtable (позволяет создавать таблицу в памяти, выгружать и загружать). Вот сам код
if od.Execute then begin sfCSV.CSVQuote:=’»‘; sfCSV.CSVRecordDelimiter:=’,’; showmessage(‘1’); bdcomp1.Active:=true; bdcomp1.Open; if bdcomp1.Active then showmessage(‘îòêðûòà’); bdcomp1.LoadFromFileViaFormat(‘c:1.csv’,sfCSV); showmessage(‘îòêðûò111à’); dsbdcomp.DataSet:=bdcomp1; bdcomp1.Active:=true; end; Не смотрите что код кривой, просто я уже проверки делаю на активность базы. А ошибка выходит на строчке bdcomp1.LoadFromFileViaFormat(‘c:1.csv’,sfCSV); Сообщение отредактировано: Bas — 03.04.09, 05:39 |
Ahil |
|
Full Member Рейтинг (т): 9 |
Прежде чем стото делать с данными их надо открыть. (open or active=true). Компонент мне неизвестен. Что делает загрузка из файла? |
ximik666 |
|
так в том то и дело, что таблица открыта! Загрузка делает загрузку из специального файла! и добавление строчки проходит нормально! Сообщение отредактировано: ximik666 — 03.04.09, 05:53 |
Frees |
|
под дебагом зайди в процедуру LoadFromFileViaFormat и посмотри на чем он ломается |
ximik666 |
|
если несекрет как под дебагерром посмотреть? |
Frees |
|
поставь курсор на эту строку и нажми F5 |
ximik666 |
|
че то пока не могу разобраться! но ведь по идее таблица у меня открыта, почему может быть такая ошибка? Сообщение отредактировано: ximik666 — 03.04.09, 06:02 |
Ahil |
|
Full Member Рейтинг (т): 9 |
Ели bdcomp1 это набор данных то вам достаточно сделать опен. Потом посмотрите есть ли у этого компонента свойство reqwestlife (както так) и сделайте его труе.
if od.Execute then begin sfCSV.CSVQuote:=’»‘; sfCSV.CSVRecordDelimiter:=’,’; showmessage(‘1’); bdcomp1.Open; bdcomp1.reqwestlife:=true; //if bdcomp1.Active then showmessage(‘îòêðûòà’); bdcomp1.LoadFromFileViaFormat(‘c:1.csv’,sfCSV); showmessage(‘îòêðûò111à’); //dsbdcomp.DataSet:=bdcomp1; //bdcomp1.Active:=true; end; Добавлено 03.04.09, 06:12 |
ximik666 |
|
такого сойства у него нет! смое главное что добавление с помощью дбнавигатора проходит нормально |
Ahil |
|
Full Member Рейтинг (т): 9 |
Значит проблем в загрузке из файла. |
ximik666 |
|
укороче даже на чистой программе котороя ниже тоже выдает ошибку!
procedure TForm1.FormCreate(Sender: TObject); begin with mem do begin Active := False; // òàáëèöà äîëæíà áûòü çàêðûòà // òåïåðü îïðåäåëÿåì ïîëÿ with FieldDefs do begin Clear; Add(‘fio’, ftString, 60, True); end; CreateTable; end; end; procedure TForm1.sBitBtn1Click(Sender: TObject); begin sfCSV.CSVQuote:=’»‘; sfCSV.CSVRecordDelimiter:=’,’; mem.Open; mem.LoadFromFileViaFormat(‘c:1.csv’,sfCSV); mem.Active:=true; end; end. Сообщение отредактировано: Bas — 03.04.09, 06:55 |
Демо |
|
Что же всё-таки такое LoadFromFileViaFormat? |
ximik666 |
|
это процедура компонента kmemtable, которая позволяет загрузить файл определеннго формата! ну короче в этом файле хранится вся конфигурация и данные о виртуальной базе |
ximik666 |
|
Все всем спасибо вопрос решен! Теперь вопрос не по теме где можно посмотреть дизайны программ? ну для сравнения и чтобы для себя что нибудь взять! |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Delphi: Базы данных
- Следующая тема
[ Script execution time: 0,0977 ] [ 16 queries used ] [ Generated: 30.01.23, 01:18 GMT ]
← →
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 минут тестирования один раз такой же глюк произошёл. Может случайно Ещё я доследил: если после аппенд написать едит, то всё нормально.