Страница 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 не успею уже проверить.
Спасибо всем))))) до понедельника