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

Вниз

как ускорить процедуру   Найти похожие ветки 

 
barakuda ©   (2006-07-19 18:32) [0]

Процедура делает все правильно но очень долго

в таблице 1000 записей, проделура выполняется 40 мин.
максимум могу позволить 5 мин. может из-за BDE или Paradox

procedure Tform5.Iul;
var fff: string;
begin
i:=1;
form1.Table1.First;

while not form1.Table1.Eof do
begin
if form1.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<>"&#208;&#229;&#231;&#229;&#240;&#226;" 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;


 
Val (from Kiev)   (2006-07-19 18:39) [1]

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


 
barakuda ©   (2006-07-19 19:25) [2]

если бы картинки можно было вылаживать, другое дело, а на словах долго рассказывать


 
sniknik ©   (2006-07-19 19:43) [3]

http://www.imageshack.us/
выкладываеш и даеш ссылку...


 
Johnmen ©   (2006-07-19 23:42) [4]

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<>"")

Дальше не смотрел. Этого хватило...:)


 
barakuda ©   (2006-07-20 09:49) [5]

вот это имею
http://img160.imageshack.us/img160/3666/3333333331ik6.jpg

вот это хочю получить
http://img145.imageshack.us/img145/1633/333333333nb9.jpg
но быстро


 
Desdechado ©   (2006-07-20 11:30) [6]

Остается выяснить, какой из кусков тормозит. Комментируй по очереди и ищи.


 
dolmat   (2006-07-20 11:56) [7]

Скорее всего тормозит здесь

Table1.Filter:=fil+" and "+"Zakazchik="""+table1.fieldbyname("Zakazchik").AsString+"""";
table1.Filtered:=true;

Для ускорения создайте индекс по полям фильтрации и попробуйте table1.findkey([])


 
barakuda ©   (2006-07-20 12:02) [8]

это как, можно поподробнее


 
dolmat   (2006-07-20 12:12) [9]

По каким полям фильтровать?


 
barakuda ©   (2006-07-20 12:13) [10]

table1.fieldbyname("Suzhet").

и

table1.fieldbyname("Zakazchik").


 
dolmat   (2006-07-20 12:30) [11]

создайте индекс например
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:35) [12]

Это будет фильтрация сразу по двум полям???


 
dolmat   (2006-07-20 12:42) [13]

Да чтобы яснее было
table1.cancelrange; // отмена фильтрации
table1.setrange([значение_Suzhet,значение_Zakazchik],[значение_Suzhet,значение_Z akazchik]);

Table1.indexname:="Suzhet_Zakazchik"; // в начале процедуры


 
barakuda ©   (2006-07-20 12:57) [14]

В общем система такая

есть таблица с данными (которая заполнена менеджерами)
заказчик  сюжет   №плоскости   цена

1. берем заказчика (заказчиков разумеется много разных, один заказчик может размещать разные сюжеты, в любых количествах, на каких угодно плоскостях),

2. нужно получить

 заказчик  сюжет   №плоскости   кол-во плоскост.    цена    сумма

Нужно посчитать сколько денег заплатил заказчик за размещение одного сюжета (один сюжет может быть размещен на нескольких рекламных плоскостях), так же посчитать сколько плоскостей было отведено под каждый сюжет

Если кто подскажет оптимальный алгоритм и я его успешно откомпилирую

я даже заплачу на счет в банке, на кредитку, или western union


 
Виталий Панасенко   (2006-07-20 12:58) [15]


> barakuda ©   (20.07.06 12:35) [12]
> Это будет фильтрация сразу по двум полям???

будет, будет. только ты для начала, теорию изучи. а то не имеешь ни малейшего представления о возможностях(методах) обьектов.


 
barakuda ©   (2006-07-20 13:15) [16]

Дело в том что мне нужна фильтрация по двум полям, но последовательно,
сначала по первому, затем по второму


 
dolmat   (2006-07-20 13:25) [17]

Query1 ПОМОЖЕТ


 
barakuda ©   (2006-07-20 13:26) [18]

С ним никогра не работал, к сожалению


 
barakuda ©   (2006-07-20 13:31) [19]

могу прислать исходную таблицу, и что должно получиться


 
dolmat   (2006-07-20 13:39) [20]


> В общем система такая
>
> есть таблица с данными (которая заполнена менеджерами)
> заказчик  сюжет   №плоскости   цена
> 2. нужно получить
>
>  заказчик  сюжет   №плоскости   кол-во плоскост.    цена
>    сумма


А где цены?


 
barakuda ©   (2006-07-20 13:40) [21]

какие цены


 
dolmat   (2006-07-20 13:46) [22]


> А где цены?

зарапортовался
кол-во плоскост? или его вычисляем


 
dolmat   (2006-07-20 13:56) [23]

1-й шаг
на форму кидаем Query1
щелкаем по нему правой кнопкой мыши и выбираем SQL Bilder
находим в выпадающих списках таблицу и отмечаем все поля, которые нужно, закрываем SQL Bilder
DataSource1 которяа связана с Table связываем с Query1
Должно получиться
> заказчик  сюжет   №плоскости   цена


 
barakuda ©   (2006-07-20 13:56) [24]

Допустим рекламное агентство Макинфо разместила сюжет МАЛЬБОРО на пяти разных плоскостях - кол-во плоскост = 5, а так же сюжет ЧЕСТЕР на трех разных плоскостях - кол-во плоскост =3

Имеем

Макинфо  МАЛЬБОРО  1010A  100$
Макинфо  МАЛЬБОРО  1011A  150$
Макинфо  МАЛЬБОРО  1012A  120$
Макинфо  МАЛЬБОРО  1013A  100$
Макинфо  МАЛЬБОРО  1015A  150$
Макинфо  ЧЕСТЕР       1014A  100$
Макинфо  ЧЕСТЕР       1020A  150$
Макинфо  ЧЕСТЕР       1055A  100$

Нужно

Макинфо  МАЛЬБОРО     5       1010A  100$   620$
Макинфо  МАЛЬБОРО             1011A  150$
Макинфо  МАЛЬБОРО             1012A  120$
Макинфо  МАЛЬБОРО             1013A  100$
Макинфо  МАЛЬБОРО             1015A  150$

Макинфо  ЧЕСТЕР         3        1014A  100$   350$
Макинфо  ЧЕСТЕР                   1020A  150$
Макинфо  ЧЕСТЕР                   1055A  100$


 
dolmat   (2006-07-20 14:02) [25]

5*100=620 Откуда сумма?


 
barakuda ©   (2006-07-20 14:09) [26]

почему 5*100.

100+150+120+100+150 = 620 вот сумма


 
barakuda ©   (2006-07-20 14:34) [27]

послал тебе на мыло  таблицу


 
Виталий Панасенко   (2006-07-20 14:55) [28]

А не проще ли созадть мастер-деталь ? в мастере имеем итоги, а расшифровку - в детали ?

мастер
Макинфо  МАЛЬБОРО     5        620$

деталь

Макинфо  МАЛЬБОРО             1010A  100$
Макинфо  МАЛЬБОРО             1011A  150$
Макинфо  МАЛЬБОРО             1012A  120$
Макинфо  МАЛЬБОРО             1013A  100$
Макинфо  МАЛЬБОРО             1015A  150$

мастер
Макинфо  ЧЕСТЕР         3         350$
деталь
Макинфо  ЧЕСТЕР                   1014A  100$  
Макинфо  ЧЕСТЕР                   1020A  150$
Макинфо  ЧЕСТЕР                   1055A  100$


 
barakuda ©   (2006-07-20 14:59) [29]

Итоги сначала посчитать надо


 
Виталий Панасенко   (2006-07-20 15:20) [30]


> barakuda ©   (20.07.06 14:59) [29]
> Итоги сначала посчитать надо

Серьезно ?! Я думал, они как-то сами считаются, от силы мысли.
Для этого и существуют вычисляемые поля. и все телодвижения сведутся к ОДНОМУ циклу в OnCalcField для мастера. что-то типа:

procedure TForm1.MasterCalcFields(DataSet: TDataSet);
var
Count,
Key : Integer;
Sum : Double;
begin
Key := DataSet.FieldByName("KEY_FIELD").AsInteger;
Count :=0;
Sum := 0;
while not Detail.EOF do
 begin
   Sum := Sum + Detail.FieldByName("CENA").AsFloat;
  Inc(Count);
 end;
 DataSet.FieldByName("COUNT_FIELD").AsInteger := Count;
 DataSet.FieldByName("SUMMA_FIELD").AsFloat := Sum;

end;



 
zorik ©   (2006-07-20 17:45) [31]

если через TQuery, то можно:

select "заказчик", "сюжет", count("сюжет"), sum("цена") from table
group by "заказчик", "сюжет"

если я правильно понял и если с парадоксом пройдет


 
zorik ©   (2006-07-20 17:54) [32]

а если через запросы (query), то вполне можно обойтись без написания кода. Создать два запроса. Первый выбирает заказчиков и сюжеты [31], он же считает количество и сумму, а второй через параметры отображает детали для выбраного заказчика и сюжета - номера плоскостей и цены. Отказывайся от Table!


 
Виталий Панасенко   (2006-07-20 18:17) [33]

procedure TForm1.MasterCalcFields(DataSet: TDataSet);
var
Count,
Key : Integer;
Sum : Double;
begin
Key := DataSet.FieldByName("KEY_FIELD").AsInteger;
Count :=0;
Sum := 0;
while not Detail.EOF do
begin
  Sum := Sum + Detail.FieldByName("CENA").AsFloat;
 Inc(Count);
 Detail.Next;
end;
DataSet.FieldByName("COUNT_FIELD").AsInteger := Count;
DataSet.FieldByName("SUMMA_FIELD").AsFloat := Sum;

end;



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

Форум: "Базы";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.046 c
1-1155143860
Handle
2006-08-09 21:17
2006.09.24
Вопрос про SysListView.


15-1157197093
Stexen
2006-09-02 15:38
2006.09.24
VC++ и дельфи


15-1157471193
Мефисто
2006-09-05 19:46
2006.09.24
Да, да. Провокация и баталии :) Amway - че за зверь?


3-1153308172
DmiSb
2006-07-19 15:22
2006.09.24
Не получается через ADO открыть *.dbf


1-1155302309
lorn
2006-08-11 17:18
2006.09.24
аналог TCrpe в 10 Сrystallreport





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