Главная страница
    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.63 MB
Время: 0.01 c
15-1255379407
Юрий
2009-10-13 00:30
2009.12.13
С днем рождения ! 13 октября 2009 вторник


15-1255348813
Virgo_Style
2009-10-12 16:00
2009.12.13
ZoneAlarm Pro завтра (13-го) будут бесплатно раздавать


2-1256632484
Max1
2009-10-27 11:34
2009.12.13
Имитация зажатия Shift


15-1255552208
Юрий
2009-10-15 00:30
2009.12.13
С днем рождения ! 15 октября 2009 четверг


15-1255593046
картман
2009-10-15 11:50
2009.12.13
Букварь по теорверу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский