CftClub.ru
Клуб специалистов ЦФТ-Банк

Обработка таблицы MAIN_DOCUM
На страницу Пред.  1, 2, 3  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Банковская отчетность (оперативная, обязательная, Oracle Reports)
Предыдущая тема :: Следующая тема  
Автор Сообщение
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеВт Апр 10, 2018 18:16    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Я считал что объект имею - к его свойствам быстро доступ происходит.

Один вызов быстро - а тысячи?

Цитата:
По многим клиентам действительно долго.

Так списочная операция?
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеВт Апр 10, 2018 18:24    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Так списочная операция?

Либо один клиент, либо все ЮЛ или ФЛ?
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеВт Апр 10, 2018 18:29    Ответить с цитатой
Полезность: Нет оценки
Опять же кучу всего вычисляете, что касается клиента, до оборотов, но вывод в Excel зависит от оборота. Зря получается, да еще и на каждый счет?
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеСр Апр 11, 2018 06:02    Ответить с цитатой
Полезность: Нет оценки
mmm_kazan пишет:
Я понимаю, что индескс наверное не тот.
Очень много конструкций OR.
Выслал все, что есть.


Ну хотя бы место вычислили где больше всего времени тратится ?
тупо по коду debug_pipe расставить ,
а том может там много строк выводится и тормозит на выводе
EXCEL.Write
а не на запросах и не из-за большого числа циклов....
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеСр Апр 11, 2018 08:43    Ответить с цитатой
Полезность: Нет оценки
Здравствуйте.
Согласен, что тормоза получаются при выводе оборотов.

Вот и хочу расставить метки, чтобы понять на каком селекте

Извините - в программировании в ЦФТ опыт действительно небольшой.

А по поводу оборотов обошел галочками разными на форме.

Если кому не нужно - не указывают.
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеСр Апр 11, 2018 08:49    Ответить с цитатой
Полезность: Нет оценки
Alkov пишет:
mmm_kazan пишет:
Я понимаю, что индескс наверное не тот.
Очень много конструкций OR.
Выслал все, что есть.


Ну хотя бы место вычислили где больше всего времени тратится ?
тупо по коду debug_pipe расставить ,
а том может там много строк выводится и тормозит на выводе
EXCEL.Write
а не на запросах и не из-за большого числа циклов....



А строк там не так много.
Научите как правильно узкие места искать?
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеСр Апр 11, 2018 08:52    Ответить с цитатой
Полезность: Нет оценки
Бывают конечно ситуации, когда порядка 200 клиентов выходят. Вот тогда и начинаются проблемы.
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеСр Апр 11, 2018 09:39    Ответить с цитатой
Полезность: Нет оценки
Опять же код трудночитаемый.
Параметры операции (закладка Параметры) должны начинаться с P_, а переменные (закладка Переменные) с V_. Соответственно у локальных переменных д.б. другие префиксы.
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеСр Апр 11, 2018 10:09    Ответить с цитатой
Полезность: Нет оценки
В общем осовная беда код 6 сек. выполняется по одному клиенту.

for
(select l1(l1 : l1_id)
in ::[LEGAL_161P]
where l1.vo=1984365)
loop
if ::[LEGAL_161P].[Z134021099].get_payer_inn(l1.l1_id)=c.[c_inn] or ::[LEGAL_161P].[Z134021099].get_recip_inn(l1.l1_id)=c.[c_inn] then
c_Number_Doc_Ostanov_str := '6001. Код подозрительных операций.';
exit;
end if;
end loop;
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеСр Апр 11, 2018 10:12    Ответить с цитатой
Полезность: Нет оценки
И вот этот код по 2 сек каждый
Выбираются в общем наиболее крупные проводки с контрагентами

debug_pipe('11Время - '||(utils.get_time),0);
for(select md1 (md1.[SUM] : m_sum,
(case when md1.[KL_DT].[0]=1 then md1.[KL_DT].[1].[1].[NAME]
else md1.[KL_DT].[2].[2]
end) :contragent,
md1.[NAZN] : m_nazn)
in ::[MAIN_DOCUM] all
where md1.[ACC_KT]=c.[af_id]
and (md1.[DATE_PROV]>=DATE_BEGIN)
and (md1.[DATE_PROV]<=DATE_END)
and md1%state='PROV'
order by 1 desc)
loop
if i >= 10 then
exit;
end if;
real_doc_cred:=real_doc_cred||md1.contragent||' '||to_char(md1.m_sum,'999999999999999.99')||' '||md1.m_nazn||chr(10);
i := i + 1;
end loop;

i := 1;
debug_pipe('12Время - '||(utils.get_time),0);
for(select md1 (md1.[SUM] : m_sum,
(case when md1.[KL_KT].[0]=1 then md1.[KL_KT].[1].[1].[NAME]
else md1.[KL_KT].[2].[2]
end) :contragent,
md1.[NAZN] : m_nazn)
in ::[MAIN_DOCUM] all
where md1.[ACC_DT]=c.[af_id]
and (md1.[DATE_PROV]>=DATE_BEGIN)
and (md1.[DATE_PROV]<=DATE_END)
and md1%state='PROV'
order by 1 desc)
loop
if i >= 10 then
exit;
end if;
real_doc_deb:=real_doc_deb||md1.contragent||' '||to_char(md1.m_sum,'999999999999999.99')||' '||md1.m_nazn||chr(10);
i := i + 1;
end loop;
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеСр Апр 11, 2018 10:32    Ответить с цитатой
Полезность: Нет оценки
mmm_kazan пишет:
В общем осовная беда код 6 сек. выполняется по одному клиенту.

for
(select l1(l1 : l1_id)
in ::[LEGAL_161P]
where l1.vo=1984365)
loop
if ::[LEGAL_161P].[Z134021099].get_payer_inn(l1.l1_id)=c.[c_inn] or ::[LEGAL_161P].[Z134021099].get_recip_inn(l1.l1_id)=c.[c_inn] then
c_Number_Doc_Ostanov_str := '6001. Код подозрительных операций.';
exit;
end if;
end loop;


Возможно быстрее будет так:
[code]
begin
select l(l)
in ::[LEGAL_161P], (::[MAIN_DOCUM] all :md) all
where
l.[DOC]= md%id
and (md.[ACC_DT].[CLIENT_V] = CLIENT%id
or md.[ACC_KT].[CLIENT_V] = СLIENT%id)
and l.[VO] = ::[VID_OPER_PRED]([code]='6001')
and l.[DATE_P] >= P_DATE_BEG -- наверное можно ограничить по дате ?
and l.[DATE_P] <= P_DATE_END -- наверное можно ограничить по дате ?
and md%state = 'PROV'
and l.[STATUS] in (наверное не все нужны)
and rownum=1
into tmp_num;

c_Number_Doc_Ostanov_str := '6001. Код подозрительных операций.';
exception when NO_DATA_FOUND then
tmp_num := 0;
end ;
[/code]
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеСр Апр 11, 2018 15:49    Ответить с цитатой
Полезность: Нет оценки
Код:
for(select md1 (md1.[SUM] : m_sum,
(case when md1.[KL_DT].[0]=1 then md1.[KL_DT].[1].[1].[NAME]
else md1.[KL_DT].[2].[2]
end) :contragent,
md1.[NAZN] : m_nazn)
in ::[MAIN_DOCUM] all


используйте [RECORDS]
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеСр Апр 11, 2018 15:58    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
Код:
for(select md1 (md1.[SUM] : m_sum,
(case when md1.[KL_DT].[0]=1 then md1.[KL_DT].[1].[1].[NAME]
else md1.[KL_DT].[2].[2]
end) :contragent,
md1.[NAZN] : m_nazn)
in ::[MAIN_DOCUM] all


используйте [RECORDS]


Здравствуйте.
Пример бы предоставили? )
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеСр Апр 11, 2018 16:45    Ответить с цитатой
Полезность: Нет оценки
см. например операцию FTS_ACC_MOVE
type Q_DOC is
mmm_kazan
Участник со стажем


Вступление в Клуб: 28.03.2018
СообщениеЧт Апр 12, 2018 08:45    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
см. например операцию FTS_ACC_MOVE
type Q_DOC is


Здравствуйте.
Я посмотрел пример - можно пояснить?
Я так понимаю, что

pragma macro(acc, 'f.a(''В''||to_char(arc_move)||''[1]В'', [2], P_DATE2)', substitute);

Посчитает обороты.
Потом я arc_move использую как таблицу.

Честно сказать таким механизмом не пользовался.
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Банковская отчетность (оперативная, обязательная, Oracle Reports) Часовой пояс: GMT + 3
На страницу Пред.  1, 2, 3  След.
Страница 2 из 3

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru