Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.008 c
6-1210610534
Пробегал2...
2008-05-12 20:42
2009.12.13
UDP-сервер, принимающий пакеты по всем интерфейсам


2-1256302878
Игорь
2009-10-23 17:01
2009.12.13
Как узнать размеры ScrollBar ов в ScrollBox е?


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


2-1256189426
AndrewG
2009-10-22 09:30
2009.12.13
Hint


1-1228589526
Германн
2008-12-06 21:52
2009.12.13
BDE и bat-файлы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский