| Предыдущая тема :: Следующая тема   | 
	 
	
	
		| Автор | 
		Сообщение | 
	 
	
		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 пишет: | 	 		  | что налоговая, просят хронологические выписки за день с остатками после операции | 	  
 
 
Собственно нас так и попросили, но в силу того, что мы не обязаны так предоставлять т.к. у банковского баланса отчётный период ДЕНЬ и как там внутри мы регистрируем документы никого не должно волновать и в силу того, что там в запросе налоговой не написано сортировать по дате операции - то мы им отсортировали по дню, приходу, затем по расходу т.е. минусов после операции нет!      | 
			 
		  | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
  | 
   
 
		 |