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

Вниз

Доброго времени суток, мастера! Тормоза при повторном выполнении   Найти похожие ветки 

 
bers ©   (2004-12-21 07:27) [0]

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

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

Вот код:

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;
В чем загвоздка, не пойму . Может надо как то очистить память после цикла?
Заранее благодарен


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

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


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

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

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


 
SeZuka ©   (2004-12-21 09:12) [3]

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

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

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


 
bers ©   (2004-12-21 09:58) [4]

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


 
Johnmen ©   (2004-12-21 10:06) [5]

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

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


 
Vemer ©   (2004-12-21 10:36) [6]

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


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

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

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

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

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

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

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

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


 
dolmat   (2004-12-21 12:44) [8]

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


 
bers ©   (2004-12-21 16:16) [9]

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


 
bers ©   (2004-12-21 16:58) [10]

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


 
msguns ©   (2004-12-21 17:32) [11]

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

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


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

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


 
bers ©   (2004-12-24 08:58) [13]


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

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

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



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

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

Наверх




Память: 0.5 MB
Время: 0.047 c
14-1105638404
YurikGL
2005-01-13 20:46
2005.01.30
Такие дела творятся....


1-1105987607
redlord
2005-01-17 21:46
2005.01.30
TICQClient и регистрация нового пользователя


14-1105608274
Ericon
2005-01-13 12:24
2005.01.30
Библиотека на C++ вызываемая из Delphi


1-1105781773
user101
2005-01-15 12:36
2005.01.30
Pchar To String


14-1105435700
Ozone
2005-01-11 12:28
2005.01.30
Как узнать модель телефона.