Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

Не понятно что удерживает таблицу   Найти похожие ветки 

 
kyn66 ©   (2009-10-28 12:42) [0]

Добрый день. Для временного хранения использую таблицу на диске. Перед использованием ее очищаю

   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/ Такое ощущение, что таблица почему то не закрывается, чтото ее удерживает.


 
Сергей М. ©   (2009-10-28 13:02) [1]


> чтото ее удерживает


CpsQuery ее удерживает - ты же не закрыл этот запрос


 
kyn66 ©   (2009-10-28 13:06) [2]

Закрыл, просто строка не захватилась в код


  while not CpsQuery.EOF do
    begin
       Cps2Tbl.InsertRecord([CpsQueryRegKod.Value, CpsQueryTovKod.Value,
                                    CpsQueryTovCena.Value]);
       CpsQuery.Next;
    end;
 CpsQuery.Close;


 
Anatoly Podgoretsky ©   (2009-10-28 13:09) [3]

> kyn66  (28.10.2009 12:42:00)  [0]

Между прочим, обычно приложение указывает ошибку, если нет то убери except end


 
kyn66 ©   (2009-10-28 13:09) [4]

Подсознательно я понимаю, что ошибка в этом коде

  CpsQuery.SQL.Clear;
  CpsQuery.SQL.Add("SELECT DISTINCT RegKod,TovKod,TovCena FROM Cps1 ORDER BY RegKod");
  CpsQuery.Open;
  CpsQuery.First;


Т.к. отключая его, ошибки не возникает. Но без этого куска никак. Вот и непонимаю, в чем дело...


 
kyn66 ©   (2009-10-28 13:15) [5]

Если размышлять логически без кода... Есть открытая таблица с набором данных. Выполняем запрос для олучения данных из этой таблицы. После получения запроса таблица не нужна. Закрываем ее. Обработав запрос , закрываем и его. Повторяем действия..... - в отладчике свойства таблицы:

  Active - False
  Exclusive - True;


Вроде все должно быть нормально. Выполняю очистку - обломс!


 
Anatoly Podgoretsky ©   (2009-10-28 13:17) [6]


> Подсознательно я понимаю, что ошибка в этом коде

В этом коде ошибки нет.


 
Сергей М. ©   (2009-10-28 13:18) [7]


> kyn66 ©   (28.10.09 13:06) [2]
>
> Закрыл


Значит не закрыл. Чудес-то не бывает)
Ставь брейкпойнт на CpsQuery.Close и лови закрытие.
Вот как поймаешь, так и поедем дальше.


 
Anatoly Podgoretsky ©   (2009-10-28 13:21) [8]

> Сергей М.  (28.10.2009 13:18:07)  [7]

Можно и не поймать, ведь никакой обработки ошибок в коде нет, есть увереность, что ошибок НИКОГДА не будет.


 
Сергей М. ©   (2009-10-28 13:24) [9]


> Anatoly Podgoretsky ©   (28.10.09 13:21) [8]


Можно и не поймать.
Но в голове при этом должна родиться мысль - искать почему оно не клюёт


 
kyn66 ©   (2009-10-28 13:31) [10]

Не успел сказать об этом. Действительно, отлавливать закрытие сложно. Знать бы в каком месте ожидать подвоха, на что конкретно обратить внимание.


 
Сергей М. ©   (2009-10-28 13:34) [11]


> Знать бы в каком месте ожидать подвоха


Да что там искать-то ? У тебя там всего-то дюжина строк, можно и пошагово пройтись ..
Но для начала [3]


 
kyn66 ©   (2009-10-28 13:37) [12]


> Но для начала [3]


Ну так я же ошибку и указал http://yurec66.narod.ru/Vopros/errcps1.jpg


 
kyn66 ©   (2009-10-28 13:40) [13]

Я пошагово прошел полностью для CpsQuery.Close ТАм закрываются курсоры и т.д. и т.п. Т. е. выхода на исключения нету. А за вторым разом до брекпоинта уже не доходит, тем более я писал, что таблица принимает статус [5]


 
Сергей М. ©   (2009-10-28 13:41) [14]


> я же ошибку и указал


Это ты видишь при запуске под отладчиком или автономно ?


 
kyn66 ©   (2009-10-28 13:43) [15]

Да, забыл добавить(плохо что форум не оборудован редактированием постов) что таблица не имеет ни индексов, ни мемо полей...


 
kyn66 ©   (2009-10-28 13:46) [16]


> Это ты видишь при запуске под отладчиком или автономно ?


Под отладчиком, ну из Delphi запускаю. Автономно - тоже самое.


 
Сергей М. ©   (2009-10-28 13:49) [17]

А как там остоит дело с транзакциями ?


 
kyn66 ©   (2009-10-28 13:51) [18]

Автономно ошибка выглядит вот так http://yurec66.narod.ru/Vopros/eravto.jpg
Если есть необходимость, могу выложить полный кусок кода, по нажатию на пункт меню, за вторым нажатием на который и происходит эта ошибка. Может это как то мастерам прояснит что то?


 
Сергей М. ©   (2009-10-28 13:53) [19]

Выкладывай


 
Anatoly Podgoretsky ©   (2009-10-28 13:54) [20]

> kyn66  (28.10.2009 13:46:16)  [16]

Не может быть, сообщение характерное для отладки.


 
Anatoly Podgoretsky ©   (2009-10-28 14:03) [21]

> kyn66  (28.10.2009 13:51:18)  [18]

Э, а ты умеешь копировать текст из формы?
Вместо посылания черт знает куда, что бы посмотреть картинку.

Cps1Tbl: Error 7008: The spe....


 
Сергей М. ©   (2009-10-28 14:04) [22]


> таблица не имеет .. индексов


Это как ?
В одной таблице и номенклатура и движение ?!


 
Dennis I. Komarov ©   (2009-10-28 14:08) [23]

Выкинуть Table и Query и заменить одним DS


 
Amoeba ©   (2009-10-28 14:10) [24]


> if Cps1Tbl.Active then
>      Cps1Tbl.Close;

Маленькое замечание. Проверка на Active перед Close абсолютно лишняя, она и так делается в коде, выполняемом при вызове Close.


 
kyn66 ©   (2009-10-28 14:40) [25]

Вот исходник клика по пункту меню:

procedure TMainFrm.N3Click(Sender: TObject);
begin
 try
   HaveChild := False; // Эмуляция параметра
   PeriodFrm := TPeriodFrm.Create(Application);
   if PeriodFrm.ShowModal = mrOK then
    begin
      MesFrm := TMesFrm.Create(nil);
      MesFrm.Lab1.Caption := "Формируется документ, ожидайте...";
      MesFrm.Show;
      MesFrm.Update;
      MesP := PeriodFrm.MesComboBox.ItemIndex + 1;
      GodP := PeriodFrm.GodSpinEdit.AsInteger;
      With DM1 do
       begin
         if SborTbl.Active then
          SborTbl.Close;
         SborTbl.Exclusive := True;
         SborTbl.EmptyTable;
         SborTbl.Exclusive := False;
         SborTbl.Open;

         if Cps1Tbl.Active then
          Cps1Tbl.Close;
         Cps1Tbl.Exclusive := True;
         Cps1Tbl.EmptyTable;
         Cps1Tbl.Exclusive := False;
         Cps1Tbl.Open;

         if Cps2Tbl.Active then
          Cps2Tbl.Close;
         Cps2Tbl.Exclusive := True;
         Cps2Tbl.EmptyTable;
         Cps2Tbl.Exclusive := False;
         Cps2Tbl.Open;

         RegionTbl.Open;
         PeriodTbl.Open;
         OpsTbl.Open;
         OpsTbl.First;
         while not OpsTbl.EOF do
          begin
            if PeriodTbl.Locate("RegKod;Mes;God", VarArrayOf([OpsTblKod.Value, MesP, GodP]), []) then
             begin
              // Отбор по основным РУПС
               OborotQuery.SQL.Clear;
               OborotQuery.SQL.Add("SELECT * FROM Oborot WHERE RegKod < 200 AND PerID = :p2 ORDER BY TovKod, Cena");
               OborotQuery.Params[0].Value := PeriodTblID.Value;
               OborotQuery.Open;
               OborotQuery.First;
                while not OborotQuery.EOF do
                 begin
                   SborTbl.InsertRecord([OpsTblKod.Value, OborotQueryTovKod.Value, Nil,
                                         OborotQueryCena.Value,
                                         OborotQueryKolOst.Value, OborotQuerySumOst.Value,
                                         OborotQueryKolPol.Value, OborotQuerySumPol.Value,
                                         OborotQueryKolReal.Value, OborotQuerySumReal.Value,
                                         OborotQueryOstMesKol.Value, OborotQueryOstMesSum.Value]);
                   OborotQuery.Next;
                 end;
               // Отбор для ЦПС
               OborotQuery.SQL.Clear;
               OborotQuery.SQL.Add("SELECT * FROM Oborot WHERE RegKod > 200 AND PerID = :p2 ORDER BY TovKod, Cena");
               OborotQuery.Params[0].Value := PeriodTblID.Value;
               OborotQuery.Open;
               OborotQuery.First;

                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;
             end;
            OpsTbl.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;
          CpsQuery.Close;

         //-------------------------------------------------------------------
         // из-за ошибки дальнейшая обработка данных не реализована пока
         //-------------------------------------------------------------------

         Cps1Tbl.Close;
         Cps2Tbl.Close;
         SborTbl.Close;
         RegionTbl.Close;
         PeriodTbl.Close;
       end;{With DM1}
      MesFrm.Hide;
      MesFrm.Free;
    end;
 finally
   PeriodFrm.Close;
   PeriodFrm.Free;
 end;
end;


 
Dennis I. Komarov ©   (2009-10-28 14:45) [26]

Create
try
...
finally
Free;
end;


 
kyn66 ©   (2009-10-28 14:45) [27]


> Это как ?В одной таблице и номенклатура и движение ?!


Это пока делаю запросы через SQl, индексы мне не нужны. Потом для связки , может быть через MasterSources продумаю какие нужны индексы.


 
Dennis I. Komarov ©   (2009-10-28 14:46) [28]


>                    OborotQuery.Next;
>                  end;
>                // Отбор для ЦПС
>                OborotQuery.SQL.Clear;

Close?


 
Сергей М. ©   (2009-10-28 14:51) [29]


> kyn66


Ну хорошо, а НЕэксклюзивное открытие таблицы Cps1 при втором проходе осуществляется успешно ?


 
kyn66 ©   (2009-10-28 14:55) [30]

2Dennis I. Komarov ©


> Close?


Эта часть кода не имеет отношения к таблице Cps1Tbl.  Только с этой проблемы.


 
kyn66 ©   (2009-10-28 14:56) [31]


> Сергей М. ©   (28.10.09 14:51) [29]
> > kyn66Ну хорошо, а НЕэксклюзивное открытие таблицы Cps1
> при втором проходе осуществляется успешно ?


А я ее эсклюзивом и не открываю. В Эксклюзив перевожу только для очистки и все, т.к. по другому EmptyTable не разрешит сделать.


 
Сергей М. ©   (2009-10-28 14:59) [32]

Ну я и иею ввиду очистку..
Что если при втором проходе вместо попытки очистки снчала попытаться открыть НЕэксклюзивно ?


 
kyn66 ©   (2009-10-28 15:07) [33]

А, типа проверить даст ли открыть впринципе, если уже кем то удерживается? Я вот тут в отладке нашел место куда заходит прога при очистке

{**********************************************************
*  Module:  TAdsDataSet.EmptyTable
*  Input:
*  Output:
*  Description: Empty (or zaps) the table.
**********************************************************}
procedure TAdsDataSet.EmptyTable;
var
  hHoldHandle : ADSHANDLE;
begin
{$IFDEF CALLTRACE }
  WriteCallTrace( "TAdsDataSet.EmptyTable" );
{$ENDIF }

  if Active then
  begin
     {  Make sure we are in browse mode or raise exception }
     CheckBrowseMode;
     {  If the table is active then use the active handle and zap }
     ACECheck( self, ACE.AdsZapTable( self.Handle ) );
     {  Clear all buffers }
     ClearBuffers;
     {  Cause a dataevent to let event handler know that the DataSet has changed }
     DataEvent( deDataSetChange, 0 );
  end
  else
  begin
     hHoldHandle := OpenAdvantageFiles;
     try
        {  Open a temporary table and zap the table }
        ACECheck( self, ACE.AdsZapTable( hHoldHandle ) );
     except
        ACECheck( self, ACE.AdsCloseTable( hHoldHandle ) );
        raise;
     end;
     ACECheck( self, ACE.AdsCloseTable( hHoldHandle ) );
  end;
end;


Переходит сразу в "жирный" блок. Значит говорит о чем, что таблица уже имеет статус неактивности. Ошибка вылетает в процедуре ACECheck. Сейчас буду ее расковыривать дальше


 
kyn66 ©   (2009-10-28 15:11) [34]


> Что если при втором проходе вместо попытки очистки снчала
> попытаться открыть НЕэксклюзивно ?


Поверил, открывает без ошибки

//         if Cps1Tbl.Active then
//           Cps1Tbl.Close;
//          Cps1Tbl.Exclusive := True;
//          Cps1Tbl.EmptyTable;
//          Cps1Tbl.Exclusive := False;
         Cps1Tbl.Open;


 
Сергей М. ©   (2009-10-28 15:13) [35]

Если дело не в транзакциях, то весьма похоже на кривизну ADS


 
Anatoly Podgoretsky ©   (2009-10-28 15:28) [36]


> kyn66 ©   (28.10.09 14:40) [25]

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


 
kyn66 ©   (2009-10-28 15:33) [37]

Вот нашел конкретное место, где сваливает на ошибку
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;
...



Форум не позволяет вставить полностью код этой функции


 
kyn66 ©   (2009-10-28 15:35) [38]


> Anatoly Podgoretsky ©   (28.10.09 15:28) [36]


А в каком конкретно месте смущает и что именно?


 
Anatoly Podgoretsky ©   (2009-10-28 15:41) [39]

> kyn66  (28.10.2009 15:35:38)  [38]

Меня смущает весь код, его надо полностью переписывать.
Суть в try finally, у тебя оно ничего не защищает, а точнее наоборот. Например создание формы должно быть до try и внутри должны быть защищены все ресурсы.

В третьих для отладки надо создать мини код, ничего кроме Cps1Tbl.EmptyTable; и обрамляющего его кода. Может ты не там ищешь где потерял, а там где светлее.


 
kyn66 ©   (2009-10-28 15:50) [40]


> Anatoly Podgoretsky ©   (28.10.09 15:41) [39]


....... м-да, логично. Нужно минимизировать код для проверки. Суть в try finally у меня в корректном закрытии промежуточной формы (PeriodFrm) и только. Т.к мне дважды пришлось бы выполнять код

 PeriodFrm.Close;
 PeriodFrm.Free;

в зависимости от модальности закрытия этой формы. Ну я так нашел применение.



Страницы: 1 2 3 вся ветка

Текущий архив: 2009.12.13;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.015 c
2-1256274351
snowkam
2009-10-23 09:05
2009.12.13
не сохраняются расширения


2-1256646632
maxerstats
2009-10-27 15:30
2009.12.13
Изменить цвет выделеных строк в listbox е без закразки их...


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


15-1255699290
ocean
2009-10-16 17:21
2009.12.13
Посоветуйте бесплатный antispy для windows 2003 server?


2-1256104735
Qwerg_ntgl
2009-10-21 09:58
2009.12.13
Загрузка в DbGrid в PickList из текстового файла