Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
брат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 пишет: | брат666 пишет: | приветсвую всех, исправьте пожалуйста код чтобы получился дата гашений.
| Если смотреть через АРМ Навигатор, то заходить лучше через справочник "Виды задолженностей" VID_DEBT |
хоть подскажите с каким операцием надо работать. |
Извините, я вас не понимаю.
что есть "операцием"?
Вам подсказать, с какими фактическими операциями работать?
С какими типами операций?
Или необходима функция (операция), возвращающая сумму задолженности?
Насколько я понял, у вас задача - получить дата гашений.
Непонятно, правда, первый или последний.
Задачу можно решить двумя способами - выбрать все операции гашения из факт.операций договора, отсортировать по дате, и взять первую/последнюю.
Или использовать функции 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; |
|
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|