Как освободить таблицу??
возникает ошибка "таблица rzk05 занята"
не могу понять отчего вроде все таблицы и запросы позакрывал
{
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();
}
Помогите, пожалуйста, при первом вызове процедура выполняется при втором в Table2->EmptyTable();
возникает ошибка "таблица rzk05 занята"
не могу понять отчего вроде все таблицы и запросы позакрывал
{
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->DatabaseName = "BCDEMOS";
Table1->TableName = "CustInfo";
Table1->TableType = ttParadox;
Table1->EmptyTable();
Очистка таблицы выполняется при Table1->Active = false;. Может, в этом всё дело? ;)
У виндов (в семействе NT/2k/XP/2k3; в виндах 9x такого глюка не замечено) случается такой глюк: файлы освобождаются не сразу, а через некоторое время, от 1 до 5 минут, как побороть, я не знаю.
Да, заглянул в хелп, и вот что обнаружил:
Table1->DatabaseName = "BCDEMOS";
Table1->TableName = "CustInfo";
Table1->TableType = ttParadox;
Table1->EmptyTable();
Очистка таблицы выполняется при Table1->Active = false;. Может, в этом всё дело? ;)
Насколько я понял хэлп
Table1->Close();
именно это и выполняет, но ситуация не меняется
Table1->Active=false;
я тоже пытался
Насколько я понял хэлп
Table1->Close();
именно это и выполняет
Да. Просто из приведённого кусочка кода непонятно, выполняется Table2->EmptyTable(); на открытой или на закрытой Table2. Или я во что-то не въехал?
Да. Просто из приведённого кусочка кода непонятно, выполняется Table2->EmptyTable(); на открытой или на закрытой Table2. Или я во что-то не въехал?
при первом вызове процедура выполняется при втором в Table2->EmptyTable();
возникает ошибка "таблица rzk05 занята"
(вызовы подряд, т.е. ничего больше не выполняется)
возникает ошибка "таблица rzk05 занята"
(вызовы подряд, т.е. ничего больше не выполняется)
Блин, ну из какого места логика должна расти?
Тут уже и пню ясно, что выполнять надо при закрытой таблице. В BDE очистка - низкоуровневая операция, требующая эксклюзивного доступа к таблице. А открытые курсоры не дают его получить.
Блин, ну из какого места логика должна расти?
Тут уже и пню ясно, что выполнять надо при закрытой таблице. В BDE очистка - низкоуровневая операция, требующая эксклюзивного доступа к таблице. А открытые курсоры не дают его получить.
Что нужен эксклюзивный доступ и ежу ясно и я понял!
Как его получить освободив курсоры? - вопрос который вынесен в заголовок (с точностью до формулировки) и почему в первый раз функция отрабатывает, а второй нет!
в чем разница проходов в том что однажды был получен этот самый экскл. доступ ?
и разве Table2->Close() или Table2->Active=false; не должны освобождать курсор (Table2->Close() стоит в конце функции т.е. перед вторым запуском отрабатывается)
2Plisteron винда хп
Что нужен эксклюзивный доступ и ежу ясно и я понял!
Как его получить освободив курсоры? - вопрос который вынесен в заголовок (с точностью до формулировки) и почему в первый раз функция отрабатывает, а второй нет!
Несколько вариантов.
1. Table2 открыта. Чтоб проверить, можно написать команду перед Table2->EmptyTable(),
if(Table2->Active)ShowMessage("Active");
2. Нет привилегии. Где-то должна быть команда Table2->Exclusive = true;
3. Наименее вероятно. BMRzk05 держит таблицу. После добавления записей нужно бы написать BMRzk05->Destination = NULL;
Несколько вариантов.
1. Table2 открыта. Чтоб проверить, можно написать команду перед Table2->EmptyTable(),
if(Table2->Active)ShowMessage("Active");
Это я смотрел она не активна
2. Нет привилегии. Где-то должна быть команда Table2->Exclusive = true;
Щас попробую, но по логике при неактивной таблице пофигу должно быть
3. Наименее вероятно. BMRzk05 держит таблицу. После добавления записей нужно бы написать BMRzk05->Destination = NULL;
Это тоже пытался правда не в Null, а на другую (левую) таблицу
2Plisteron винда хп
Как я и говорил, возможно, проявляется этот косяк. А вообще-то, код в студию, будем разбираться.