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


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

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


kyn66   (2009-10-28 15:11:00) [62]


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


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

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


kyn66   (2009-10-28 15:07:00) [63]

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

{**********************************************************
*  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. Сейчас буду ее расковыривать дальше


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

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


kyn66   (2009-10-28 14:56:00) [65]


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


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


kyn66   (2009-10-28 14:55:00) [66]

2Dennis I. Komarov ©


> Close?


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


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


> kyn66


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


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


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

Close?


kyn66   (2009-10-28 14:45:00) [69]


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


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


Dennis I. Komarov   (2009-10-28 14:45:00) [70]

Create
try
...
finally
Free;
end;


kyn66   (2009-10-28 14:40:00) [71]

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

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;


Amoeba   (2009-10-28 14:10:00) [72]


> if Cps1Tbl.Active then
>      Cps1Tbl.Close;

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


Dennis I. Komarov   (2009-10-28 14:08:00) [73]

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


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


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


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


Anatoly Podgoretsky   (2009-10-28 14:03:00) [75]

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

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

Cps1Tbl: Error 7008: The spe....


Anatoly Podgoretsky   (2009-10-28 13:54:00) [76]

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

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


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

Выкладывай


kyn66   (2009-10-28 13:51:00) [78]

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


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

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


kyn66   (2009-10-28 13:46:00) [80]


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


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


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

Наверх

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