Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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? |
ну... не знаю А в чём разница между 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 импортированных месяцев просто выпадают в осадок. Пойду в Экселе рисовать колонку на основе входящего остатка в выписке и суммы платежей. Эксель наше всё  |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Ср Фев 13, 2013 05:35   |
|
Полезность: Нет оценки
|
yaffil пишет: | Да мне не суммирование надо, а остаток перед каждой операцией, тат налоговая запросила. Ладно отбой, мой вариант отрабатывает, но не жизнеспособен, из-за импорта документов. 9 импортированных месяцев просто выпадают в осадок. Пойду в Экселе рисовать колонку на основе входящего остатка в выписке и суммы платежей. Эксель наше всё  |
Есть ещё финт ушами.
Код: |
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   |
|
Полезность: Нет оценки
|
Вот такой финт сработал
Код: | ,::[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   |
|
Полезность: Нет оценки
|
пару слов в тему. Может для крупняка и не актуально, но бывает, что налоговая, ЦБ, просят хронологические выписки за день с остатками после операции, а клиент просит работать "под приход" ( красное сальдо без овердрафта), ну и ЦБ хочет увидеть такие дела, а бизнес почему то не хочет, отсюда появляются некоторые интересные алгоритмы сортировки операций в выписке  |
|
 |
yaffil Профи
Вступление в Клуб: 18.08.2011
|
Ср Фев 13, 2013 17:07   |
|
Полезность: Нет оценки
|
vtar пишет: | что налоговая, просят хронологические выписки за день с остатками после операции |
Собственно нас так и попросили, но в силу того, что мы не обязаны так предоставлять т.к. у банковского баланса отчётный период ДЕНЬ и как там внутри мы регистрируем документы никого не должно волновать и в силу того, что там в запросе налоговой не написано сортировать по дате операции - то мы им отсортировали по дню, приходу, затем по расходу т.е. минусов после операции нет!  |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|