Страница 1 из 2

Быстродействие формирования отчета

Добавлено: 30 ноя 2006, 13:57
hope
Добрый день!

Написала отчет, в котором используются временные таблицы в памяти (5 шт), данных в две временные таблицы выгружается много ~15000 записей.
Заметила такой нюанс, что если в Галактике не открыто никакого интерфейса, то отчет формируется 7 минут. А если в Галактике открыт какой-нибудь интерфейс и я запускаю этот отчет, то он формируется в несколько раз медленее (больше часа).

Почему так происходит? Что-то неправильно запрограммировано? Или неправильно используются временные таблицы? Где копать?

Добавлено: 30 ноя 2006, 14:56
coolibin
Рекомендую сделать лог и посмотреть, на что время тратится. Было бы любопытно узнать - является ли такая медленная работа именно проблемой временных таблиц. Я думаю, скорее всего нет, и время тратится на что-то другое.
Индексов много у временных таблиц?

Добавлено: 30 ноя 2006, 15:33
hope
Наверное дело в том, что я все делаю интерфейсами (даже просто функцию, которая не требует никакого интерфейса), поэтому каждый раз при вызове интерфейса идет перерисовка окна, которое было открыто еще до запуска моего интерфейса. Постоянное мелькание.

Решила переделать эти интерфейсы в процедуры. И не могу откомпилировать: выдается ошибка: нет такого метода, поля....

Например, написала простую процедуру и вставила это добро в 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.

Ругается на строку вызова процедуры.

Что я делаю неправильно?

Добавлено: 30 ноя 2006, 15:50
hope
Откомпилировала - извиняюсь за тупые вопросы.

Попробую все переделать на процедуры.

Индексов у временных таблиц от 3 до 5.

Добавлено: 01 дек 2006, 08:01
hope
Я в правильном направлении?

Может быть можно как-то переделать интерфейс, чтобы у него окно не рисовалось?

Добавлено: 01 дек 2006, 08:18
Goblin
В cmInit у фейса вызов нужных процедур, а затем abort.
Фейс рисоваться не будет

Добавлено: 01 дек 2006, 10:04
hope
Попробовала вставить 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


Не понимаю я чего-то....

Добавлено: 01 дек 2006, 10:13
Vek
INTERFACE stavka_nds 'Поиск ставки НДС' DoAccept,EscClose, CYAN, AlwaysReturn;

Добавлено: 01 дек 2006, 10:18
edward_K
INTERFACE stavka_nds 'Поиск ставки НДС' alwaysReturn ;
попробуйте. можно еще добавить в конец cacheable
А вообще нужно бы почитать vipprog.chm и уже научиться писать объектные фейсы - вы ж кучу времени тратите на его иниализацию.
Использование процедур функций в форме тоже выход, но раз напиcанный объектный фейс можно использовать в любом месте, и для исправления достаточно пересобрать тока его, а вот формы придется подправлять и перекомпилять все при изменениий процедур(чуть спасет дело #include). Будете делать в форме доп.таблы перенесите в отдельную вьюху.

Добавлено: 01 дек 2006, 10:30
hope
Спасибо за помощь!
Доку уже читаю...

Добавлено: 01 дек 2006, 10:59
edward_K
да
забудьте про modifier
его использование как раз и приводит к перерисовке всех открытых окон, мож это иногда и полезно, но я таких случаев не помню.

Добавлено: 01 дек 2006, 11:54
coolibin
hope писал(а):вот текст моего интерфейса. Его вызывает другой интерфейс...
Как я понимаю, медленно было потому, что в цикле вызывался другой интерфейс?
Не обязательно в этом случае все переделывать на процедуры. Например, если эти процедуры могут многократно использоваться из других мест, можно загнать их в объектный интерфейс. Разница в том, что его можно открыть один раз до цикла и после цикла закрыть, а в цикле будет только вызов его процедур. Это будет во много раз быстрее.

Добавлено: 01 дек 2006, 12:41
hope
Спасибо Всем! Все получилось - теперь быстродействие не зависит от открытых окон.

Еще вопрос: я правильно понимаю, что если мой интерфейс не должен ничего отображать, соответственно он не должен ничего и обрабатывать и поэтому обработчик событий можно вообще исключить из интерфейса?

Добавлено: 01 дек 2006, 12:53
hope
Совешенно верно, Coolibin! У меня в цикле по МЦ вызывается поиск данных для МЦ (ставка налога, ед измерения, аналитика). Поэтому мелькание было постоянное.

А как открыть интерфейс один раз до цикла и закрыть интерфейс после цикла закрыть?

Добавлено: 01 дек 2006, 12:56
dp
А как открыть интерфейс один раз до цикла и закрыть интерфейс после цикла закрыть?
интерфейс должен быть объектным для этого. для них есть процедуры инициализации и закрытия.