Главная страница
    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;

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


 
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]


Очень доходчиво и поучительно. Спасибо.


 
Anatoly Podgoretsky ©   (2009-10-29 16:16) [81]

> Inovet  (29.10.2009 16:12:18)  [78]

Индексы тоже, их же перестраивать нужно.


 
kyn66 ©   (2009-10-29 16:23) [82]


> Inovet ©   (29.10.09 16:12) [78]
> > [75] kyn66 ©   (29.10.09 16:04)> Не понятно, почему SQL
> так долго удаляетНу первое что приходит на ум - индексы
> не подходящие под условие WHERE, или вообще их нет.


Да нет, индексы есть, правда составной по двум полям "Tir;Nom" - к примеру и вот удаляю так

  ...
  SQL.Add("DELETE FROM TiragSL WHERE Tir = :p1");
  Params[0].Value := tir;
  ExecSQL;
  ...


Tir - как раз и есть поле с индексом. Пардон, удаляю с таблицы, в которой 2937140 записей, если это что изменит.


 
kyn66 ©   (2009-10-29 16:26) [83]

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


 
Inovet ©   (2009-10-29 16:39) [84]

> [82] kyn66 ©   (29.10.09 16:23)

Да вроде всё нормально, но 30 секунд многовато, как будто индекс не используется
> [83] kyn66 ©   (29.10.09 16:26)
> вариант перед удалением записей удалить индексы (индексный
> файл) и потом уже их пересоздать заново, на новом наборе
> записей?

Файл сам удалится при удалении последнего индекса, только вот для DELETE они нужны как раз нужны. А для текущей задачи вообще без условия и без индексов удаление, только для DBF в отличии от ADT на место удалённых новые не будут записываться, а будут в конец.


 
Anatoly Podgoretsky ©   (2009-10-29 16:48) [85]

> kyn66  (29.10.2009 16:26:23)  [83]

Такой метод существует, только тебе же удалить все записи, а ты почему то про WHERE завел речь

DELETE {*/ALL} FROM Tbl


 
Anatoly Podgoretsky ©   (2009-10-29 16:49) [86]

> Inovet  (29.10.2009 16:39:24)  [84]

Для полного удаления, как раз индексы не нужны, только лишний тормоз.


 
Inovet ©   (2009-10-29 16:59) [87]

> [86] Anatoly Podgoretsky ©   (29.10.09 16:49)
> > Inovet  (29.10.2009 16:39:24)  [84]
>
> Для полного удаления, как раз индексы не нужны, только лишний
> тормоз.

Я это специально подчеркнул

> [84] Inovet ©   (29.10.09 16:39)
> А для текущей задачи вообще без условия и без индексов удаление

Ещё о временной таблице я говорил имя начинается с "#" будет видна только в текущем соединении.


 
kyn66 ©   (2009-10-29 17:22) [88]


> Anatoly Podgoretsky ©   (29.10.09 16:48) [85]
> > kyn66  (29.10.2009 16:26:23)  [83]Такой метод существует,
>  только тебе же удалить все записи, а ты почему то про WHERE
> завел речь


В данном случае было ответвление небольшое на другую тему [72] Там удаление выполнялось выборочно. Это задета тема касаемо метода DELETE FROM Tbl


 
kyn66 ©   (2009-10-29 17:24) [89]


> Inovet ©   (28.10.09 19:52) [54]
>  Потом под временные лучше временные и применять #Cps1tbl


Пардонс, упустил этот момент. Не слыхал про такой. Подробнее можно?


 
Inovet ©   (2009-10-29 17:35) [90]

> [89] kyn66 ©   (29.10.09 17:24)
>
> > Inovet ©   (28.10.09 19:52) [54]
> >  Потом под временные лучше временные и применять #Cps1tbl
>
> Пардонс, упустил этот момент. Не слыхал про такой. Подробнее
> можно?

Во всём аналогичны обычным таблицам, только видны в текущем Connection, т.е. одно имя можно использовать, например, в сети и не заботиться о конфликтах, хранятся в каталоге %TEMP%, при закрытии соединения все удаляются, имя начинается с #. Не помню в какой версии ADS появились.


 
kyn66 ©   (2009-10-29 17:40) [91]


> Inovet ©   (29.10.09 17:35) [90]


Т.е. имя присваивается компонентту TADsTable?
Типа TADsTable.Name := "#Cps1Tbl" ?


 
kyn66 ©   (2009-10-29 17:49) [92]

Description

CreateTable is used to create a new table defined by the current dataset"s field definitions. If the table already exists, CreateTable will overwrite the table’s data and structure. To avoid overwriting an existing table, check the Exists property before calling CreateTable. If the name of the table begins with the # character, the newly created table will be a temporary table that is only visible on the current connection.

Т.е. получается  что ее можно создать во время работы программы. Да я делал и простое создание с последующим удалением физически с диска. А эта  временная... потом полями ее набивать...


 
Inovet ©   (2009-10-29 17:53) [93]

> [91] kyn66 ©   (29.10.09 17:40)
>
> > Inovet ©   (29.10.09 17:35) [90]
>
>
> Т.е. имя присваивается компонентту TADsTable?
> Типа TADsTable.Name := "#Cps1Tbl" ?

Не, компонент - это обёртка над API.
Examples:

// Create a temporary table named Temp1 with two columns
CREATE TABLE #Temp1 ( Name Char( 30 ), seqid integer );

// Пользуемся
INSERT INTO #Temp1 (Name, seqid) VALUES ("Test 123", 123)

SELECT * FROM #Temp1

// Можно удалить или удалится при закрытии Connection
DROP TABLE #Temp1


Ещё из справки пример

// This example creates two temporary tables for intermediate results
// Step 1. Create a temporary table named DeptCount and at the same time
// populate it with summary data from an existing table in the
// database

SELECT deptnum, count(*) as NumEmployees
INTO #DeptCount
FROM employees
GROUP BY deptnum

// Step 2. Create another temporary table named LocCount which list the
// number of employees in each location for each department.

SELECT deptnum, location, count(*) as cnt
INTO #LocCount
FROM employees
GROUP BY deptnum, location

// Finally using the 2 temporary tables to list the percent of employee
// on each location for each department

SELECT a.deptnum, a.location, ( a.cnt * 100 ) / b.NumEmployees As PercentAtLocation
FROM #LocCount a, #DeptCount b
WHERE a.deptnum = b.deptnum


 
Dennis I. Komarov ©   (2009-10-29 17:55) [94]


> Т.е. имя присваивается компонентту TADsTable?
> Типа TADsTable.Name := "#Cps1Tbl" ?

Суров...


 
kyn66 ©   (2009-10-29 18:00) [95]


> Inovet ©   (29.10.09 17:53) [93]


Да , спасибо, уже сам нашел в хэлпе...



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

Форум: "Начинающим";
Текущий архив: 2009.12.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.74 MB
Время: 0.007 c
2-1256722969
kyn66
2009-10-28 12:42
2009.12.13
Не понятно что удерживает таблицу


2-1256214650
Кирей
2009-10-22 16:30
2009.12.13
Кодовая страница в ADOConnection


2-1256210880
Nucer
2009-10-22 15:28
2009.12.13
Вопрос по исключениям


15-1255613662
Аркадий_малый
2009-10-15 17:34
2009.12.13
Сайт


15-1255037610
Германн
2009-10-09 01:33
2009.12.13
RJ45 и как профессионалы умудряются?





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