Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как увеличить скорость перехода на сл. строку 
:(
    Опции темы
dikiy
Дата 3.5.2006, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



Есть бд из которой делаю три запроса и при проходе первого на следующую строку фильтрую сначала первый, прохожу его в цикле , потом второй получаются страшные тормоза. Посоветуйте что-нибудь буду признателен. 
PM MAIL   Вверх
Savek
Дата 3.5.2006, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Сколько строк во втором запросе?
Что делается в цикле?
Прежде чем пройти в цикле DisableControls делаешь?
 А вообще может быстрее вытащить результат select - ом, а не вычислять его в цикле?

 
PM MAIL   Вверх
dikiy
Дата 3.5.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



Цитата(Savek @  3.5.2006,  14:27 Найти цитируемый пост)
Прежде чем пройти в цикле DisableControls делаешь?


Это что за зверь?
тут вобщем так, я делаю расчет больничого за 12 мес. в первом запросе фио и таб № во втором суммы в третьем- часы беру из первого человека и делаю цикл на 12 проходов. У каждого чел. во втором зап-се разное кол-во записей Да вот код smile 
Код


for j:=1 to query1.RecordCount do
begin
//m:=query1.FieldValues['month'];
 QUERY2.FIRST;


 fio:=query1.FieldValues['surname']+' '+query1.FieldValues['firstname']+' '
 +query1.FieldValues['secondname'];
 rn1:= query1.FieldValues['his_rn'] ;
 rn2:= query1.FieldValues['hisgr_rn'] ;
 tab:=query1.FieldValues['tab_num'];
 mm:=query1.FieldValues['monthfor']+12;
  FOR I:=0 TO 12 DO PREM[I]:=0;
  FOR I:=0 TO 12 DO ZARPL[I]:=0;
 for i:=1 to 12 do
 begin
 m:=mONTH[I];
 QUERY3.ACTIVE:=FALSE;
 query3.Params[0].Asinteger:=god[I];
 query3.Params[1].Asinteger:=M;
 query3.Params[2].Asinteger:=NUM;
 query3.Filter:='tab_num='''+tab+'''';
 QUERY3.ACTIVE:=TRUE;
  QUERY3.FIRST;
    for h:=1 to query3.RecordCount do
  begin
 formula:=query3.FieldValues['formula'];
  sum:=query3.FieldValues['sum'];
 if (pos('/',formula)>0) OR (pos('\',formula)>0) then prem[I]:=prem[I]+sum
 else zarpl[I]:=zarpl[I]+sum;
   query3.next;
 end;

   kod1:=inttostr(m)+'KI';
 if length(kod1)=3 then kod1:='0'+kod1;
 kod2:=inttostr(m)+'FP';
 if length(kod2)=3 then kod2:='0'+kod2;
 kod3:=inttostr(m)+'NP';
 if length(kod3)=3 then kod3:='0'+kod3;
 query2.Filter:='his_rn='''+query1.FieldValues['his_rn']+''' AND (CODE='''+KOD1+''' OR CODE='''+KOD2+''' OR CODE='''+KOD3+''')';


 for hh:=1 to query2.RecordCount do
 begin

 //QUERY2.Filter:=
    text:= query2.FieldValues['value'];
 mystr(text);
 IF pos('KI',QUERY2.FIELDVALUES['CODE'])>0 THEN INDEX[M]:=STR;
 IF pos('NP',QUERY2.FIELDVALUES['CODE'])>0 THEN NORMA[M]:=STR;
 IF pos('FP',QUERY2.FIELDVALUES['CODE'])>0 THEN FAKT[M]:=STR;
 query2.next;
   end;
  end;

 
PM MAIL   Вверх
Vit
Дата 3.5.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Тексты запросов в студию! Подсказка - с вероятностью 99% там циклы не нужны 


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
dikiy
Дата 3.5.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



Первый запрос создается динамически
Код

form1.Query1.Active:=false;
form1.Query1.SQL.Clear;
form1.Query1.SQL.Add('select tab_num,surname,firstname,secondname,zsnu.num,'
+'zsnu.code,sum,acatalog.rn,zhis.hisgr_rn,zhis.his_rn,month,monthfor,year');
form1.Query1.SQL.Add('from zhis,zsnu,zfcac,acatalog,person,zank');
form1.Query1.SQL.Add('where zhis.snu_rn=zsnu.snu_rn and zhis.ank_rn=zfcac.ank_rn');
form1.Query1.SQL.Add('and zhis.ank_rn=zank.ank_rn');
form1.Query1.SQL.Add('and zank.orgbase_rn=person.orbase_rn');
form1.Query1.SQL.Add('and zfcac.catalog_rn=acatalog.rn');
form1.Query1.SQL.Add('and year=:god and month=:mes');
form1.Query1.SQL.Add('and zfcac.enddate=:end');
form1.Query1.SQL.Add('and '+otd+'');
form1.Query1.SQL.Add('and '+vip+'');
form1.Query1.SQL.Add('order by surname');
form1.Query1.Params[0].AsInteger:=strtoint(form1.Edit1.Text);
form1.Query1.Params[1].AsInteger:=form1.ComboBox1.ItemIndex+1;
form1.Query1.Params[2].AsDate:=strtodate('31.12.8888');
form1.Query1.Active:=true;


Второй запрос
Код

select code,value,his_rn from zhissp
WHERE CODE='01KI' OR CODE='02KI' OR CODE='03KI' OR CODE='04KI'
OR CODE='05KI' OR CODE='06KI' OR CODE='07KI' OR CODE='08KI' 
OR CODE='09KI' OR CODE='10KI' OR CODE='11KI' OR CODE='12KI' 
OR CODE='01NP' OR CODE='02NP' OR CODE='03NP' OR CODE='04NP'
OR CODE='05NP' OR CODE='06NP' OR CODE='07NP' OR CODE='08NP' 
OR CODE='09NP' OR CODE='10NP' OR CODE='11NP' OR CODE='12NP' 
OR CODE='01FP' OR CODE='02FP' OR CODE='03FP' OR CODE='04FP'
OR CODE='05FP' OR CODE='06FP' OR CODE='07FP' OR CODE='08FP' 
OR CODE='09FP' OR CODE='10FP' OR CODE='11FP' OR CODE='12FP' 

Третий 
Код

elect tab_num,sum,zsnusp.formula from zhis,zsnu,zsnubs,zank,zsnusp
where zhis.snu_rn=zsnu.snu_rn
and zsnu.snu_rn=zsnusp.snu_rn
and zank.ank_rn=zhis.ank_rn
and zsnubs.snubs_rn=zsnusp.snubs_rn
and (zsnubs.num_snubS=18 OR zsnubs.num_snubS=1 OR zsnubs.num_snubS=25)
and sum in(formula='/')
and year=:god
and month=:mes
and zsnubs.num_snubs=:NUM
and zsnusp.formula<>''
order by tab_num


а циклы я использую для того, чтобы во первых: выбрать 12 месяцев предшествующие текущему во вторых чтобы отобрать отдельно зарплату и премию

 
PM MAIL   Вверх
Vit
Дата 3.5.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Какая база данных? 


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
dikiy
Дата 4.5.2006, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



Цитата(Vit @  3.5.2006,  16:00 Найти цитируемый пост)
Какая база данных?  

 DBC - фоксовая 
PM MAIL   Вверх
Vit
Дата 4.5.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 14
Всего: 207



Плохо дело... сфоксом много не наделаешь... текс, похоже единственный способ - использование таблиц в памяти (если количество данных имеет разумные размеры - не больше десятка метров в сумме). Устанавливайте RxLib, там есть RxMemoryData компонент, у него есть метод загрузки данных из запроса, а потом гоняйте этот компонент вместо запроса. Если же запрос возвращает очень много данных - единственный нормальный путь - двигаться в сторону сервера и переносить бизнес логику на сервер 


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
dikiy
Дата 4.5.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 23.6.2005

Репутация: нет
Всего: нет



Спасибо попрообую поработать с RxLib может прокатит smile  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1060 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.