Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.65 MB
Время: 0.03 c
15-1255549690
Petr V. Abramov
2009-10-14 23:48
2009.12.13
что за директория???


3-1231348460
TCrash
2009-01-07 20:14
2009.12.13
Получение полного имени поля


15-1255284553
Denis123
2009-10-11 22:09
2009.12.13
Проверка сложности пaроля


15-1255426204
pasha_golub
2009-10-13 13:30
2009.12.13
Что за орнагическое соединение?


1-1228221714
Jorjia
2008-12-02 15:41
2009.12.13
ControlGrid - найти номер строки грида по расположенному на ней к