Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как освободить таблицу??

9.2K
20 апреля 2005 года
z-dan-z
17 / / 13.04.2005
Помогите, пожалуйста, при первом вызове процедура выполняется при втором в Table2->EmptyTable();
возникает ошибка "таблица rzk05 занята"
не могу понять отчего вроде все таблицы и запросы позакрывал
Код:
void __fastcall TForm1::cZatrPerClick(TObject *Sender)
{
 AnsiString sSql;
 Table1->TableName="prv02_t";
 Table1->Filtered=false;
 Query1->Close();
 sSql="SELECT PRV02_t.GOD, PRV02_t.MES, PRV02_t.DEB, PRV02_t.TSUD, PRV02_t.SUBD, PRV02_t.TNED, PRV02_t.OBED, PRV02_t.PDRD, PRV02_t.CHK, Sum(PRV02_t.'SUM') AS szd FROM PRV02_t GROUP BY PRV02_t.GOD, PRV02_t.MES, PRV02_t.DEB, PRV02_t.TSUD, PRV02_t.SUBD, PRV02_t.TNED, PRV02_t.OBED, PRV02_t.PDRD, PRV02_t.CHK having Sum(PRV02_t.'SUM')<>0";
 Query1->SQL->Clear();
 Query1->SQL->Add(sSql);
 Query1->ExecSQL();

 Table2->TableName="rzk05";
 Table2->EmptyTable();
 BMRzk05->Source = Query1;
 BMRzk05->Destination = Table2;
 BMRzk05->Mode = batAppend;
 BMRzk05->Execute();
  Table1->Close();
  Table2->Close();
  Query1->Close();
}


294
23 апреля 2005 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by z-dan-z
Помогите, пожалуйста, при первом вызове процедура выполняется при втором в Table2->EmptyTable();
возникает ошибка "таблица rzk05 занята"
не могу понять отчего вроде все таблицы и запросы позакрывал
Код:
void __fastcall TForm1::cZatrPerClick(TObject *Sender)
{
 AnsiString sSql;
 Table1->TableName="prv02_t";
 Table1->Filtered=false;
 Query1->Close();
 sSql="SELECT PRV02_t.GOD, PRV02_t.MES, PRV02_t.DEB, PRV02_t.TSUD, PRV02_t.SUBD, PRV02_t.TNED, PRV02_t.OBED, PRV02_t.PDRD, PRV02_t.CHK, Sum(PRV02_t.'SUM') AS szd FROM PRV02_t GROUP BY PRV02_t.GOD, PRV02_t.MES, PRV02_t.DEB, PRV02_t.TSUD, PRV02_t.SUBD, PRV02_t.TNED, PRV02_t.OBED, PRV02_t.PDRD, PRV02_t.CHK having Sum(PRV02_t.'SUM')<>0";
 Query1->SQL->Clear();
 Query1->SQL->Add(sSql);
 Query1->ExecSQL();

 Table2->TableName="rzk05";
 Table2->EmptyTable();
 BMRzk05->Source = Query1;
 BMRzk05->Destination = Table2;
 BMRzk05->Mode = batAppend;
 BMRzk05->Execute();
  Table1->Close();
  Table2->Close();
  Query1->Close();
}


У виндов (в семействе NT/2k/XP/2k3; в виндах 9x такого глюка не замечено) случается такой глюк: файлы освобождаются не сразу, а через некоторое время, от 1 до 5 минут, как побороть, я не знаю.

Да, заглянул в хелп, и вот что обнаружил:

 
Код:
Table1->Active = false;
Table1->DatabaseName = "BCDEMOS";
Table1->TableName = "CustInfo";
Table1->TableType = ttParadox;
Table1->EmptyTable();

Очистка таблицы выполняется при Table1->Active = false;. Может, в этом всё дело? ;)
9.2K
25 апреля 2005 года
z-dan-z
17 / / 13.04.2005
Цитата:
Originally posted by Plisteron
У виндов (в семействе NT/2k/XP/2k3; в виндах 9x такого глюка не замечено) случается такой глюк: файлы освобождаются не сразу, а через некоторое время, от 1 до 5 минут, как побороть, я не знаю.

Да, заглянул в хелп, и вот что обнаружил:
 
Код:
Table1->Active = false;
Table1->DatabaseName = "BCDEMOS";
Table1->TableName = "CustInfo";
Table1->TableType = ttParadox;
Table1->EmptyTable();

Очистка таблицы выполняется при Table1->Active = false;. Может, в этом всё дело? ;)


Насколько я понял хэлп
Table1->Close();
именно это и выполняет, но ситуация не меняется
Table1->Active=false;
я тоже пытался

294
25 апреля 2005 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by z-dan-z
Насколько я понял хэлп
Table1->Close();
именно это и выполняет


Да. Просто из приведённого кусочка кода непонятно, выполняется Table2->EmptyTable(); на открытой или на закрытой Table2. Или я во что-то не въехал?

9.2K
25 апреля 2005 года
z-dan-z
17 / / 13.04.2005
Цитата:
Originally posted by Plisteron
Да. Просто из приведённого кусочка кода непонятно, выполняется Table2->EmptyTable(); на открытой или на закрытой Table2. Или я во что-то не въехал?


при первом вызове процедура выполняется при втором в Table2->EmptyTable();
возникает ошибка "таблица rzk05 занята"
(вызовы подряд, т.е. ничего больше не выполняется)

10
25 апреля 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by z-dan-z
возникает ошибка "таблица rzk05 занята"
(вызовы подряд, т.е. ничего больше не выполняется)


Блин, ну из какого места логика должна расти?

Тут уже и пню ясно, что выполнять надо при закрытой таблице. В BDE очистка - низкоуровневая операция, требующая эксклюзивного доступа к таблице. А открытые курсоры не дают его получить.

9.2K
26 апреля 2005 года
z-dan-z
17 / / 13.04.2005
Цитата:
Originally posted by Freeman
Блин, ну из какого места логика должна расти?

Тут уже и пню ясно, что выполнять надо при закрытой таблице. В BDE очистка - низкоуровневая операция, требующая эксклюзивного доступа к таблице. А открытые курсоры не дают его получить.



Что нужен эксклюзивный доступ и ежу ясно и я понял!
Как его получить освободив курсоры? - вопрос который вынесен в заголовок (с точностью до формулировки) и почему в первый раз функция отрабатывает, а второй нет!

в чем разница проходов в том что однажды был получен этот самый экскл. доступ ?
и разве Table2->Close() или Table2->Active=false; не должны освобождать курсор (Table2->Close() стоит в конце функции т.е. перед вторым запуском отрабатывается)


2Plisteron винда хп

488
26 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by z-dan-z
Что нужен эксклюзивный доступ и ежу ясно и я понял!
Как его получить освободив курсоры? - вопрос который вынесен в заголовок (с точностью до формулировки) и почему в первый раз функция отрабатывает, а второй нет!

Несколько вариантов.
1. Table2 открыта. Чтоб проверить, можно написать команду перед Table2->EmptyTable(),
if(Table2->Active)ShowMessage("Active");

2. Нет привилегии. Где-то должна быть команда Table2->Exclusive = true;

3. Наименее вероятно. BMRzk05 держит таблицу. После добавления записей нужно бы написать BMRzk05->Destination = NULL;

9.2K
26 апреля 2005 года
z-dan-z
17 / / 13.04.2005
Цитата:
Originally posted by Mоngооsе
Несколько вариантов.
1. Table2 открыта. Чтоб проверить, можно написать команду перед Table2->EmptyTable(),
if(Table2->Active)ShowMessage("Active");


Это я смотрел она не активна

Цитата:

2. Нет привилегии. Где-то должна быть команда Table2->Exclusive = true;


Щас попробую, но по логике при неактивной таблице пофигу должно быть

Цитата:

3. Наименее вероятно. BMRzk05 держит таблицу. После добавления записей нужно бы написать BMRzk05->Destination = NULL;


Это тоже пытался правда не в Null, а на другую (левую) таблицу

294
26 апреля 2005 года
Plisteron
982 / / 29.08.2003
Цитата:
Originally posted by z-dan-z
2Plisteron винда хп


Как я и говорил, возможно, проявляется этот косяк. А вообще-то, код в студию, будем разбираться.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог