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;


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

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;


zorik   (2006-07-20 17:54:00) [2]

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


zorik   (2006-07-20 17:45:00) [3]

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

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

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


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


> 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;


barakuda   (2006-07-20 14:59:00) [5]

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


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

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

мастер
Макинфо  МАЛЬБОРО     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:34:00) [7]

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


barakuda   (2006-07-20 14:09:00) [8]

почему 5*100.

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


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

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


barakuda   (2006-07-20 13:56:00) [10]

Допустим рекламное агентство Макинфо разместила сюжет МАЛЬБОРО на пяти разных плоскостях - кол-во плоскост = 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 13:56:00) [11]

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


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


> А где цены?

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


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

какие цены


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


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


А где цены?


barakuda   (2006-07-20 13:31:00) [15]

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


barakuda   (2006-07-20 13:26:00) [16]

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


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

Query1 ПОМОЖЕТ


barakuda   (2006-07-20 13:15:00) [18]

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


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


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

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


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

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

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

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

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

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

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

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

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


Страницы:   1 2

Наверх

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