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

исправление скрипта

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих
Предыдущая тема :: Следующая тема  
Автор Сообщение
брат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;
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих Часовой пояс: GMT + 3
Страница 1 из 1

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