![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доброго времени суток, мастера! Тормоза при повторном выполнении [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 - тоже индекс используется.. думаю, будет быстрее(причем , на много), чем "лопатить" все подряд...