Быстродействие формирования отчета
Модераторы: m0p3e, edward_K, Модераторы
Быстродействие формирования отчета
Добрый день!
Написала отчет, в котором используются временные таблицы в памяти (5 шт), данных в две временные таблицы выгружается много ~15000 записей.
Заметила такой нюанс, что если в Галактике не открыто никакого интерфейса, то отчет формируется 7 минут. А если в Галактике открыт какой-нибудь интерфейс и я запускаю этот отчет, то он формируется в несколько раз медленее (больше часа).
Почему так происходит? Что-то неправильно запрограммировано? Или неправильно используются временные таблицы? Где копать?
Написала отчет, в котором используются временные таблицы в памяти (5 шт), данных в две временные таблицы выгружается много ~15000 записей.
Заметила такой нюанс, что если в Галактике не открыто никакого интерфейса, то отчет формируется 7 минут. А если в Галактике открыт какой-нибудь интерфейс и я запускаю этот отчет, то он формируется в несколько раз медленее (больше часа).
Почему так происходит? Что-то неправильно запрограммировано? Или неправильно используются временные таблицы? Где копать?
Наверное дело в том, что я все делаю интерфейсами (даже просто функцию, которая не требует никакого интерфейса), поэтому каждый раз при вызове интерфейса идет перерисовка окна, которое было открыто еще до запуска моего интерфейса. Постоянное мелькание.
Решила переделать эти интерфейсы в процедуры. И не могу откомпилировать: выдается ошибка: нет такого метода, поля....
Например, написала простую процедуру и вставила это добро в ard-отчет:
PROCEDURE hope(i1:Word; i2:Word; i3:Word)
BEGIN
i1:=1;
i2:=2;
i3:=3;
END;
.begin
hope(flag_an1, flag_an2, flag_an3); - здесь ругается
message('flag_an1='String(flag_an1));
message('flag_an2='String(flag_an2));
message('flag_an3='String(flag_an3));
end.
Ругается на строку вызова процедуры.
Что я делаю неправильно?
Решила переделать эти интерфейсы в процедуры. И не могу откомпилировать: выдается ошибка: нет такого метода, поля....
Например, написала простую процедуру и вставила это добро в ard-отчет:
PROCEDURE hope(i1:Word; i2:Word; i3:Word)
BEGIN
i1:=1;
i2:=2;
i3:=3;
END;
.begin
hope(flag_an1, flag_an2, flag_an3); - здесь ругается
message('flag_an1='String(flag_an1));
message('flag_an2='String(flag_an2));
message('flag_an3='String(flag_an3));
end.
Ругается на строку вызова процедуры.
Что я делаю неправильно?
Попробовала вставить abort - перестало возвращаться значение НДС.
вот текст моего интерфейса. Его вызывает другой интерфейс...
Как только раскомментировала abort - перестало возвращаться значение НДС.
INTERFACE stavka_nds 'Поиск ставки НДС' DoAccept,EscClose, CYAN;
SHOW AT (20,5,60,10);
CREATE VIEW N2
VAR
MyMcNrec:Comp; // KatMc.Nrec товара
my_st_nds:Double; // ставка НДС
AS SELECT *
FROM KatMc, GrNal, SpGrNal, KatNalog
WHERE (( MyMcNrec==KatMc.Nrec
and KatMc.cGrNal==GrNal.Nrec //
and GrNal.Nrec==SpGrNal.cGrNal //
and KatNalog.Nrec==SpGrNal.cNalog //
))
and 'NDS'=KatNalog.Kod
and Cur_Date<=SpGrNal.NalD2 //
and Cur_Date>=SpGrNal.NalD1 //
;
PARAMETERS MyMcNrec, my_st_nds;
HANDLEEVENT
cmInit:
{
!message('зашли в интерфейс');
// цикл по позициям прайса
if (modifier GetFirst KatMc=tsok)
{
! message('ищем ставку налога - нашли МЦ ');
if (modifier GetFirst GrNal=tsok)
{
! message('ищем ставку налога - нашли группу налогов ');
if (modifier GetFirst SpGrNal=tsok)
! do
{
my_st_nds:=SpGrNal.Nalog;
! message('нашли ставку налога МЦ '+String(my_st_nds) );
}
! While (modifier getNext SpGrNal=tsok)
}
}
!message('Сделала')
CloseInterFace(cmDefault);
Stop;
!abort;
}
end; // HandleEvent
end. // interface
Не понимаю я чего-то....
вот текст моего интерфейса. Его вызывает другой интерфейс...
Как только раскомментировала abort - перестало возвращаться значение НДС.
INTERFACE stavka_nds 'Поиск ставки НДС' DoAccept,EscClose, CYAN;
SHOW AT (20,5,60,10);
CREATE VIEW N2
VAR
MyMcNrec:Comp; // KatMc.Nrec товара
my_st_nds:Double; // ставка НДС
AS SELECT *
FROM KatMc, GrNal, SpGrNal, KatNalog
WHERE (( MyMcNrec==KatMc.Nrec
and KatMc.cGrNal==GrNal.Nrec //
and GrNal.Nrec==SpGrNal.cGrNal //
and KatNalog.Nrec==SpGrNal.cNalog //
))
and 'NDS'=KatNalog.Kod
and Cur_Date<=SpGrNal.NalD2 //
and Cur_Date>=SpGrNal.NalD1 //
;
PARAMETERS MyMcNrec, my_st_nds;
HANDLEEVENT
cmInit:
{
!message('зашли в интерфейс');
// цикл по позициям прайса
if (modifier GetFirst KatMc=tsok)
{
! message('ищем ставку налога - нашли МЦ ');
if (modifier GetFirst GrNal=tsok)
{
! message('ищем ставку налога - нашли группу налогов ');
if (modifier GetFirst SpGrNal=tsok)
! do
{
my_st_nds:=SpGrNal.Nalog;
! message('нашли ставку налога МЦ '+String(my_st_nds) );
}
! While (modifier getNext SpGrNal=tsok)
}
}
!message('Сделала')
CloseInterFace(cmDefault);
Stop;
!abort;
}
end; // HandleEvent
end. // interface
Не понимаю я чего-то....
-
- Заслуженный деятель интернет-сообщества
- Сообщения: 5188
- Зарегистрирован: 29 мар 2005, 17:49
- Откуда: SPB galaxy spb
INTERFACE stavka_nds 'Поиск ставки НДС' alwaysReturn ;
попробуйте. можно еще добавить в конец cacheable
А вообще нужно бы почитать vipprog.chm и уже научиться писать объектные фейсы - вы ж кучу времени тратите на его иниализацию.
Использование процедур функций в форме тоже выход, но раз напиcанный объектный фейс можно использовать в любом месте, и для исправления достаточно пересобрать тока его, а вот формы придется подправлять и перекомпилять все при изменениий процедур(чуть спасет дело #include). Будете делать в форме доп.таблы перенесите в отдельную вьюху.
попробуйте. можно еще добавить в конец cacheable
А вообще нужно бы почитать vipprog.chm и уже научиться писать объектные фейсы - вы ж кучу времени тратите на его иниализацию.
Использование процедур функций в форме тоже выход, но раз напиcанный объектный фейс можно использовать в любом месте, и для исправления достаточно пересобрать тока его, а вот формы придется подправлять и перекомпилять все при изменениий процедур(чуть спасет дело #include). Будете делать в форме доп.таблы перенесите в отдельную вьюху.
Как я понимаю, медленно было потому, что в цикле вызывался другой интерфейс?hope писал(а):вот текст моего интерфейса. Его вызывает другой интерфейс...
Не обязательно в этом случае все переделывать на процедуры. Например, если эти процедуры могут многократно использоваться из других мест, можно загнать их в объектный интерфейс. Разница в том, что его можно открыть один раз до цикла и после цикла закрыть, а в цикле будет только вызов его процедур. Это будет во много раз быстрее.