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

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

как ускорить процедуру [D7, Paradox]


Страницы:   1 2

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]

ух... а вы сделайте еще несколько вложенных циклов с проходами по таблице и удивитесь времени выполнения еще больше..
задачу расскажите.


Страницы:   1 2

Наверх

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