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

Вниз

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

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

Наверх





Память: 0.49 MB
Время: 0.039 c
1-1105945707
DelphiN!
2005-01-17 10:08
2005.01.30
Как установить иконку, для определенной строки ListBox-a ?


14-1105440071
hawkins
2005-01-11 13:41
2005.01.30
в чем разница между Shareware программой и триалом


1-1105870166
DimDim
2005-01-16 13:09
2005.01.30
Копировать каталог


14-1105251405
Бугага
2005-01-09 09:16
2005.01.30
Мужчина - женщина - блондинка :)


1-1106131014
novill
2005-01-19 13:36
2005.01.30
Как заставить программы подождать несколько секунд?





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