2015-03-24 2 views
0

Я создал функцию, к которой я пасс Дата и Срок и результат был бы Дата что предыдущий взнос ушедшей даты и времени. Ниже приведены примеры.Получить предыдущую дату рассрочка

Date (In)  | Term (In) | Date (Out) 
--------------+-----------------+-------------- 
22/02/2015 | Monthly  | 22/03/2015 
22/02/2015 | Quarterly | 22/02/2015 
01/01/2015 | Monthly  | 01/03/2015 
24/03/2015 | Annually  | 24/03/2015 

Значение термина будет равно Ежемесячно, ежеквартально, ежегодно. Это функция, которую я сейчас имею, но не дает мне желаемых результатов.

Public Function getPrevInst(tmpDate As Date, tmpPeriod As String) As Date 
    Dim monthDiff As Integer, modVal As Integer, tmpFuncDate As Date, tmpMonDiff As Long 

    Select Case tmpPeriod 
     Case "Monthly" 
      modVal = 1 
     Case "Quarterly" 
      modVal = 3 
     Case Else 
      modVal = 12 
    End Select 

    monthDiff = DateDiff("m", tmpDate, LstDayPrevMnth(Date)) 

    tmpMonDiff = IIf(monthDiff > 0, monthDiff - (monthDiff Mod modVal), IIf(monthDiff < 0, 0, 1)) 

    tmpFuncDate = DateAdd("m", tmpMonDiff, tmpDate) 

    If tmpFuncDate >= Date Then 
     getPrevInst = DateAdd("m", monthDiff, tmpDate) 
    Else 
     getPrevInst = tmpFuncDate 
    End If 
End Function 

Public Function LstDayPrevMnth(InDate As Date) As Date 
    LstDayPrevMnth = DateSerial(Year(InDate), Month(InDate), 0) 
End Function 

Мой результат (очевидно, неправильно),

Date (In)  | Term (In) | Date (Out) 
--------------+-----------------+-------------- 
22/02/2015 | Monthly  | 22/03/2015 
22/02/2015 | Quarterly | 22/03/2015 
01/01/2015 | Monthly  | 01/02/2015 
24/03/2015 | Annually  | 24/02/2015 

Если у вас есть лучший способ найти предыдущий взнос также будет приветствоваться. Если мой код ужасно ошибочен.

Дилетанты термин:

Петр заимствует кредит от меня. Он планирует вернуть его Monthly, его первый взнос составляет 22 February 2015. Если я открою его запись, мне нужно будет узнать, когда был последний платеж/уплачен. Итак, сегодня (24 марта 2015 года), я получил бы его первый платеж 22 February 2015, 22 March 2015 (как 22 марта было два дня назад). Таким образом, последняя дата платежа равна 22 марта 2015 года.

Tom получает кредит от меня. Он планирует выплатить его ежемесячно, его первый взнос составляет 01 January 2015. Если я открою его запись, мне нужно будет узнать, когда был последний платеж/уплачен. Так что сегодня (24 марта 2015 года) я получил бы свой первый платеж 01 January 2015, 01 February 2015 и 01 March 2015 (так как 01 марта было 23 дня назад). Таким образом, последняя дата платежа равна 01 марта 2015 года.

Harry получает кредит от меня. Он планирует погасить его ежеквартально, его первый взнос составляет 22 February 2015. Если я открою его запись, мне нужно будет узнать, когда был последний платеж/уплачен. Так что сегодня (24 марта 2015 года) я получил бы свой первый платеж 22 March 2015 (то есть, следующий платеж не должен появляться до 22 June 2015, которого еще не было). Таким образом, последняя дата платежа равна 22 марта 2015 года.

Примечание: Cross размещен по адресу: http://www.access-programmers.co.uk/forums/showthread.php?t=276041

ответ

0

Это является более чувствительным, чем вы можете думать, потому что месяц не «месяц». Но - с помощью функции Месяцы ниже - вы можете рассчитать даты точно:

DateLast = DateAdd("m", Months(DateFirst, Date), DateFirst) 
DateLast = DateAdd("m", (Months(DateFirst, Date) \ 3) * 3, DateFirst) 
DateLast = DateAdd("m", (Months(DateFirst, Date) \ 12) * 12, DateFirst) 

Обратите внимание на целочисленное деление с \.

Public Function Months(_ 
    ByVal datDate1 As Date, _ 
    ByVal datDate2 As Date, _ 
    Optional ByVal booLinear As Boolean) _ 
    As Integer 

' Returns the difference in full months between datDate1 and datDate2. 
' 
' Calculates correctly for: 
' negative differences 
' leap years 
' dates of 29. February 
' date/time values with embedded time values 
' negative date/time values (prior to 1899-12-29) 
' 
' Optionally returns negative counts rounded down to provide a 
' linear sequence of month counts. 
' For a given datDate1, if datDate2 is decreased stepwise one month from 
' returning a positive count to returning a negative count, one or two 
' occurrences of count zero will be returned. 
' If booLinear is False, the sequence will be: 
' 3, 2, 1, 0, 0, -1, -2 
' If booLinear is True, the sequence will be: 
' 3, 2, 1, 0, -1, -2, -3 
' 
' If booLinear is False, reversing datDate1 and datDate2 will return 
' results of same absolute Value, only the sign will change. 
' This behaviour mimics that of Fix(). 
' If booLinear is True, reversing datDate1 and datDate2 will return 
' results where the negative count is offset by -1. 
' This behaviour mimics that of Int(). 

' DateAdd() is used for check for month end of February as it correctly 
' returns Feb. 28. when adding a count of months to dates of Feb. 29. 
' when the resulting year is a common year. 
' 
' 2010-03-30. Cactus Data ApS, CPH. 

    Dim intDiff As Integer 
    Dim intSign As Integer 
    Dim intMonths As Integer 

    ' Find difference in calendar months. 
    intMonths = DateDiff("m", datDate1, datDate2) 
    ' For positive resp. negative intervals, check if the second date 
    ' falls before, on, or after the crossing date for a 1 month period 
    ' while at the same time correcting for February 29. of leap years. 
    If DateDiff("d", datDate1, datDate2) > 0 Then 
    intSign = Sgn(DateDiff("d", DateAdd("m", intMonths, datDate1), datDate2)) 
    intDiff = Abs(intSign < 0) 
    Else 
    intSign = Sgn(DateDiff("d", DateAdd("m", -intMonths, datDate2), datDate1)) 
    If intSign <> 0 Then 
     ' Offset negative count of months to continuous sequence if requested. 
     intDiff = Abs(booLinear) 
    End If 
    intDiff = intDiff - Abs(intSign < 0) 
    End If 

    ' Return count of months as count of full 1 month periods. 
    Months = intMonths - intDiff 

End Function 
Смежные вопросы