Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Реализация графика платежей  [new]
Ser123
Guest
Добрый день!

Пока не сильно силён в циклах, помогите понять где ошибка. Хочу в цикле получать новое значение остатка @credit_rest, пока оно не станет <= 0. Не могу понять где ошибка, не происходит инсерт

DECLARE 
    @annuity money,
    @appr_amount money,
    @credit_rest money,
    @appr_term DECIMAL, 
    @interest_rate DECIMAL, 
    @body money,
    @interest money, 
    @commission money, 
    @i INT

 SELECT 
  @appr_amount = isnull(ap.appr_amount,0),
  @annuity = (isnull(ap.appr_amount*(ap.interest_rate/100/12)/(1-POWER((1+ap.interest_rate/100/12),(-ap.appr_term))),0)*ap.appr_term),
  @body = (isnull(ap.appr_amount*(ap.interest_rate/100/12)/(1-POWER((1+ap.interest_rate/100/12),(-ap.appr_term))),0)*ap.appr_term) - isnull(ap.appr_amount*(ap.interest_rate/100/12),0),
  @interest = isnull(ap.appr_amount*(ap.interest_rate/100/12),0),
  @commission = isnull(ap.appr_amount*ap.com_month_ins/100*ap.appr_term,0)+
								isnull(ap.appr_amount*ap.com_month_ur/100*ap.appr_term,0)+
								isnull(ap.appr_amount*ap.com_month_unprod/100*ap.appr_term,0)
 from APPLICATIONS ap
 where ap.contract_id = 1

set @credit_rest = @appr_amount

WHILE @credit_rest <= 0

BEGIN
 set @i = @i + 1
 SELECT @credit_rest = @credit_rest - @annuity - @commission

 INSERT INTO dbo.CONTRACT_SCHEDULES
 VALUES(1, 1, dateadd(day,@i,CONVERT(date, GETDATE()))), @credit_rest, @body, @interest, @commission, 0, @annuity, @annuity+@commission,'')

END
12 сен 17, 11:01    [20789219]     Ответить | Цитировать Сообщить модератору
 Re: Реализация графика платежей  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Ser123,

while выполняется, когда условие соблюдается. У вас же, я так понял, while должен прекратить выполнение, когда условие будет соблюдаться, т.е. условие вам нужно инвертировать, "WHILE @credit_rest > 0"
12 сен 17, 11:23    [20789284]     Ответить | Цитировать Сообщить модератору
 Re: Реализация графика платежей  [new]
broccoli
Member

Откуда:
Сообщений: 10
Ser123,

Вместо цикла вычисления выполнять лучше в запросе, соединив таблицу с календарем.
Поскольку при обработке массива договоров это будет узким местом.
12 сен 17, 14:19    [20789937]     Ответить | Цитировать Сообщить модератору
 Re: Реализация графика платежей  [new]
лолл
Member

Откуда:
Сообщений: 450
Ser123,

Не надо циклов, пользуйтесь оконными функциями.
12 сен 17, 14:43    [20790075]     Ответить | Цитировать Сообщить модератору
 Re: Реализация графика платежей  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Вместо вот такого
set @credit_rest = @appr_amount

WHILE @credit_rest <= 0

BEGIN
 set @i = @i + 1
 SELECT @credit_rest = @credit_rest - @annuity - @commission

 INSERT INTO dbo.CONTRACT_SCHEDULES
 VALUES(1, 1, dateadd(day,@i,CONVERT(date, GETDATE()))), @credit_rest, @body, @interest, @commission, 0, @annuity, @annuity+@commission,'')

END

SQL может такое
;WITH
s AS (
  SELECT
    [credit_rest] = @appr_amount,
    [i] = 1
  UNION ALL
  SELECT
    [credit_rest] = [credit_rest] - @annuity - @commission,
    [i] = [i] + 1
  FROM
    s
)
INSERT
INTO
  dbo.CONTRACT_SCHEDULES
SELECT
  1,
  1,
  DATEADD( DAY, [i], CONVERT( DATE, GETDATE() ) ),
  [credit_rest],
  @body,
  @interest,
  @commission,
  0,
  @annuity,
  @annuity + @commission,
  ''
FROM
  s
12 сен 17, 16:21    [20790592]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить