![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не понятно что удерживает таблицу [D7, ADS]
kyn66 © (2009-10-28 12:42:00)Добрый день. Для временного хранения использую таблицу на диске. Перед использованием ее очищаю
if Cps1Tbl.Active then
Cps1Tbl.Close;
Cps1Tbl.Exclusive := True;
Cps1Tbl.EmptyTable;
Cps1Tbl.Exclusive := False;
Cps1Tbl.Open;
.. Нашпиговываю данными
while not OborotQuery.EOF do
begin
Cps1Tbl.InsertRecord([OpsTblKod.Value, OborotQueryTovKod.Value,
OborotQueryCena.Value,
OborotQueryKolOst.Value, OborotQuerySumOst.Value,
OborotQueryKolPol.Value, OborotQuerySumPol.Value,
OborotQueryKolReal.Value, OborotQuerySumReal.Value,
OborotQueryOstMesKol.Value, OborotQueryOstMesSum.Value]);
OborotQuery.Next;
end;
Затем выбираю из нее данные данные по критерию
CpsQuery.SQL.Clear;
CpsQuery.SQL.Add('SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod');
CpsQuery.Open;
CpsQuery.First;
while not CpsQuery.EOF do
begin
Cps2Tbl.InsertRecord([CpsQueryRegKod.Value, CpsQueryTovKod.Value, CpsQueryTovCena.Value]);
CpsQuery.Next;
end;
За первым проходом все нормально. Стоит повторно выполнить эту опреацию - ошибка именно на этом месте Cps1Tbl.EmptyTable; http://yurec66.narod.ru/Vopros/errcps1.jpg/Такое ощущение, что таблица почему то не закрывается, чтото ее удерживает.
Amoeba (2009-10-28 21:13:00) [41]
> if Active then
> Close;
Уже говорилось, что
if Active then
это абсолютно излишне. Эта проверка и так будет сделана при выполнении Close - эта процедура устанавливает Active в False, и проверка будет сделана в сетере.
Inovet (2009-10-28 19:52:00) [42]> [53] Inovet © (28.10.09 18:56)
А чем "DELETE FROM Cps1tbl" не устраивает или у тебя DBF? Потом под временные лучше временные и применять #Cps1tbl
Inovet (2009-10-28 18:56:00) [43]Короче. Всю ветку не стал читать. ADS может оставлять файлы открытыми после закрытия Query для более быстрого открытия в следующий раз, не знаю как это с данной проблемой с очичткой таблицы соотносится. Попробую AdsCloseSQLStatement - закрывает все.
turbouser (2009-10-28 18:30:00) [44]Точно EmptyTable закрывает таблицу? А если сделать
with Cps1Tbl do
begin
if Active then
Close;
Exclusive := True;
EmptyTable;
if Active then
Close;
Exclusive := False;
Open;
end
SergeyIT (2009-10-28 17:54:00) [45]Когда-то работал с БД из дельфи, но вот TTable не использовал, все через TQuery. C Table (не ADO) какие-то заморочки были...
kyn66 (2009-10-28 17:16:00) [46]
Сергей М. © (28.10.09 17:02) [49]
> Фактическую попытку монопольного доступа к таблице осуществляет
> именно EmtyTable.
Так как раз методом Exclusive := True мы ему в этом и помогаем выполнить без ошибок. Даже если принять во внимание тот факт, что при "первом проходе" ошибки нет, а стоит нам не установить Exclusive := True, то и EmptyTable не отработает корректно. Значит получается, что и при первом и при втором проходах Exclusive устанавливается в True. А дает ли он монопольность таблице после своей "второй" отработки? Вот в чем вопрос. А может здесь искать нужно первопричину?
Сергей М. (2009-10-28 17:02:00) [47]
> с Exclusive проблем нет
А с ним по идее и не должно быть проблем.
Фактическую попытку монопольного доступа к таблице осуществляет именно EmtyTable.
Anatoly Podgoretsky (2009-10-28 16:58:00) [48]> kyn66 (28.10.2009 16:51:47) [47]
Естественно, ошибка при применение, а не при установке
kyn66 (2009-10-28 16:51:00) [49]
> Anatoly Podgoretsky © (28.10.09 16:48) [45]
Как раз с Exclusive проблем нет, ошибку выдает как и раньше на EmtyTable
kyn66 (2009-10-28 16:48:00) [50]Да, поспешил обрадоваться, ошибка осталась при самом минимальном коде
procedure TMainFrm.Button1Click(Sender: TObject);
Var
i : Integer;
begin
With DM1 do
begin
//----------------- 1 -----------------------
if Cps1Tbl.Active then
Cps1Tbl.Close;
Cps1Tbl.Exclusive := True;
Cps1Tbl.EmptyTable;
Cps1Tbl.Exclusive := False;
Cps1Tbl.Open;
//----------------- 2 -----------------------
for i := 1 to 10 do
begin
Cps1Tbl.InsertRecord([i, i + 1, i + 2, i + 3, i + 4,
i + 5, i + 6, i + 7, i + 8,
i + 9, i + 2]);
end;
//----------------- 3 -----------------------
// CpsQuery.SQL.Clear;
// CpsQuery.SQL.Add('SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod');
// CpsQuery.Open;
// CpsQuery.First;
// CpsQuery.Close;
//----------------- 4 -----------------------
CpsQuery.SQL.Clear;
CpsQuery.SQL.Add('SELECT * FROM Cps');
CpsQuery.Open;
CpsQuery.First;
CpsQuery.Close;
end;
end;
Компонент Cps1Tbl связял с таблицей Cps. В надежде, что ошибка была из за структуры первой. Значит именно сам запрос как то влияет на эту таблицу
Anatoly Podgoretsky (2009-10-28 16:48:00) [51]> kyn66 (28.10.2009 16:14:41) [41]
Тогда это не отработает Cps1Tbl.Exclusive := True;
Сергей М. (2009-10-28 16:39:00) [52]
> Так это ж как вариант проверки
Так она ж заведомоне пройдет, эта проверка ..
kyn66 (2009-10-28 16:34:00) [53]
> И при этом требуешь от Cps1Tbl монопольного доступа к таблице
> ?!
Так это ж как вариант проверки. Вы не поверите, но я кажется нашел причину. Все дело в кактокривосозданности таблицы Cps1. Выполняю аналогичные действия с другими таблицами - все проходит. Возвращаюсь опять к Cps1 - опять ошибка. А вы говорите нет мистики.... Таблицы идентичны. Просто в одной из них (а может и в обеих, оже не помню) мыла попытка создания индекса, с последующим его удалением. Может там в заголовке чего мусор какой остался?
Сергей М. (2009-10-28 16:28:00) [54]
> в менеджере ADS(Advantage Data Architect) открыл на просмотр
> таблицу Cps1
И при этом требуешь от Cps1Tbl монопольного доступа к таблице ?!
kyn66 (2009-10-28 16:14:00) [55]НУ что, по совету уважаемого Anatoly Podgoretskyя сделал тестирование минимального кода с последовательным добавлением кусков (пронумированы)
procedure TMainFrm.Button1Click(Sender: TObject);
Var
i : Integer;
begin
With DM1 do
begin
//----------------- 1 -----------------------
if Cps1Tbl.Active then
Cps1Tbl.Close;
Cps1Tbl.Exclusive := True;
Cps1Tbl.EmptyTable;
Cps1Tbl.Exclusive := False;
Cps1Tbl.Open;
//----------------- 2 -----------------------
for i := 1 to 10 do
begin
Cps1Tbl.InsertRecord([i, i + 1, i + 2, i + 3, i + 4,
i + 5, i + 6, i + 7, i + 8,
i + 9, i + 2]);
end;
//----------------- 3 -----------------------
CpsQuery.SQL.Clear;
CpsQuery.SQL.Add('SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod');
CpsQuery.Open;
CpsQuery.First;
end;
end;
Все шло нормально(последовательные циклы нажатия на кнопку запуска кода) до вставки 3-го блока. После второго запуска вылетает ранее указанная ошибка 7008. Какие будут соображения?
Для дополнительного размышления... До вставки третьего блока я запускал первые два нормально. Потом параллельно в менеджере ADS(Advantage Data Architect) открыл на просмотр таблицу Cps1. Незамедлительно при следующем запуске кода вылетает ошибка 7008.
kyn66 (2009-10-28 15:50:00) [56]
> Anatoly Podgoretsky © (28.10.09 15:41) [39]
....... м-да, логично. Нужно минимизировать код для проверки. Суть в try finally у меня в корректном закрытии промежуточной формы (PeriodFrm) и только. Т.к мне дважды пришлось бы выполнять код
PeriodFrm.Close;
PeriodFrm.Free;
в зависимости от модальности закрытия этой формы. Ну я так нашел применение.
Anatoly Podgoretsky (2009-10-28 15:41:00) [57]> kyn66 (28.10.2009 15:35:38) [38]
Меня смущает весь код, его надо полностью переписывать.
Суть в try finally, у тебя оно ничего не защищает, а точнее наоборот. Например создание формы должно быть до try и внутри должны быть защищены все ресурсы.
В третьих для отладки надо создать мини код, ничего кроме Cps1Tbl.EmptyTable; и обрамляющего его кода. Может ты не там ищешь где потерял, а там где светлее.
kyn66 (2009-10-28 15:35:00) [58]
> Anatoly Podgoretsky © (28.10.09 15:28) [36]
А в каком конкретно месте смущает и что именно?
kyn66 (2009-10-28 15:33:00) [59]Вот нашел конкретное место, где сваливает на ошибку
hHoldHandle := OpenAdvantageFiles;(из предыдущего куска кода)
Выложу уже и его , может какие мысли появятся...
{*******************************************************************************
* Module: TAdsTable.OpenAdvantageFiles
* Input:
* Output:
* Return: ADSHANDLE - Handle of open table
* Description: Opens the table and the associated indexes
*******************************************************************************}
function TAdsTable.OpenAdvantageFiles : ADSHANDLE;
...
Форум не позволяет вставить полностью код этой функции
Anatoly Podgoretsky (2009-10-28 15:28:00) [60]
> kyn66 © (28.10.09 14:40) [25]
Не будет это работать, ресурсы не защены.