Loop

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

3opkae Boka
Сообщения: 18
Зарегистрирован: 06 окт 2005, 13:12

Сообщение 3opkae Boka »

Весь исходник покажите. У меня 2000 записей, начинает работать сразу
3opkae Boka
Сообщения: 18
Зарегистрирован: 06 окт 2005, 13:12

Сообщение 3opkae Boka »

lschet.tabn /== sumvidop.tabn
НЕ надо делать этого. В самой Галактике такая конструкция запрещена. Она- то уж точно угробит выборку
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Сообщение s2176 »

Я так и не делаю... а весь исходник есть в форуме.
только без lschet...
я добавляю lschet и комментирую все внутренности(кроме самой вьюхи)... виснет
3opkae Boka
Сообщения: 18
Зарегистрирован: 06 окт 2005, 13:12

Сообщение 3opkae Boka »

попробуйте воспользоваться моей логической таблицей и моим обходом без изменений. У меня по sumvidop 2315 запсией достаточно быстро пролетает
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Сообщение s2176 »

так у меня не 2315, а 25000 записей...
попробую еще раз
Кто сказал, что бесполезно биться головой об стену?!
3opkae Boka
Сообщения: 18
Зарегистрирован: 06 окт 2005, 13:12

Сообщение 3opkae Boka »

НЕ поленитесь выложите весь исходник еще раз , с моими вставками
3opkae Boka
Сообщения: 18
Зарегистрирован: 06 окт 2005, 13:12

Сообщение 3opkae Boka »

29090 около одной минуты.
Так что давайте ваш исходник /в обязательном порядке/, будем глядеть
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Сообщение 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 закомментирован, потому, что компилятор ругается на преобразование типов... пока не разобралась...
3opkae Boka
Сообщения: 18
Зарегистрирован: 06 окт 2005, 13:12

Сообщение 3opkae Boka »

.........
mm,yy)>>=appointments.appointdate
and (date(1,mm,yy)<=appointments.dismissdate or date(0,0,0)=appointments.dismissdate)
*/ ))
Этой строки быть не должно: and '+'=klvidopl.vhv
она и рубит. Проще проверять
внутри sumvidop, как я и писал.

А так, не исключено что всю выборку колбасить будет :-)
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Сообщение s2176 »

Ну уже все так сделала, а все равно не ускоряется((((
Кто сказал, что бесполезно биться головой об стену?!
WiRuc
Местный житель
Сообщения: 414
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж

Сообщение 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                              
WiRuc
Местный житель
Сообщения: 414
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Воронеж

Сообщение 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 вьюхе и наполняем итоговую временную таблицу.
3opkae Boka
Сообщения: 18
Зарегистрирован: 06 окт 2005, 13:12

Сообщение 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.
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Сообщение s2176 »

а как в интерфейсе можно сделать 3 вьюхи???
Кто сказал, что бесполезно биться головой об стену?!
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Сообщение s2176 »

пятница, пора домой.... у нас уже 6 часов.
Последнее от 3opkae Boka не успею уже проверить.
Спасибо всем))))) до понедельника
Кто сказал, что бесполезно биться головой об стену?!
Ответить