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

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

Доброго времени суток, мастера! Тормоза при повторном выполнении [D7, Paradox]


bers ©   (2004-12-21 07:27:00) 

Надо выбрать записи основной таблицы, у которой в подчиненной есть определенные значения.
Делаю так: Листаю основную табл., вторым циклом просматриваю детальную и если искомые данные есть в основной в  одном из полей ставлю признак, после цикла фильтр по этому признаку.
Проблема :

Первый проход нормально, а вот при повторном выполнении скорость очень сильно падает!!!

Вот код:

var lg11,lg21 :integer;
begin
   IF Button1.Caption='применить' Then
       begin
          TBL1.First;
          Tbl2.First;
          Tbl1.Filtered:=false;
          Tbl1.Refresh;
          For LG11:=0 to (Tbl1.RecordCount-1) do
             Begin
                     Tbl1.Edit;
                     tbl1['SPV']:='';{Обнуляю признак}
                     Tbl1.post;
                     If (Tbl2.RecordCount=0)or((Tbl2.RecordCount=1)and (tbl2['LG']=null)) Then {Есть ли запись или не пустое ли поле если запись одна?}
                     Begin
                    Tbl1.Edit;
                    Tbl1['SPV']:='1';
                    Tbl1.Post;
                     End;
                  For LG21:=0 to (Tbl2.RecordCount-1) do
                    Begin
                    If  Tbl2['LG']= '010{тут через "или" еще несколько значений}
                    Then
                    begin
                    Tbl1.Edit;
                    Tbl1['SPV']:='1'{Нашлось- ставим признак в основную таблицу};
                    Tbl1.Post;
                    end;
                    Tbl2.Next;
                    End;
                 Tbl1.Next;
             End;
        Button1.Caption:=Показать все';
        Tbl1.Filter:='[spv]<>1';
        Tbl1.Filtered:=True;{фильтруем}
      end
     Else
     begin
        Tbl1.Filtered:=False;
        Tbl1.Refresh;
        Button1.Caption:='применить';
     End;
end;
В чем загвоздка, не пойму . Может надо как то очистить память после цикла?
Заранее благодарен


bers   (2004-12-24 08:58:00) [1]


> [DisableControls] надо на Gridе отключать. Так же тормоз
> из-за используемого грида может быть.

dolmat, спасибо. Я отключал DBGrid, но особого эффекта не получил, пока не отключил еще и DBNavigator. После отключения и того и другого, стало очень хорошо. (К стати у DBGrid нет DisableControls)
А запросы- это  просто замечательно, но не переписывать же всю базу. Ей жить осталось до нового года, потом конверт в другую.

Спасибо, всем кто откликнулся!


dolmat   (2004-12-22 10:04:00) [2]

[DisableControls] надо на Gridе отключать. Так же тормоз из-за используемого грида может быть.


msguns   (2004-12-21 17:32:00) [3]

>bers ©   (21.12.04 16:58) [10]
>Да, при DisableControls у меня детальная не крутится.

Эх, робяты !!! Сначала делаем, потом читаем, потом думаем, ага ?


bers   (2004-12-21 16:58:00) [4]

Да, при DisableControls у меня детальная не крутится.


bers   (2004-12-21 16:16:00) [5]

>>to  dolmat
Спасибо,проверку поставил, малость полегчало(А может и еще от чего... Много всего пробовал). но небольшое снижение на втором проходе есть, в принципе на первое время вроде потянет.
Ставлю DisableControls- Быстро выполняет цикл, но искать нормально перестает. Странно ведь должно отключаться только визуальное отображение.
Или мне пора переустановить Delphi


dolmat   (2004-12-21 12:44:00) [6]

Проблема в этом
Tbl1.Filtered:=false;
при первом проходе он скорее всего и так false;
при втором переход из true в false здесь и тормоз получается


msguns   (2004-12-21 10:43:00) [7]

Случай типичного злоупотребления TTable

У тебя есть условия:
- если (к-во подчиненных=0) или
  (к-во подчиненных=1) и (LG=null) или
  (среди подчиненных есть такие, у которых LG IN (список)])

  то SPV мастера = '1'

  иначе SPV мастера = ''

Причем отображается таблицы после коррекции.

Все это надо делать, конечно же запросами ! А после переоткрывать обе таблицы для просмотра.

Еще вопрос. Зачем тянуть  всю таблу, а затем ее фильтровать, если можно обойтись запросом, в котором, собственно, и указать то же самое условие ?


Vemer   (2004-12-21 10:36:00) [8]

Просто как вариант (если парадукс такое поддерживает :)):
Select ID, Field1... From MainTable
Where Exists (Select Field 3 From DetailedTable
             Where FK_KeyField = MainTable.ID)


Johnmen   (2004-12-21 10:06:00) [9]

>bers ©   (21.12.04 09:58) [4]
>Как выполнитьSQL на TTable? Есть разве такая возможность?

Никак, ибо глупость...:)
Да и причём здесь TTable ???


bers   (2004-12-21 09:58:00) [10]

Индексы использую конечно, DisableControls сейчас попробую,
но, главное в первой проходке- нормально,а повторное выполнение тормозит жутко.
>>Johnmen
Я бы с радостью.
Как выполнитьSQL на TTable? Есть разве такая возможность?


SeZuka   (2004-12-21 09:12:00) [11]

Сделай в самом начале
 Tbl1.DisableControls;
 Tbl2.DisableControls;
   try

и в конце
  finally
   Tbl2.EnableControls;
   Tbl1.EnableControls;
 End;

должно помочь.


Johnmen   (2004-12-21 09:10:00) [12]

>Надо выбрать записи основной таблицы, у которой в подчиненной
>есть определенные значения.

Всё это делается одним несложным запросом.
(Предупреждаю, см.LocalSQL.hlp)


Виталий Панасенко   (2004-12-21 08:42:00) [13]

А через мастер-детальне пробовал ? Используется индекс(если он, конечно есть ! :-) )... Или для Tbl2 используй SetRange - тоже индекс используется.. думаю, будет быстрее(причем , на много), чем "лопатить" все подряд...


Наверх

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