Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не понятно что удерживает таблицу [D7, ADS]


Страницы:   1 2 3 4 5

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]

Не будет это работать, ресурсы не защены.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо