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

Сумма остатков на счетах

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle
Предыдущая тема :: Следующая тема  
Автор Сообщение
bulkin
Участник


Вступление в Клуб: 15.01.2013
СообщениеВт Янв 15, 2013 17:42   Сумма остатков на счетах Ответить с цитатой
Полезность: Нет оценки
Добрый день!

Необходимо для клиента посчитать сумму его остатков на нескольких счетах, на заданную дату.

select ac( sum( ac.[GET_SALDO](p_dt, s, snt, false, true) ) )
in ::[AC_FIN]
where ac.[CLIENT_V]=p_cl
and substr(ac.[MAIN_V_ID],1,3) in ('450','451','452','453','454','455')
into v_sum;

В таком виде не компилируется, показывает на GET_SALDO, и ругается что "Не гарантируется, что содержимое базы не изменится".
Приходится делать цикл по счетам, и в цикле суммировать остаток по каждому отдельному счёту. Но же это как-то нехорошо...
С чего это вдруг GET_SALDO должна изменять базу?
Я как-то неправильно написал запрос? Или так посчитать вообще по какой-нибудь причине нельзя?
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеВт Янв 15, 2013 18:04    Ответить с цитатой
Полезность: Нет оценки
А почему не использовать функцию f.a?
bulkin
Участник


Вступление в Клуб: 15.01.2013
СообщениеСр Янв 16, 2013 09:12    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
А почему не использовать функцию f.a?

ну... не знаю Smile А в чём разница между f.a и Get_Saldo?
Эти функции равнозначны, или есть какие-нибудь особенности, в каком случае какую лучше использовать?
(Я уже задавал этот вопрос в другой ветке, но там пока не ответили).
Volod
Эксперт


Вступление в Клуб: 19.09.2007
СообщениеСр Янв 16, 2013 09:29    Ответить с цитатой
Полезность: 1
GET_SALDO - это остаток на момент времени, "Простая" операция и предназначена для использования в PL+.
f.a считает на дату или за дату и может использоваться в SELECT.
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Янв 16, 2013 10:29    Ответить с цитатой
Полезность: Нет оценки
Volod пишет:
GET_SALDO - это остаток на момент времени, "Простая" операция и предназначена для использования в PL+.
f.a считает на дату или за дату и может использоваться в SELECT.


Маленькое замечание. Остаток ЗА дату или период быть не может. За период бывают обороты. Остаток всегда НА дату (по состоянию на утро).

f.a тоже может использоваться в PL+
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Янв 16, 2013 10:33   Re: Сумма остатков на счетах Ответить с цитатой
Полезность: Нет оценки
bulkin пишет:
Добрый день!

Необходимо для клиента посчитать сумму его остатков на нескольких счетах, на заданную дату.

select ac( sum( ac.[GET_SALDO](p_dt, s, snt, false, true) ) )
in ::[AC_FIN]
where ac.[CLIENT_V]=p_cl
and substr(ac.[MAIN_V_ID],1,3) in ('450','451','452','453','454','455')
into v_sum;

В таком виде не компилируется, показывает на GET_SALDO, и ругается что "Не гарантируется, что содержимое базы не изменится".
Приходится делать цикл по счетам, и в цикле суммировать остаток по каждому отдельному счёту. Но же это как-то нехорошо...
С чего это вдруг GET_SALDO должна изменять базу?
Я как-то неправильно написал запрос? Или так посчитать вообще по какой-нибудь причине нельзя?


Вот как раз ЭТО хорошо - цикл по счетам, а внутри вызов операции.
Уверяю тебя, вызов функции в запросе сажает производительность запроса сразу на порядок. Даже если функция состоит только из null. За счёт переключения контекстов.
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеПт Фев 08, 2013 10:50    Ответить с цитатой
Полезность: Нет оценки
Может кто подскажет, как посчитать в представлении PL+ остаток на момент времени (на время операции в выписке по счёту)? Я так понял в явном виде [GET_SALDO] нельзя использовать, а есть что другое?
Или придётся вызывать свою ф-цию которая вызовет [GET_SALDO] и вернёт остаток? Наверное не есть гуд такой вариант.
spbetta
Участник со стажем


Вступление в Клуб: 19.11.2012
СообщениеПт Фев 08, 2013 11:29    Ответить с цитатой
Полезность: Нет оценки
можно сделать проще, как мне кажется

(select sum(z.c_saldo) from Z#AC_FIN z where z.C_CLIENT_V = A1_1.C_CLIENT and z.CLASS_ID = 'AC_FIN' and (z.c_main_v_id like '408%' or z.c_main_v_id like '407%'))
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеПт Фев 08, 2013 11:39    Ответить с цитатой
Полезность: Нет оценки
Да мне не суммирование надо, а остаток перед каждой операцией, тат налоговая запросила. Ладно отбой, мой вариант отрабатывает, но не жизнеспособен, из-за импорта документов. 9 импортированных месяцев просто выпадают в осадок. Пойду в Экселе рисовать колонку на основе входящего остатка в выписке и суммы платежей. Эксель наше всё Very Happy
Random
Эксперт


Вступление в Клуб: 27.06.2011
СообщениеСр Фев 13, 2013 05:35    Ответить с цитатой
Полезность: Нет оценки
yaffil пишет:
Да мне не суммирование надо, а остаток перед каждой операцией, тат налоговая запросила. Ладно отбой, мой вариант отрабатывает, но не жизнеспособен, из-за импорта документов. 9 импортированных месяцев просто выпадают в осадок. Пойду в Экселе рисовать колонку на основе входящего остатка в выписке и суммы платежей. Эксель наше всё Very Happy


Есть ещё финт ушами.
Код:

select c_main_v_id
   ,   coalesce(   (select /*+index(r IDX_Z#RECORDS_COL_DATE_STAMP)*/ c_START_SUM from z#records r where r.collection_id = a.c_arc_move and rownum < 2 and c_date >= p_date)
            ,      (select /*+index_desc(r IDX_Z#RECORDS_COL_DATE_STAMP)*/ c_START_SUM
+decode(r.c_dt,1,1,-1) --за точность формулы не ручаюсь
* r.c_summa
 from z#records r where r.collection_id = a.c_arc_move and rownum < 2 and c_date < p_date)
            ,   a.c_saldo -- а вот тут ещё нужно проверить дату последней операции со счёта и учесть обороты со счёта
      )
from z#ac_fin a, (select to_date('01/01/2011 00:00:00','dd/mm/yyyy hh24:mi:ss') p_date from dual)
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеСр Фев 13, 2013 08:15    Ответить с цитатой
Полезность: Нет оценки
Вот такой финт сработал Very Happy
Код:
,::[RUNTIME].[F_5].A('И'||x||'СВ',y.[DATE]) + analytic(sum(decode(y.[DT], 1, -1, 1)*y.[SUMMA]), 'OVER (PARTITION BY [1], [2] order by [3], [4])', x, trunc(y.[DATE]), y.[DT], y)    :C_OST_OPER_OUT
maestro
Профи


Вступление в Клуб: 12.10.2010
СообщениеСр Фев 13, 2013 10:23    Ответить с цитатой
Полезность: Нет оценки
Код:

select
 c_date,
 min(c_start_sum) keep (dense_rank first order by id)
, sum(c_summa*decode(c_dt, 1, -1, 1))
from z#records
where collection_id = &p_coll
group by c_date
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеСр Фев 13, 2013 11:29    Ответить с цитатой
Полезность: Нет оценки
пару слов в тему. Может для крупняка и не актуально, но бывает, что налоговая, ЦБ, просят хронологические выписки за день с остатками после операции, а клиент просит работать "под приход" ( красное сальдо без овердрафта), ну и ЦБ хочет увидеть такие дела, а бизнес почему то не хочет, отсюда появляются некоторые интересные алгоритмы сортировки операций в выписке Smile
yaffil
Профи


Вступление в Клуб: 18.08.2011
СообщениеСр Фев 13, 2013 17:07    Ответить с цитатой
Полезность: Нет оценки
vtar пишет:
что налоговая, просят хронологические выписки за день с остатками после операции


Собственно нас так и попросили, но в силу того, что мы не обязаны так предоставлять т.к. у банковского баланса отчётный период ДЕНЬ и как там внутри мы регистрируем документы никого не должно волновать и в силу того, что там в запросе налоговой не написано сортировать по дате операции - то мы им отсортировали по дню, приходу, затем по расходу т.е. минусов после операции нет! Very Happy
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Разработка в PL/PLUS. Оптимизация запросов Oracle Часовой пояс: GMT + 3
Страница 1 из 1

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