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

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

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

hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

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

Сообщение hope »

Добрый день!

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

Почему так происходит? Что-то неправильно запрограммировано? Или неправильно используются временные таблицы? Где копать?
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

Рекомендую сделать лог и посмотреть, на что время тратится. Было бы любопытно узнать - является ли такая медленная работа именно проблемой временных таблиц. Я думаю, скорее всего нет, и время тратится на что-то другое.
Индексов много у временных таблиц?
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение 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.

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

Что я делаю неправильно?
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение hope »

Откомпилировала - извиняюсь за тупые вопросы.

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

Индексов у временных таблиц от 3 до 5.
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение hope »

Я в правильном направлении?

Может быть можно как-то переделать интерфейс, чтобы у него окно не рисовалось?
Goblin
Местный житель
Сообщения: 474
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Сибирь-матушка
Контактная информация:

Сообщение Goblin »

В cmInit у фейса вызов нужных процедур, а затем abort.
Фейс рисоваться не будет
Питаю патологические отвращение и ненависть в особо тяжелой и крайне запущенной формах к семейству программ Microsoft Business Solution !
Восславим господа Кришну за то, что у нас есть ГАЛАКТИКА !
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение 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


Не понимаю я чего-то....
Vek
Постоянный гость
Сообщения: 74
Зарегистрирован: 16 фев 2006, 13:11

Сообщение Vek »

INTERFACE stavka_nds 'Поиск ставки НДС' DoAccept,EscClose, CYAN, AlwaysReturn;
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

INTERFACE stavka_nds 'Поиск ставки НДС' alwaysReturn ;
попробуйте. можно еще добавить в конец cacheable
А вообще нужно бы почитать vipprog.chm и уже научиться писать объектные фейсы - вы ж кучу времени тратите на его иниализацию.
Использование процедур функций в форме тоже выход, но раз напиcанный объектный фейс можно использовать в любом месте, и для исправления достаточно пересобрать тока его, а вот формы придется подправлять и перекомпилять все при изменениий процедур(чуть спасет дело #include). Будете делать в форме доп.таблы перенесите в отдельную вьюху.
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение hope »

Спасибо за помощь!
Доку уже читаю...
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5187
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

да
забудьте про modifier
его использование как раз и приводит к перерисовке всех открытых окон, мож это иногда и полезно, но я таких случаев не помню.
coolibin
Постоянный обитатель
Сообщения: 151
Зарегистрирован: 29 мар 2005, 17:49

Сообщение coolibin »

hope писал(а):вот текст моего интерфейса. Его вызывает другой интерфейс...
Как я понимаю, медленно было потому, что в цикле вызывался другой интерфейс?
Не обязательно в этом случае все переделывать на процедуры. Например, если эти процедуры могут многократно использоваться из других мест, можно загнать их в объектный интерфейс. Разница в том, что его можно открыть один раз до цикла и после цикла закрыть, а в цикле будет только вызов его процедур. Это будет во много раз быстрее.
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение hope »

Спасибо Всем! Все получилось - теперь быстродействие не зависит от открытых окон.

Еще вопрос: я правильно понимаю, что если мой интерфейс не должен ничего отображать, соответственно он не должен ничего и обрабатывать и поэтому обработчик событий можно вообще исключить из интерфейса?
hope
Местный житель
Сообщения: 1353
Зарегистрирован: 29 мар 2005, 17:49
Контактная информация:

Сообщение hope »

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

А как открыть интерфейс один раз до цикла и закрыть интерфейс после цикла закрыть?
dp
Местный житель
Сообщения: 216
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Беларусь, Минск
Контактная информация:

Сообщение dp »

А как открыть интерфейс один раз до цикла и закрыть интерфейс после цикла закрыть?
интерфейс должен быть объектным для этого. для них есть процедуры инициализации и закрытия.
dP
Ответить