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

Откуда:
Сообщений: 276
Есть ранжированный по датам запрос, где находятся выставленные платежи (1) и проплаты (2).
Дата выставленного платежа и есть день с которого начисляем пеню.

Картинка с другого сайта.

Ч-з код ВБА хочу посчитать пеню на текущий день и долг, которые необходимо выгрузить в таблицу

Картинка с другого сайта.

Никак не могу продумать алгоритм расчета. Платежи могут идти в разнобой, несколькими суммами, пеню могут оплатить и в основном платеже, а не отдельно. Изначально платежи должны гасить основной долг, затем пеню.

В целом понимаю, что на каждую дату в таблице необходимо считать баланс и при долге вычислять пеню.

Нижеприведенный код не претендует на правильность, просто выбранное направление движения в расчете.
+
Oplatit = 0
Oplata = 0

Set rcdPlateji = CurrentDb.OpenRecordset("Пеня2")
rcdPlateji.MoveFirst 'на первую запись
Do While Not rcdPlateji.EOF 'просмотр всего запроса Пеня2

    KodStudend = rcdPlateji![КодСтудента]
    PenjaSumm = 0
    Do While rcdPlateji![КодСтудента] = KodStudend ' просмотр всех платежек для студента

                    If rcdPlateji![ТипПлатежки] = 1 Then
                    Oplatit = Oplatit + rcdPlateji![СуммаПлатежа]
                    OplataPo = rcdPlateji![ДатаПлатежа]
                    Else
                    Oplata = Oplata + rcdPlateji![СуммаПлатежа]
                    PlategkiOt = rcdPlateji![ДатаПлатежа]
                    End If
                    
                    If Dolg > 0 And Oplata > 0 Then
                    KOlDni = DateDiff("d", OplataPo, PlategkiOt)
                    Penja = Dolg * KOlDni * 0.001
                    PenjaSumm = Penja + PenjaSumm
                    Dolg = Oplatit - Oplata
                    End If

    rcdPlateji.MoveNext
    Loop

Loop



ПС: сам по образованию не программист, ищу похожие образцы кода и пытаюсь адаптировать к своим нуждам. В данном случае застрял((.
18 май 15, 09:41    [17653758]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм для расчета пени в VBA  [new]
П-Л
Guest
В прошлый раз уже посчитали на джете. Нафига тоже самое в вба городить ?

17253822
18 май 15, 09:49    [17653798]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм для расчета пени в VBA  [new]
forestry96
Member

Откуда:
Сообщений: 276
П-Л
В прошлый раз уже посчитали на джете. Нафига тоже самое в вба городить ?

17253822


Не работает оно у меня - выдает не то что ожидается. Короче криво работает на запросах.
18 май 15, 09:58    [17653857]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм для расчета пени в VBA  [new]
forestry96
Member

Откуда:
Сообщений: 276
Вот допустим, что считает мне запрос
Картинка с другого сайта.
165 дней просрочки? Посчитало верно только первую строку: 9 дней просрочки и 27000 пеня.

Сам запрос.

+
SELECT a.Код, a.Фамилия, a.Имя, a.КодБухгалтерии, b.СуммаПлатежа AS ВсегоОплатить, b.ОплатитьДО, c.ДатаПлатежа, Sum(d.СуммаПлатежа) AS ОплаченоНаДату, b.СуммаПлатежа-nz(Sum(d.СуммаПлатежа)) AS НужноЗаплатитьНаДату, Sum(c.СуммаПлатежа) AS СуммаПлатежанаДату, b.СуммаПлатежа-nz(Sum(d.СуммаПлатежа))-СуммаПлатежанаДату AS ОсталосьЗаплатитьНаДату, DateDiff('d',IIf(nz(Max(d.ДатаПлатежа),b.ОплатитьДО)<b.ОплатитьДО,b.ОплатитьДО,nz(Max(d.ДатаПлатежа),b.ОплатитьДО)),IIf(c.ДатаПлатежа<b.ОплатитьДО,b.ОплатитьДО,c.ДатаПлатежа)) AS DaysForP, 0.01*DaysForP*(b.СуммаПлатежа-nz([ОплаченоНаДату])) AS P
FROM ((Студенты AS a INNER JOIN ПлатежиСтудентов AS c ON a.КодБухгалтерии = c.КодСтудентаБухг) LEFT JOIN ПлатежиСтудентов AS d ON c.КодСтудентаБухг = d.КодСтудентаБухг) INNER JOIN ПлатежиВыставление AS b ON a.Код = b.КодСтудента
GROUP BY a.Код, a.Фамилия, a.Имя, a.КодБухгалтерии, b.СуммаПлатежа, b.ОплатитьДО, c.ДатаПлатежа
HAVING (((a.Код)=22))
ORDER BY a.Код, b.ОплатитьДО, c.ДатаПлатежа;
18 май 15, 10:05    [17653893]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм для расчета пени в VBA  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 18111
forestry96
Изначально платежи должны гасить основной долг, затем пеню.

Очень странная фраза... Вообще-то сперва положено оплатить обслуживание долга/кредита, и только потом гасить сам долг. Иначе получится странная ситуация - начисление пени на неуплаченную пеню.
18 май 15, 10:08    [17653908]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм для расчета пени в VBA  [new]
forestry96
Member

Откуда:
Сообщений: 276
Akina
forestry96
Изначально платежи должны гасить основной долг, затем пеню.

Очень странная фраза... Вообще-то сперва положено оплатить обслуживание долга/кредита, и только потом гасить сам долг. Иначе получится странная ситуация - начисление пени на неуплаченную пеню.


Пеня после погашения основного долга не растет и на нее пени не начисляются. Бухгалтерия вообще пеню не дает, пока основной долг не погашен.
18 май 15, 10:10    [17653925]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм для расчета пени в VBA  [new]
П-Л
Guest
В предыдущем топике джетовский запрос давал правильный расчет и по дням по суммам. Запрос, который у вас считает неправильно, совершенно другой. Исправляйте запрос, пока он не начнет давать правильные данные.

15 выставили 5млн - пеня с 15.09 по 29.09 = 14 дней на остаток 5
29 оплатили 1,5 млн - пеня с 29.09 по 30.09 = 1 дней на остаток 5 - 1,5 = 3,5
30 оплатили 1,7 млн - пеня с 30.09 по 05.10 = 5 дней на остаток 3,5 -1,7 = 1,8

КодСтудента ПредДата ДатаПлатежа СуммаВыставлено СуммаОплачено ОстатокДолга ЧислоДней СуммаПени
33532 15.09.2014 29.09.2014 5000000 0 5000000 14 1917.81
33532 29.09.2014 30.09.2014 5000000 1500000 3500000 1 95.89
33532 30.09.2014 05.10.2014 5000000 3200000 1800000 5 246.58
18 май 15, 10:50    [17654199]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм для расчета пени в VBA  [new]
forestry96
Member

Откуда:
Сообщений: 276
Есть и тот вариант расчета на запросах Пеня1 - Пеня4
Картинка с другого сайта.

1 марта выставили - 3 000 000
10 марта оплатили - 3 000 000 просрочка 9 дней - пеня 27 000
26 августа оплата раньше выставления (часть суммы) - пеня ноль
15 сентября выставили 5 062 000 - появилось 20 дней и пеня 41240 это лишнее
20 сентября оплата оставшейся части суммы - 5 дней просрочка и пеня 10 310


Так вот и выходит, что есть некоторые неточности в работе запроса.
18 май 15, 11:13    [17654338]     Ответить | Цитировать Сообщить модератору
 Re: Алгоритм для расчета пени в VBA  [new]
4126
Guest
forestry96
Вот допустим, что считает мне запрос
Картинка с другого сайта.
165 дней просрочки?
А сколько? Если оплатитьДо=01.03, а ДатаПлатежа=26.08
18 май 15, 17:25    [17657092]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft Access Ответить