Форум: "Базы";
Текущий архив: 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<>"Ðåçåðâ" 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