![]() |
| ||
|
|
Новости |
Поиск |
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;
Виталий Панасенко (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