| 
 
	
		| Предыдущая тема :: Следующая тема |  
		| Автор | Сообщение |  
		| брат666 Участник со стажем
 
 
 Вступление в Клуб: 20.02.2014
 
 | 
			
				|  Ср Фев 26, 2014 16:48   исправление скрипта |   |  
				| Полезность: Нет оценки 
 |  
				| приветсвую всех, исправьте пожалуйста код чтобы получился дата гашений. 
 
  	  | Код: |  	  | function FACT_DATE(p_CRED ref[PR_CRED], p_DATE DATE ) return DATE is v_sum_g      summa;
 v_s          summa;
 begin
 if p_DATE is null then
 p_DATE := [VIEWFUN].GetOpDate;
 end if;
 
 v_sum_g := 0;
 
 select LP(NVL(sum(LP.[SUMMA]),0)       :summa1)
 in p_CRED.LIST_PAY where lp.[DATE]<p_DATE and (lp.OPER = [VID_OPER_DOG](CODE='GASHEN_ZADOLJ_KR') or
 lp.OPER = [VID_OPER_DOG](CODE='PEREN_ZADOLJ_KR'))  into v_sum_g;
 
 v_s := v_sum_g;
 
 for(select LP(LP.[SUMMA]:summa1,
 LP.[DATE]:date1
 )
 in p_CRED.LIST_PAY  where   lp.[DATE]<p_DATE and lp.OPER =[VID_OPER_DOG](CODE='VYNOS_ZADOLJ_KR')
 order by lp.[DATE]
 )
 loop
 v_s := v_s-lp.SUMMA1;
 if v_s = 0 then
 return lp.date1;
 end if;
 END LOOP;
 | 
 |  |  
		|  |  
		| Random Эксперт
 
 
 Вступление в Клуб: 27.06.2011
 
 | 
			
				|  Чт Фев 27, 2014 06:01   Re: исправление скрипта |   |  
				| Полезность: 1 
 |  
				|  	  | брат666 пишет: |  	  | приветсвую всех, исправьте пожалуйста код чтобы получился дата гашений. 
 | 
 
 Загляните в справочник задолженностей TAKE_IN_DEBT.
 |  |  
		|  |  
		| брат666 Участник со стажем
 
 
 Вступление в Клуб: 20.02.2014
 
 | 
			
				|  Чт Фев 27, 2014 10:14   Re: исправление скрипта |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | Random пишет: |  	  |  	  | брат666 пишет: |  	  | приветсвую всех, исправьте пожалуйста код чтобы получился дата гашений. 
 | 
 
 Загляните в справочник задолженностей TAKE_IN_DEBT.
 | 
 
 спасибо огромное, но не нашел того справочника. т.е нет такого справочника.
 |  |  
		|  |  
		| Random Эксперт
 
 
 Вступление в Клуб: 27.06.2011
 
 | 
			
				|  Чт Фев 27, 2014 11:16   Re: исправление скрипта |   |  
				| Полезность: 1 
 |  
				|  	  | брат666 пишет: |  	  |  	  | Random пишет: |  	  |  	  | брат666 пишет: |  	  | приветсвую всех, исправьте пожалуйста код чтобы получился дата гашений. 
 | 
 
 Загляните в справочник задолженностей TAKE_IN_DEBT.
 | 
 
 спасибо огромное, но не нашел того справочника. т.е нет такого справочника.
 | 
 
 А, да. Если смотреть через АРМ Навигатор, то заходить лучше через справочник "Виды задолженностей" VID_DEBT
 |  |  
		|  |  
		| брат666 Участник со стажем
 
 
 Вступление в Клуб: 20.02.2014
 
 | 
			
				|  Чт Фев 27, 2014 12:00   Re: исправление скрипта |   |  
				| Полезность: Нет оценки 
 |  
				|  	  | Random пишет: |  	  |  	  | брат666 пишет: |  	  |  	  | Random пишет: |  	  |  	  | брат666 пишет: |  	  | приветсвую всех, исправьте пожалуйста код чтобы получился дата гашений. 
 | 
 
 Загляните в справочник задолженностей TAKE_IN_DEBT.
 | 
 
 спасибо огромное, но не нашел того справочника. т.е нет такого справочника.
 | 
 
 А, да. Если смотреть через АРМ Навигатор, то заходить лучше через справочник "Виды задолженностей" VID_DEBT
 | 
 
 хоть подскажите с каким операцием надо работать.
 |  |  
		|  |  
		| Random Эксперт
 
 
 Вступление в Клуб: 27.06.2011
 
 | 
			
				|  Пт Фев 28, 2014 06:07   Re: исправление скрипта |   |  
				| Полезность: 1 
 |  
				|  	  | брат666 пишет: |  	  |  	  | Random пишет: |  	  | Если смотреть через АРМ Навигатор, то заходить лучше через справочник "Виды задолженностей" VID_DEBT 	  | брат666 пишет: |  	  | приветсвую всех, исправьте пожалуйста код чтобы получился дата гашений. 
 | 
 | 
 хоть подскажите с каким операцием надо работать.
 | 
 
 Извините, я вас не понимаю.
 что есть "операцием"?
 Вам подсказать, с какими фактическими операциями работать?
 С какими типами операций?
 Или необходима функция (операция), возвращающая сумму задолженности?
 
 Насколько я понял, у вас задача - получить дата гашений.
 Непонятно, правда, первый или последний.
 
 Задачу можно решить двумя способами - выбрать все операции гашения из факт.операций договора, отсортировать по дате, и взять первую/последнюю.
 Или использовать функции max/min.
 Какие коды у нужных типов операций вам нужны, вы можете посмотреть через справочник VID_DEBT. С помощью ARM Навигатор.
 
 Лично у меня там дофига продуктов. Вешаем фильтр на нужный, например, PR_CRED. Это значит, что нужны только кредитные договоры.
 
 Дальше нужно определить, гашение чего надо смотреть.
 Гашение процентов? Просроченных процентов? Основной суммы долга?
 
 Возьмём для примера ссудную задолженность. Установим на ней курсор и нажмём Ctrl+R
 Появится список ТБП, которые ссылаются на данную задоженность.
 Нам нужна структура "Участие в задолженности", TAKE_IN_DEBT.
 Выбираем, ОК
 Вуаля - перед нами список типов операций, с плюсом - увеличивают ссудную задолженность (например, "выдача кредита"), с минусом - уменьшают (например, востребование кредита через суд. Ну или гашение суммы долга).
 Выбирайте нужные.
 
 Очень помогает разобраться в задаче комментирование кода
  	  | Код: |  	  | /* функция возвращает дату полного гашения кредита */
 function FACT_DATE(p_CRED ref[PR_CRED], p_DATE DATE ) return DATE is
 v_s          number;
 begin
 if p_DATE is null then
 -- если передана пустая дата, нужно взять дату опер.дня
 p_DATE := [VIEWFUN].GetOpDate;
 end if;
 
 -- получаем полную сумму задолженности на дату.
 -- непонятно, что за задолженность состоит из гашения кредита и выноса на просрочку?
 select LP(NVL(sum(LP.[SUMMA]),0)       :summa1)
 in p_CRED.LIST_PAY
 where lp.[DATE]<p_DATE
 and lp.OPER in (   [VID_OPER_DOG](CODE='GASHEN_ZADOLJ_KR')
 ,     [VID_OPER_DOG](CODE='PEREN_ZADOLJ_KR'))
 into v_s;
 
 -- А что если задолженность изначально нулевая? А не вернуть ли сразу p_date ?
 
 -- Пробегаем по всем факт.операциям и уменьшаем задолженность.
 -- кстати, интересно, куда делись операции гашения кредита?
 for(
 select LP(    LP.[SUMMA]    :summa1 -- сумма операции
 ,         LP.[DATE]       :date1     -- дата операции
 )       in p_CRED.LIST_PAY
 where   lp.[DATE]<p_DATE
 and lp.OPER =[VID_OPER_DOG](CODE='VYNOS_ZADOLJ_KR')
 order by lp.[DATE]
 )  loop
 -- уменьшаем задолженность
 v_s := v_s-lp.SUMMA1;
 
 -- Если переходим через 0, значит, достигли нужной даты
 if v_s <= 0 then
 return lp.date1;
 end if;
 END LOOP;
 -- а здесь обработаем ситуацию, если сумма так и не достигла 0
 
 | 
 
 Если подумать, то приведённый код имеет кучу подводных камней.
 1. Если есть хоть одна запись с типом операции GASHEN_ZADOLJ_KR, то второй цикл просто не имеет смысла, сумма никогда не достигнет нуля.
 2. Если нужна просто последняя операция с типом VYNOS_ZADOLJ_KR, то гораздо проще не насчитывать задолженность и не уменьшать её потом.
 Где, например, гарантия, что некто Иванова Мария Петровна, операционист, не проведёт операцию как раз между тем моментом, когда насчитали полную сумму и моментом, когда начали бежать по второму циклу?
 
 Гораздо проще написать
 
  	  | Код: |  	  | select x(x.[DATE]:C_DATE )in p_CRED.LIST_PAY
 ...
 order by x.[DATE]  desc -- первая дата - asc, последняя - desc
 ) loop
 return x.c_date;
 | 
 |  |  
		|  |  
		|  |  
  
	| 
 
 | Вы не можете начинать темы Вы не можете отвечать на сообщения
 Вы не можете редактировать свои сообщения
 Вы не можете удалять свои сообщения
 Вы не можете голосовать в опросах
 
 |  |