Loop

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

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

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

Сообщение s2176 »

и это не подходит, т.к. в persons.department лежит текщее назначение, а мне нужно то назаначение, которое было в том месяце, за который я выбираю данные
Кто сказал, что бесполезно биться головой об стену?!
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

>Одному подразделению в ЗП соответствует несколько более мелких >из ШР с разными кодами(а именно коды из ШР мне и нужны). >Поэтому такой запрос не подходит.

ну и как же тогда вы будите группировать работников с таким подразделением ? к какой записи таблицы штатного расписания нужно будет соотнести того или иного работника. Если связт идет, как я понял 1:N
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Сообщение s2176 »

так вот иду я по таблице sumvidop, натыкаюсь на новый tabn. После этого иду в appointments, выбираю по этому человечку запись, которая была действенной в тот период (дата назначения <= 31/mm/yy...) из этой записи я и беру department. Все данные я записываю в промежуточную таблицу, там и накапливаю сумму. а потом итоговые данные из нее выгружаю в txt.
Кто сказал, что бесполезно биться головой об стену?!
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

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

Сообщение s2176 »

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

Стоило мне добавить ordered by tabn в loop, как условия, наложенные на таблицу Sumvidop в create view, перестали действовать.
А мне нужна не вся таблица, а только начисления за один месяц и с определенной входимостью (те, по которым формируются проводки)
Кто сказал, что бесполезно биться головой об стену?!
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

interface qwerty 'ляляляляля';
create view
var
yyy ,mmm :word

as select * from lschet
where ((lschet.nrec==sumvidop.clsch
and yyy==sumvidop.yearn
and mmm==sumvidop.mesn));


HandleEvent
CmInit : {
beg_date:=strtodate('DD/MM/YYYY',01'+string(mmm)+string(yyyy));
end_date:=sub_day(add_Months(beg_date),1);

_loop lschet
{
first:=1;
_loop sumvidop
{
if first=1
{
first:=0;
if getfirst appointments where ((sumvidop.tperson==appointmens.person
)) and
(end_date>=appointments.APPOINTDATE
and (appointments.DISMISSDATE=date(0,0,0)
or appointments.DISMISSDATE>end_date))
or
(
end_date>=appointments.APPOINTDATE
and (appointments.DISMISSDATE>=beg_date
and appointments.DISMISSDATE<=end_date)
)
{
если есть уже запись по такой структуре штатного расписания,
то позиционируемся на нее в temptable, иначе вставляем запись в temptable
}
}
cur_sum:=cur_sum+sumvidop.summa; //далее суммируем виды оплат нужные
}
update current temptable set totsum:=totsum+cur_sum; //totsum поле временной таблицы. Курсор стоит в ней на нужной записи...
}
}


....
Den
Местный житель
Сообщения: 1842
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Ярославская область ОАО "Часовой завод Чайка" г. Углич
Контактная информация:

Сообщение Den »

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

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

.FORM myForm
.ard
.create view v1
as select tperson, cschetd, csubschd, spkau.name, summa
from sumvidop svo
where
((
svo.vidopl==klvidopl.vidopl
and svo.ckaud[1]==spkau.nrec
and 2005 ==yearn
and 9==mesn
))
and
(
'+'=klvidopl.vhv
)
order external by tabn
;
.FIELDS
v1.svo.tabn
.ENDFIELDS

.{ table v1;
│&&&&&│
.}
.ENDFORM
вроде отсортировалось
s2176
Местный житель
Сообщения: 473
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Новосибирск

Сообщение s2176 »

Вот весь текст:
упростим задачу: надо ускорить!

interface Nach_Or '' escclose;
file f_txt;
var d1:date
nrec_pers, tmp_nrec_pers: 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//+vop
);
create view
var dd,mm,yy: word;
as select tperson, cschetd, csubschd, spkau.name, summa,
exclassseg.value, appointdate, catalogs.code
from sumvidop,appointments
where((sumvidop.vidopl==klvidopl.vidopl and exclassval.cclassseg==exclassseg.nrec
and 12==exclassval.classcode and 15010==exclassval.wtable and klvidopl.nrec==exclassval.crec
and sumvidop.ckaud[1]==spkau.nrec
and yy==yearn and mm==mesn
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
!order external by sumvidop.tperson
;
screen Sc1
fields
yy: Noprotect;
mm: Noprotect;
buttons
cmOK, default;

<<'Введите год и месяц'

Год: .@@@@@
месяц: .@@@

<. OK .>
>>
end;

HandleEvent
cmInit :
{ f_txt.openfile('\\galaxy\galactic\ct_import\nach.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 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 tmp_nrec_pers<>nrec_pers
{ if substr(sumvidop.cschetd,1,1)='2'
{ if getfirst appointments = tsOk
{ _mvz:=catalogs.code;
while(getnext appointments =tsOk)
do if appointments.appointdate<date(16,mm,yy) then _mvz:=catalogs.code;
};
}
else _mvz:='_';
tmp_nrec_pers:=nrec_pers;
}
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+'`'+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.
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

вариант тащится по SUMVIDOP16
where ((
lschet.cex == sumvidop.cex and lschet.tabn == sumvidop.tabn
and yy==sumvidop.yearn and mm==sumvidop.mesn
...........
))
// здесь не то тот случай чтоб таблу не указывать

_loop lschet
{ if getfirst appointments where .....
_loop sumvidop
{


}
}
чтоб лишний раз не лезь в назначения можете добавить
if getfirst sumvidop<>0 then continue ;
3opkae Boka
Сообщения: 18
Зарегистрирован: 06 окт 2005, 13:12

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

Вот кусок, который должен ускорить вашу работу
не очень хочется разбираться в деталях вашей задачи :
......
create view var
dd : word;
mm : word;
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
))
;
screen Sc1
fields
yy: Noprotect;
mm: Noprotect;
buttons
cmOK, default;

<<'...'

...: .@@@@@
...: .@@@

<. OK .>
>>
end;

HandleEvent
cmInit :
{ f_txt.openfile('\\galaxy\galactic\ct_import\nach.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.nrec == 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 ((
appointments.department == catalogs.nrec
)) = tsOK
//ваши действия с СЕШР

}
_loop sumvidop
if klvidopl.vhv <> ''
{
//Ваши действия с sumvidop
}

}

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

Сообщение s2176 »

честно говоря, я не очень понимаю, что происходит, но стоит мне добавить во вьюху таблицу lschet, как интерфейс начинает странно
себя вести... От момента выбора интерфейса до момента прорисовки картинки проходит минуты 3-4..... Гал-ка просто умирает.
Так что ускорение весьма сомнительное получается.
3opkae Boka
Сообщения: 18
Зарегистрирован: 06 окт 2005, 13:12

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

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

Сообщение s2176 »

Записей в lschet ~11000, но на самом деле работающих людей ~ 2500.
Просто в этом году наше предприятие разделилось на множество ООО, но людей мы не удалаяли, т.к. им еще могут быть какие-то выплаты.
Мой интерфейс работает около 5 минут, а если добавляю в запрос lschet, то не меньше 10 минут, причем он только на открытие тратит 3-4 минуты. Даже если я комментирую почти все внутренности интерфейса, то все равно получается долго... Для начислений меня и 5 минут устроит, но мне то же самое надо сделать и с налогами, а их раз в 6 больше....
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

добавте фильтр по дате увольнения
притом проследите чтобы в главной вьюхе не болталось не одной таблицы без фильтра или с фильтром по неиндексному условию
все где это нужно перенесите в отдельную или условия обработайте непосредственной в цикле.
+ поставте
lschet.tabn /== sumvidop.tabn
Ответить