Страница 3 из 4
					
				
				Добавлено: 21 окт 2005, 11:40
				 3opkae Boka
				Весь исходник покажите. У меня 2000 записей, начинает работать сразу
			 
			
					
				
				Добавлено: 21 окт 2005, 11:42
				 3opkae Boka
				lschet.tabn /== sumvidop.tabn
НЕ надо делать этого. В самой Галактике такая конструкция запрещена. Она- то уж точно угробит выборку
 
			 
			
					
				
				Добавлено: 21 окт 2005, 11:59
				 s2176
				Я так и не делаю... а весь исходник есть в форуме.
только без lschet...
я добавляю lschet и комментирую все внутренности(кроме самой вьюхи)... виснет
			 
			
					
				
				Добавлено: 21 окт 2005, 12:16
				 3opkae Boka
				попробуйте воспользоваться моей логической таблицей и моим обходом без изменений. У меня по sumvidop 2315 запсией достаточно быстро пролетает
			 
			
					
				
				Добавлено: 21 окт 2005, 12:53
				 s2176
				так у меня не 2315, а 25000 записей...
попробую еще раз
			 
			
					
				
				Добавлено: 21 окт 2005, 13:05
				 3opkae Boka
				НЕ поленитесь выложите весь исходник еще раз , с моими вставками
			 
			
					
				
				Добавлено: 21 окт 2005, 13:12
				 3opkae Boka
				29090 около одной минуты.
Так что давайте ваш исходник /в обязательном порядке/, будем глядеть
			 
			
					
				
				Добавлено: 21 окт 2005, 14:05
				 s2176
				interface Nach_Or '' escclose;
file f_txt;
var d1:date
    nrec_pers, tmp_nrec_pers, ttt: comp;
    _mvz, _stroka, kompan, _kau, _bklass, _sschet: string;
Table Struct tab_mvz
(
   schet       : string,
   subschet    : string,
   KAU         : string,
   MVZ         : string,
   BKLASS      : string,
   SUMMA       : double
)
With INDEX
(
   ind1 = schet+subschet+kau+mvz+bklass
);
create view 
var dd,mm,yy: word;
as select * 
from sumvidop,appointments,EXCLASSSEG,CATALOGS,SPKAU 
where((lschet.cex==sumvidop.cex and lschet.tabn==sumvidop.tabn 
       and yy==sumvidop.yearn and mm==sumvidop.mesn
       and 12==exclassval.classcode and 15010==exclassval.wtable and klvidopl.nrec==exclassval.crec
       and exclassval.cclassseg==exclassseg.nrec
/*       and sumvidop.ckaud[1]==spkau.nrec and sumvidop.vidopl==klvidopl.vidopl 
       and department==catalogs.nrec and nrec_pers==person and date(dd,mm,yy)>>=appointments.appointdate
       and (date(1,mm,yy)<=appointments.dismissdate or date(0,0,0)=appointments.dismissdate)
*/     )) and '+'=klvidopl.vhv
;
screen Sc1
fields
 yy: Noprotect;
 mm: Noprotect;
buttons
 cmOK, default;
<<'Введите год и месяц'
    Год:   .@@@@@
    месяц: .@@@
    
                    <. OK .>
>>
end;
HandleEvent
cmInit :
 { f_txt.openfile('\\galaxy\galactic\ct_import\Jour_zar.txt',stCreate);
   yy:=year(cur_date()); mm:=month(cur_date()); dd:=last_day(date(1,mm,yy));
 }
cmOk:
 { var sum70: double;
   startNewVisual(vtNumericVisual,vfTimer,'закачиваю.....',1);
   tmp_nrec_pers:=0; sum70:=0;
   kompan:='01'
_loop lschet
{ /*if getfirst appointments where ((lschet.tperson == appointments.person 
                                   and date(dd,mm,yy) >>= appointments.appointdate 
                                 )) and (date(1,mm,yy) <= appointments.dismissdate 
                                         or date(0,0,0) = appointments.dismissdate 
                                        ) = tsOK 
   { ttt:=appointments.department;
     if getfirst catalogs where ((ttt == catalogs.nrec)) = tsOK 
        _mvz:=catalogs.code; 
     while(getnext appointments where ((lschet.tperson == appointments.person 
                                   and date(dd,mm,yy) >>= appointments.appointdate 
                                 )) and (date(1,mm,yy) <= appointments.dismissdate 
                                         or date(0,0,0) = appointments.dismissdate 
                                        ) = tsOK 
        do { if appointments.appointdate<date(16,mm,yy) 
               then { ttt:=appointments.department;
                      if getfirst catalogs where ((ttt == catalogs.nrec)) = tsOK 
                        _mvz:=catalogs.code; 
                    }
           }
   }*/ 
   _loop sumvidop 
   { nrec_pers:=sumvidop.tperson 
     if spkau.name<>'' 
       then _kau:=spkau.name
       else _kau:='_';
     if sumvidop.csubschd<>''
       then _sschet:=sumvidop.csubschd
       else _sschet:='_';
     if exclassseg.value<>''
       then _bklass:=exclassseg.value
       else _bklass:='_'
     sum70:=sum70+sumvidop.summa  
     if substr(sumvidop.cschetd,1,1)<>'2' _mvz:='_';
     if getfirst tab_mvz where((sumvidop.cschetd==tab_mvz.schet and 
                                _sschet==tab_mvz.subschet and
                                _kau==tab_mvz.KAU and
                                _mvz==tab_mvz.mvz and 
                                _bklass==tab_mvz.Bklass
                              )) = tsOk
       then { tab_mvz.summa:=tab_mvz.summa+sumvidop.summa; 
              update current tab_mvz;
            }
       else { tab_mvz.schet:=sumvidop.cschetd;
              tab_mvz.subschet:=_sschet;
              tab_mvz.KAU:=_kau;
              tab_mvz.mvz:=_mvz;
              tab_mvz.Bklass:=_bklass;
              tab_mvz.summa:=sumvidop.summa;
              insert current tab_mvz;
            };
     NextVisual();
   }
}
   stopVisual('',0);
   _loop tab_mvz
   { _stroka:='01'+'`'+string(date(dd,mm,yy))+'`'+kompan+'`'+tab_mvz.schet
     if(tab_mvz.subschet<>'_') _stroka:=_stroka+'`'+tab_mvz.subschet
       else _stroka:=_stroka+'`';
     if(tab_mvz.mvz<>'_') _stroka:=_stroka+'`'+tab_mvz.mvz
       else _stroka:=_stroka+'`';
     if(tab_mvz.bklass<>'_') _stroka:=_stroka+'`'+tab_mvz.bklass
       else _stroka:=_stroka+'`';
     if(tab_mvz.KAU<>'_') _stroka:=_stroka+'`'+tab_mvz.KAU
       else _stroka:=_stroka+'`';
!_stroka:=_stroka+'`'+tab_mvz.vop;
     _stroka:=_stroka+'`'+doubletostr(tab_mvz.summa,'[|-]3666666666667.88')
     f_txt.writeln(_stroka)
   }
   _stroka:='01'+'`'+string(date(dd,mm,yy))+'`'+kompan+'`'+'70'+'`````'+doubletostr(-sum70,'[|-]3666666666667.88')
   f_txt.writeln(_stroka)
   f_txt.Close;
   message('все')
 }
end;
end.
Работает ничуть не быстрее, чем без lschet. А кусок в начале цикла 
по lschet закомментирован, потому, что компилятор ругается на преобразование типов... пока не разобралась...
			 
			
					
				
				Добавлено: 21 окт 2005, 14:29
				 3opkae Boka
				.........
mm,yy)>>=appointments.appointdate 
and (date(1,mm,yy)<=appointments.dismissdate or date(0,0,0)=appointments.dismissdate) 
*/ )) 
Этой строки быть не должно: and '+'=klvidopl.vhv
она и рубит. Проще проверять
внутри sumvidop, как я и писал.
А так, не исключено что всю выборку колбасить будет 

 
			 
			
					
				
				Добавлено: 21 окт 2005, 14:50
				 s2176
				Ну уже все так сделала, а все равно не ускоряется((((
			 
			
					
				
				Добавлено: 21 окт 2005, 15:58
				 WiRuc
				Попробуйте во так:
Код: Выделить всё
.Form 'SPV_SQL'
.ARD
.NameInList 'СПВ-SQL'
.var
  nrec : comp;
  time_start, time_end: time;
.endvar
.create view v_opl
var yy:integer; mm: word; date_first,date_last,date_empty:date
as select sumvidop.tperson, sumvidop.cschetd, sumvidop.csubschd, sumvidop.summa, spkau.name, exclassseg.value, appointments.appointdate, catalogs.code
from sumvidop (ReadOnly),
     klvidopl (ReadOnly),
     exclassval (ReadOnly),
     exclassseg (ReadOnly),
     spkau (ReadOnly),
     appointments (ReadOnly),
     catalogs (ReadOnly)
where ((
  yy == sumvidop.yearn and
  mm == sumvidop.mesn and
  sumvidop.vidopl /== klvidopl.vidopl and
  '+' /== klvidopl.vhv (noindex) and
  klvidopl.nrec == exclassval.crec and
  word(12) == exclassval.classcode and
  exclassseg.nrec == exclassval.cclassseg and
  sumvidop.ckaud[1] == spkau.nrec and
  sumvidop.tperson == appointments.person and
  date_last >>= appointments.appointdate and
  (appointments.dismissdate = date_empty or appointments.dismissdate >= date_first) and
  appointments.department == catalogs.nrec ))
;
.fields
  TimeToStr(time_start, 'HH:MM:SS')
  v_opl.tperson
  v_opl.summa
  v_opl.value
  v_opl.name
  v_opl.appointdate
  v_opl.code
  TimeToStr(time_end, 'HH:MM:SS')
  TimeToStr(sub_time(time_end,time_start), 'HH:MM:SS')
.endfields
.begin
yy:=year(date(1,1,2005)); mm:=month(date(1,1,2005)); date_first := date(1,mm,yy); date_last:=last_day(date_first); date_empty := date(0,0,0);
time_start := cur_time();
end.
@@@@@@@@@@@@@@@@@@@@@@@@@
.{table v_opl
  @@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@@
.}
.begin
time_end := cur_time();
end.
@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@
.endform                              
 
			 
			
					
				
				Добавлено: 21 окт 2005, 16:20
				 WiRuc
				Второй вариант таков:
Делаем 3 временные таблицы и 3 логических view.
1 view
create view v_klvidopl
as select klvidopl.vidoplp, exclassseg.value
from klvidopl (ReadOnly), 
     exclassval (ReadOnly), 
     exclassseg (ReadOnly)
where (( 
  '+' == klvidopl.vhv (noindex) and 
  klvidopl.nrec == exclassval.crec and
  word(12) == exclassval.classcode and
  exclassseg.nrec == exclassval.cclassseg ));
Проходим по вьюхе и наполняем 1 временную таблицу tmpKlvidopl полями vidoplp и связанным exclassseg. 
2 view
create view v_appoint
as select appointments.person,appointments.appointdate, catalogs.code
from appointments (ReadOnly),
     catalogs (ReadOnly)
where ((
  date_last >>= appointments.appointdate (noindex) and
  (appointments.dismissdate = date_empty or appointments.dismissdate >= date_first) and
  appointments.department == catalogs.nrec ))
Проходим по вьюхе и наполняем 2 временную таблицу tmpAppoint полями person,appointdate,code
3 view
create view v_opl
var yy:integer; mm: word; date_first,date_last,date_empty:date
as select sumvidop.tperson, sumvidop.cschetd, sumvidop.csubschd, sumvidop.summa, spkau.name, tmpKlvidopl.value, tmpAppoint.appointdate, tmpAppoint.code
from sumvidop (ReadOnly),
     spkau (ReadOnly),
     tmpKlvidopl (ReadOnly),
     tmpAppoint (ReadOnly)
where ((
  yy /== sumvidop.yearn and
  mm /== sumvidop.mesn and
  tmpKlvidopl.vidoplp /== sumvidop.vidoplp
  sumvidop.ckaud[1] == spkau.nrec and
  sumvidop.tperson == tmpAppoint.person ));
Проходим по 3 вьюхе и наполняем итоговую временную таблицу.
			 
			
					
				
				Добавлено: 21 окт 2005, 16:34
				 3opkae Boka
				!!!!!!!!!!! Закомментарено условие по датам
interface Nach_Or '' escclose;
file f_txt;
var d1:date
nrec_pers, tmp_nrec_pers, ttt: comp;
_mvz, _stroka, kompan, _kau, _bklass, _sschet: string;
Table Struct tab_mvz
(
schet : string,
subschet : string,
KAU : string,
MVZ : string,
BKLASS : string,
SUMMA : double
)
With INDEX
(
ind1 = schet+subschet+kau+mvz+bklass
);
create view
var dd,mm,yy: word;
as select *
from sumvidop,appointments,EXCLASSSEG,CATALOGS,SPKAU
where
((
      lschet.cex           == sumvidop.cex
  and lschet.tabn          == sumvidop.tabn
//  and yy                   == sumvidop.yearn
//  and mm                   == sumvidop.mesn
  and sumvidop.ckaud[1]    == spkau.nrec
  and sumvidop.vidopl      == klvidopl.vidopl
  and 12                   == exclassval.classcode
  and 15010                == exclassval.wtable
  and klvidopl.nrec        == exclassval.crec
  and exclassval.cclassseg == exclassseg.nrec
 ))
;
screen Sc1
fields
yy: Noprotect;
mm: Noprotect;
buttons
cmOK, default;
<<'Ââåäèòå ãîä è ìåñÿö'
Ãîä: .@@@@@
ìåñÿö: .@@@
<. OK .>
>>
end;
HandleEvent
cmInit :
{ f_txt.openfile('c:\Jour_zar.txt',stCreate);
yy:=year(cur_date()); mm:=month(cur_date()); dd:=last_day(date(1,mm,yy));
}
cmOk:
{ var sum70: double;
startNewVisual(vtNumericVisual,vfTimer,'çàêà÷èâàþ.....',1);
tmp_nrec_pers:=0; sum70:=0;
kompan:='01'
_loop lschet
{
  ttt := 0;
  if getfirst appointments where ((  lschet.tperson == appointments.person
                                 and date(dd,mm,yy) >>= appointments.appointdate
                                 and
                                 (  date(1,mm,yy) <= appointments.dismissdate
                                 or date(0,0,0) = appointments.dismissdate
                                 )
                                 ))
                                 = tsOK
  {
    ttt:=appointments.department;
    do
      if appointments.appointdate<date(16,mm,yy)
        ttt:=appointments.department;
    while  getnext appointments where ((  lschet.tperson == appointments.person
                                   and date(dd,mm,yy) >>= appointments.appointdate
                                   and
                                   (
                                     date(1,mm,yy) <= appointments.dismissdate
                                  or date(0,0,0) = appointments.dismissdate
                                  )
                                   ))
                                  = tsOK
  }
  if getfirst catalogs where ((ttt == catalogs.nrec)) = tsOK
    _mvz:=catalogs.code;
  _loop sumvidop
  {
    SetVisualHeader(klvidopl.nvidopl);
    NextVisual;
//    if klvidopl.vhv = '-'
//      continue;
    nrec_pers:=sumvidop.tperson
    _kau    := if(trim(spkau.name)<>'', spkau.name, '_');
    _sschet := if(trim(sumvidop.csubschd)<>'', sumvidop.csubschd, '_');
    _bklass := if(trim(exclassseg.value)<>'', exclassseg.value, '_');
    sum70   := sum70 + sumvidop.summa;
    if substr(sumvidop.cschetd,1,1) <> '2'
      _mvz:='_';
    if getfirst tab_mvz where((
                                 sumvidop.cschetd == tab_mvz.schet
                             and _sschet          == tab_mvz.subschet
                             and _kau             == tab_mvz.KAU
                             and _mvz             == tab_mvz.mvz
                             and _bklass          == tab_mvz.Bklass
                             )) = tsOk
    {
      tab_mvz.summa:=tab_mvz.summa+sumvidop.summa;
      update current tab_mvz;
    }
    else
    {
      tab_mvz.schet:=sumvidop.cschetd;
      tab_mvz.subschet:=_sschet;
      tab_mvz.KAU:=_kau;
      tab_mvz.mvz:=_mvz;
      tab_mvz.Bklass:=_bklass;
      tab_mvz.summa:=sumvidop.summa;
      insert current tab_mvz;
    };
  }
}
stopVisual('',0);
  _loop tab_mvz
  { _stroka:='01'+'`'+string(date(dd,mm,yy))+'`'+kompan+'`'+tab_mvz.schet
  if(tab_mvz.subschet<>'_') _stroka:=_stroka+'`'+tab_mvz.subschet
  else _stroka:=_stroka+'`';
  if(tab_mvz.mvz<>'_') _stroka:=_stroka+'`'+tab_mvz.mvz
  else _stroka:=_stroka+'`';
  if(tab_mvz.bklass<>'_') _stroka:=_stroka+'`'+tab_mvz.bklass
  else _stroka:=_stroka+'`';
  if(tab_mvz.KAU<>'_') _stroka:=_stroka+'`'+tab_mvz.KAU
  else _stroka:=_stroka+'`';
//  _stroka:=_stroka+'`'+tab_mvz.vop;
  _stroka:=_stroka+'`'+doubletostr(tab_mvz.summa,'[|-]3666666666667.88')
  f_txt.writeln(_stroka)
  }
  _stroka:='01'+'`'+string(date(dd,mm,yy))+'`'+kompan+'`'+'70'+'`````'+doubletostr(-sum70,'[|-]3666666666667.88')
  f_txt.writeln(_stroka)
  f_txt.Close;
  message('âñå')
}
end;
end.
			 
			
					
				
				Добавлено: 21 окт 2005, 16:34
				 s2176
				а как в интерфейсе можно сделать 3 вьюхи???
			 
			
					
				
				Добавлено: 21 окт 2005, 16:51
				 s2176
				пятница, пора домой.... у нас уже 6 часов.
Последнее от 3opkae Boka не успею уже проверить.
Спасибо всем))))) до понедельника