Текущий архив: 2009.12.13;
Скачать: CL | DM;
ВнизНе понятно что удерживает таблицу Найти похожие ветки
← →
kyn66 © (2009-10-28 15:50) [40]
> Anatoly Podgoretsky © (28.10.09 15:41) [39]
....... м-да, логично. Нужно минимизировать код для проверки. Суть в try finally у меня в корректном закрытии промежуточной формы (PeriodFrm) и только. Т.к мне дважды пришлось бы выполнять код
PeriodFrm.Close;
PeriodFrm.Free;
в зависимости от модальности закрытия этой формы. Ну я так нашел применение.
← →
kyn66 © (2009-10-28 16:14) [41]НУ что, по совету уважаемого 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.
← →
Сергей М. © (2009-10-28 16:28) [42]
> в менеджере ADS(Advantage Data Architect) открыл на просмотр
> таблицу Cps1
И при этом требуешь от Cps1Tbl монопольного доступа к таблице ?!
← →
kyn66 © (2009-10-28 16:34) [43]
> И при этом требуешь от Cps1Tbl монопольного доступа к таблице
> ?!
Так это ж как вариант проверки. Вы не поверите, но я кажется нашел причину. Все дело в кактокривосозданности таблицы Cps1. Выполняю аналогичные действия с другими таблицами - все проходит. Возвращаюсь опять к Cps1 - опять ошибка. А вы говорите нет мистики.... Таблицы идентичны. Просто в одной из них (а может и в обеих, оже не помню) мыла попытка создания индекса, с последующим его удалением. Может там в заголовке чего мусор какой остался?
← →
Сергей М. © (2009-10-28 16:39) [44]
> Так это ж как вариант проверки
Так она ж заведомо не пройдет, эта проверка ..
← →
Anatoly Podgoretsky © (2009-10-28 16:48) [45]> kyn66 (28.10.2009 16:14:41) [41]
Тогда это не отработает Cps1Tbl.Exclusive := True;
← →
kyn66 © (2009-10-28 16:48) [46]Да, поспешил обрадоваться, ошибка осталась при самом минимальном коде
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. В надежде, что ошибка была из за структуры первой. Значит именно сам запрос как то влияет на эту таблицу
← →
kyn66 © (2009-10-28 16:51) [47]
> Anatoly Podgoretsky © (28.10.09 16:48) [45]
Как раз с Exclusive проблем нет, ошибку выдает как и раньше на EmtyTable
← →
Anatoly Podgoretsky © (2009-10-28 16:58) [48]> kyn66 (28.10.2009 16:51:47) [47]
Естественно, ошибка при применение, а не при установке
← →
Сергей М. © (2009-10-28 17:02) [49]
> с Exclusive проблем нет
А с ним по идее и не должно быть проблем.
Фактическую попытку монопольного доступа к таблице осуществляет именно EmtyTable.
← →
kyn66 © (2009-10-28 17:16) [50]
Сергей М. © (28.10.09 17:02) [49]
> Фактическую попытку монопольного доступа к таблице осуществляет
> именно EmtyTable.
Так как раз методом Exclusive := True мы ему в этом и помогаем выполнить без ошибок. Даже если принять во внимание тот факт, что при "первом проходе" ошибки нет, а стоит нам не установить Exclusive := True, то и EmptyTable не отработает корректно. Значит получается, что и при первом и при втором проходах Exclusive устанавливается в True. А дает ли он монопольность таблице после своей "второй" отработки? Вот в чем вопрос. А может здесь искать нужно первопричину?
← →
SergeyIT © (2009-10-28 17:54) [51]Когда-то работал с БД из дельфи, но вот TTable не использовал, все через TQuery. C Table (не ADO) какие-то заморочки были...
← →
turbouser © (2009-10-28 18:30) [52]Точно EmptyTable закрывает таблицу? А если сделать
with Cps1Tbl do
begin
if Active then
Close;
Exclusive := True;
EmptyTable;
if Active then
Close;
Exclusive := False;
Open;
end
← →
Inovet © (2009-10-28 18:56) [53]Короче. Всю ветку не стал читать. ADS может оставлять файлы открытыми после закрытия Query для более быстрого открытия в следующий раз, не знаю как это с данной проблемой с очичткой таблицы соотносится. Попробую AdsCloseSQLStatement - закрывает все.
← →
Inovet © (2009-10-28 19:52) [54]> [53] Inovet © (28.10.09 18:56)
А чем "DELETE FROM Cps1tbl" не устраивает или у тебя DBF? Потом под временные лучше временные и применять #Cps1tbl
← →
Amoeba © (2009-10-28 21:13) [55]
> if Active then
> Close;
Уже говорилось, что
if Active then
это абсолютно излишне. Эта проверка и так будет сделана при выполнении Close - эта процедура устанавливает Active в False, и проверка будет сделана в сетере.
← →
turbouser © (2009-10-29 00:01) [56]
> Amoeba © (28.10.09 21:13) [55]
> это абсолютно излишне
:) не факт. компоненты разные бывают.
← →
Amoeba © (2009-10-29 01:17) [57]
> turbouser © (29.10.09 00:01) [56]
>
>
> > Amoeba © (28.10.09 21:13) [55]
>
>
> > это абсолютно излишне
>
> :) не факт. компоненты разные бывают.
Если правильный наследник TDataSet, то факт.
← →
turbouser © (2009-10-29 02:07) [58]
> Amoeba © (29.10.09 01:17) [57]
>
>
> Если
← →
kyn66 © (2009-10-29 09:24) [59]
> turbouser © (28.10.09 18:30) [52]
> Точно EmptyTable закрывает таблицу? А если сделать
Похоже на закрытие силком :). Дело в том, что EmptyTable не начнет свою работу, пока таблица активна. Выдается ошибочное сообщение. Поэтому повторное закрытие совершеннот никчему.
← →
kyn66 © (2009-10-29 09:30) [60]
> А чем "DELETE FROM Cps1tbl" не устраивает или у тебя DBF?
> Потом под временные лучше временные и применять #Cps1t
Так здесь не удалять нужно. Сперва с одной таблицы(OborotTbl) идет разделенный отбор в две другие(SborTbl и Cps1Tbl) таблицы, данные одной из которых(Cps1) в последствии подвергаются отбору по критерию CpsQuery.SQL.Add("SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod") Вот такая технология.
← →
kyn66 © (2009-10-29 10:05) [61]
> Inovet © (28.10.09 18:56) [53]
> Короче. Всю ветку не стал читать. ADS может оставлять файлы
> открытыми после закрытия Query для более быстрого открытия
> в следующий раз, не знаю как это с данной проблемой с очичткой
> таблицы соотносится. Попробую AdsCloseSQLStatement - закрывает
> все.
AdsCloseSQLStatement
Completely closes all files associated with any TAdsQuery instance.
Вроде заработало, однако нужно предварительно закрывать CpsQuery.Close . Тогда определение назначения не совсем понятно.
← →
Anatoly Podgoretsky © (2009-10-29 10:16) [62]> kyn66 (29.10.2009 09:30:00) [60]
А что по твоему делает EmptyTable в рамках твоей задачи?
← →
Anatoly Podgoretsky © (2009-10-29 10:17) [63]И также учитывая твои способности.
← →
kyn66 © (2009-10-29 10:31) [64]
Anatoly Podgoretsky © (29.10.09 10:16) [62]
> А что по твоему делает EmptyTable в рамках твоей задачи?
Пардон, действительно пропустил суть своего-же вопроса...
> Anatoly Podgoretsky © (29.10.09 10:17) [63]
> И также учитывая твои способности.
А это к чему?
← →
Anatoly Podgoretsky © (2009-10-29 11:31) [65]> kyn66 (29.10.2009 10:31:04) [64]
Это к тому, что их недостаточно для быстрого решения простейшей задачи.
← →
Inovet © (2009-10-29 12:51) [66]> Тогда определение назначения не совсем понятно.
Закрытие на уровне файлов закрытых Query. Не стоит её тыркать куда не попадя. Вот твоя задача мне не очень понятна всё к тому чтобы отсортировать и без дублей что ли: вводишь данные, "Затем выбираю из нее данные данные по критерию", затем в другой раз старые удаляешь
← →
kyn66 © (2009-10-29 14:58) [67]
> Inovet © (29.10.09 12:51) [66]
Да нет конечно, повторно ничего не нужно делать. Это я просто случайно нажал второй раз и вышла такая ситуация. Вот и решил ее устранить, т.к. юзер тоже может повторить такие же действия ни о чем не думая.
Мне твое предложение подошло очень даже. Все пошло работать как надо. Большое спасибо за совет.
← →
kyn66 © (2009-10-29 15:00) [68]
> Anatoly Podgoretsky © (29.10.09 11:31) [65]
> > kyn66 (29.10.2009 10:31:04) [64]Это к тому, что их недостаточно
> для быстрого решения простейшей задачи.
Ну не всем же носить ордена мастера.... No comments. Некоторые (Inovet) даже дельные советы дают, реально помогающие, прошу заметить...
← →
Anatoly Podgoretsky © (2009-10-29 15:01) [69]> kyn66 (29.10.2009 15:00:08) [68]
Ну вот наконец и обругал, а сначала приличным прикидывался.
← →
Inovet © (2009-10-29 15:46) [70]> Мне твое предложение подошло очень даже. Все пошло работать
> как надо. Большое спасибо за совет.
Пожалуйста, вот только за какой из
> [53] Inovet © (28.10.09 18:56)
> [54] Inovet © (28.10.09 19:52)
← →
kyn66 © (2009-10-29 15:49) [71]
> Inovet © (29.10.09 15:46) [70]
[53] - точно в цель! Спасибо еще раз.
← →
Inovet © (2009-10-29 15:53) [72]> [71] kyn66 © (29.10.09 15:49)
>
> > Inovet © (29.10.09 15:46) [70]
>
> [53] - точно в цель! Спасибо еще раз.
А на
[54] Inovet © (28.10.09 19:52)
ты не ответил. Мне вот этот метод больше нравится.
← →
kyn66 © (2009-10-29 15:55) [73]
> Anatoly Podgoretsky © (29.10.09 15:01) [69]
> > kyn66 (29.10.2009 15:00:08) [68]Ну вот наконец и обругал,
> а сначала приличным прикидывался.
Да и не думал даже обругивать. Просто форум, тем более ветка "Начинающим" и служит для того, чтобы более грамотные товарищи помогали своим начинающим, неопытным и т.д. коллегам, а не хвалились своим мастерством по отношению к слабейшим. И тем более не красиво высказывать свои оскорбления И также учитывая твои способности.... Это к тому, что их недостаточно для быстрого решения простейшей задачи. в их сторону. Модерам, сорри за офтоп.
← →
Anatoly Podgoretsky © (2009-10-29 15:59) [74]> kyn66 (29.10.2009 15:55:13) [73]
А ты не путай оценки со своими тараканами, все правильно, оценка точная.
← →
kyn66 © (2009-10-29 16:04) [75]
> Inovet © (29.10.09 15:53) [72]
>Мне вот этот метод больше нравится.
Так это как разновидность метода очистки. Просто EmptyTable как то раньше , на автомате на ум пришло. А вот насчет очистки с помощью
SQL у меня есть непонятки. Когда то задавал вопрос на форуме, но так и не получил ответа. Удаляю из таблицы с 1630918 записями , ну к примеру 110000 строк. Так вот процесс удаления DELETE FROM занимает некоторое продолжительное время, ну где то сек 30. Не понятно, почему SQL так долго удаляет
← →
kyn66 © (2009-10-29 16:07) [76]
> А ты не путай оценки со своими тараканами, все правильно,
> оценка точная.
Иногда твои мысли проблематично понять...
← →
Anatoly Podgoretsky © (2009-10-29 16:11) [77]> kyn66 (29.10.2009 16:04:15) [75]
Потому что при EmptyTable ничего не удаляется, таблица просто обрезается, остается только заголовок. А при DELETE происходит реальное удаление, при этом может делаться много невидимой работы, например ведение журнала тразакций, если данная СУБД с этим работает, а например для DBase присходит запись в каждую строку пометки, что запись удалена.
← →
Inovet © (2009-10-29 16:12) [78]> [75] kyn66 © (29.10.09 16:04)
> Не понятно, почему SQL так долго удаляет
Ну первое что приходит на ум - индексы не подходящие под условие WHERE, или вообще их нет.
← →
Anatoly Podgoretsky © (2009-10-29 16:12) [79]> kyn66 (29.10.2009 16:07:16) [76]
Привыкай или терпи, или спрашивай пояснения, как в данном случае.
Могу иногда ответить, если конечно еще буду помнить почему я так сказал.
← →
kyn66 © (2009-10-29 16:14) [80]
> Anatoly Podgoretsky © (29.10.09 16:11) [77]
Очень доходчиво и поучительно. Спасибо.
Страницы: 1 2 3 вся ветка
Текущий архив: 2009.12.13;
Скачать: CL | DM;
Память: 0.63 MB
Время: 0.01 c