![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как ускорить процедуру [D7, Paradox]
barakuda © (2006-07-19 18:32:00)Процедура делает все правильно но очень долго
в таблице 1000 записей, проделура выполняется 40 мин.
максимум могу позволить 5 мин. может из-за BDE или Paradox
procedure Tform5.Iul;
var fff: string;
begin
i:=1;
form1.Table1.First;
while notform1.Table1.Eof do
begin
ifform1.Table1.FieldByName('Iul').AsString'' then
begin
table1.Append;
table1.FieldByName('Mounth').AsString:=cxcombobox1.Text;
table1.FieldByName('numpl').AsString:=form1.Table1.FieldByName('num').AsString;
table1.FieldByName('zakazchik').AsString:=form1.Table1.FieldByName('Iul').AsStri ng;
form1.Table1.Next;
table1.FieldByName('Suzhet').AsString:=form1.Table1.FieldByName('Iul').AsString;
table1.FieldByName('grup').AsString:=form1.Table1.FieldByName('Iul').AsString;
form1.Table1.Next;
table1.FieldByName('Zhena').AsString:=form1.Table1.FieldByName('Iul').AsString;
table1.FieldByName('adress').AsString:=form1.Table1.FieldByName('boold').AsStrin g;
table1.FieldByName('City').AsString:=form1.Table1.FieldByName('City').AsString;
table1.Post;
form1.Table1.Next;
end else
begin
form1.Table1.Next; form1.Table1.Next; form1.Table1.Next;
end;
end;
{---------------------------------------}
{---------------------------------------}
{---------------------------------------}
i:=i+1;
table1.First;
while not table1.Eof do
begin
ukaz:=table1.RecNo;
Fil:='Suzhet='''+table1.fieldbyname('Suzhet').AsString+'''';
//table1.Filtered:=true;
table1.First;
while not table1.Eof do
begin
ukaz1:=table1.RecNo;
Table1.Filter:=fil+' and '+'Zakazchik='''+table1.fieldbyname('Zakazchik').AsString+'''';
table1.Filtered:=true;
table1.First;
summ:=0;
while not table1.Eof do
begin
table1.Edit;
table1.FieldByName('kolvo').AsInteger:=table1.RecordCount;
table1.Post;
if table1.FieldByName('zhena').asstring'Ðåçåðâ' then
begin
summ:=summ+table1.FieldByName('zhena').AsInteger;
end;
table1.Next;
end;
table1.First;
while not table1.Eof do
begin
table1.Edit;
table1.FieldByName('npp').AsInteger:=i;
table1.FieldByName('summa').AsInteger:=summ;
table1.Post;
table1.Next;
end;
table1.Filtered:=false;
table1.RecNo:=ukaz1;
table1.Next;
end;
{---------------------------------------}
{---------------------------------------}
{---------------------------------------}
table1.Filtered:=false;
table1.RecNo:=ukaz;
table1.Next;
end;
end;
dolmat (2006-07-20 12:42:00) [21]Да чтобы яснее было
table1.cancelrange; // отмена фильтрации
table1.setrange([значение_Suzhet,значение_Zakazchik],[значение_Suzhet,значение_Z akazchik]);
Table1.indexname:='Suzhet_Zakazchik'; // в начале процедуры
barakuda (2006-07-20 12:35:00) [22]Это будет фильтрация сразу по двум полям???
dolmat (2006-07-20 12:30:00) [23]создайте индекс например
table1.addindex('Suzhet_Zakazchik','Suzhet;Zakazchik',[]);
может ругнуться и не создать если нет ключевого индекса! выполняется 1 раз так что в програмном коде его не оставляйте.
затем вместо
Table1.Filter:=fil+' and '+'Zakazchik='''+table1.fieldbyname('Zakazchik').AsString+'''';
table1.Filtered:=true;
Table1.indexname:='Suzhet_Zakazchik';
table1.setrange([значение,значение],[значение,значение]);
barakuda (2006-07-20 12:13:00) [24]table1.fieldbyname('Suzhet').
и
table1.fieldbyname('Zakazchik').
dolmat (2006-07-20 12:12:00) [25]По каким полям фильтровать?
barakuda (2006-07-20 12:02:00) [26]это как, можно поподробнее
dolmat (2006-07-20 11:56:00) [27]Скорее всего тормозит здесь
Table1.Filter:=fil+' and '+'Zakazchik='''+table1.fieldbyname('Zakazchik').AsString+'''';
table1.Filtered:=true;
Для ускорения создайте индекс по полям фильтрации и попробуйте table1.findkey([])
Desdechado (2006-07-20 11:30:00) [28]Остается выяснить, какой из кусков тормозит. Комментируй по очереди и ищи.
barakuda (2006-07-20 09:49:00) [29]вот это имею
http://img160.imageshack.us/img160/3666/3333333331ik6.jpg
вот это хочю получить
http://img145.imageshack.us/img145/1633/333333333nb9.jpg
но быстро
Johnmen (2006-07-19 23:42:00) [30]1. Надо так понимать, что table1 и form1.Table1 разные вещи?
2. Что это за загадка form1.Table1.Next; form1.Table1.Next; form1.Table1.Next;?
3. Это безобразие заменяется на INSERT INTO ... (...) SELECT ... FROM ... WHERE (NOT Iul IS NULL) AND (Iul<>'')
Дальше не смотрел. Этого хватило...:)
sniknik (2006-07-19 19:43:00) [31]http://www.imageshack.us/
выкладываеш и даеш ссылку...
barakuda (2006-07-19 19:25:00) [32]если бы картинки можно было вылаживать, другое дело, а на словах долго рассказывать
Val (from Kiev) (2006-07-19 18:39:00) [33]ух... а вы сделайте еще несколько вложенных циклов с проходами по таблице и удивитесь времени выполнения еще больше..
задачу расскажите.