Code:
Option Compare Database
Option Explicit
Option Base 1 ' <<<< Note
Private Sub Calc2_Click()
Const DaysPerMonth As Integer = 30
Dim D As DAO.Database
Dim R As DAO.Recordset
Dim sSQL As String
Dim C_num As Long 'contract number
Dim pContQty As Double
Dim pLotVal As Double
Dim pIntimDate As Date
Dim pPymtDate As Date
Dim sString As String
Dim LastDateOfDel As Date
Dim Days As Integer
' Dim tmpDays As Integer
Dim CCrateFor1stSlab As Single
Dim CCrateFor2ndSlab As Single
Dim CCrateFor3rdSlab As Single
Dim Result As Single
Dim sngTotal As Single
Dim DaysVal As Single
Dim CC1Rate As Single
Dim CC2Rate As Single
Dim CC3Rate As Single
Dim i As Integer
Dim NumDays As Integer
Dim ArrayUB As Integer
'---------------------------
If Me.NewRecord Then
MsgBox "New record - no data"
Exit Sub
End If
'get data
pContQty = Me.ContractQty
pLotVal = Me.DC_Value
pIntimDate = Me.IntimationDate
pPymtDate = Nz(Me.PaymentDate, #12/31/9999#)
C_num = Me.ContractNum
LastDateOfDel = IIf(pContQty >= 2000, pIntimDate + 7, pIntimDate + 5)
Me.DeliveryDate = LastDateOfDel
Days = IIf(DateDiff("d", LastDateOfDel, pPymtDate) < 1, 0, DateDiff("d", LastDateOfDel, pPymtDate))
Me.CC_Days = Days
ArrayUB = (Days \ DaysPerMonth) + 2
ReDim sngArray(ArrayUB, 4) As Variant
Set D = CurrentDb
'----------------------------------
'get CC rates from table
sSQL = "SELECT TOP 1 tblCCrates.CC1, tblCCrates.CC2, tblCCrates.CC3, tblCCrates.DateFrom, tblCCrates.DateTo"
sSQL = sSQL & " FROM tblCCrates"
sSQL = sSQL & " WHERE tblCCrates.DateFrom <= #" & LastDateOfDel & "# AND tblCCrates.DateTo >= #" & LastDateOfDel & "#"
sSQL = sSQL & " ORDER BY tblCCrates.DateFrom DESC;"
Set R = D.OpenRecordset(sSQL)
If Not (R.BOF And R.EOF) Then
R.MoveLast
R.MoveFirst
CCrateFor1stSlab = R!CC1
CCrateFor2ndSlab = R!CC2
CCrateFor3rdSlab = R!CC3
R.Close
Set R = Nothing
Else
R.Close
Set R = Nothing
Set D = Nothing
Exit Sub
End If
'----------------------------------
Me.CC_Rate1 = CCrateFor1stSlab
Me.CC_Rate2 = CCrateFor2ndSlab
Me.CC_Rate3 = CCrateFor3rdSlab
'calc percentages
CC1Rate = (CCrateFor1stSlab / 100) / DaysPerMonth
CC2Rate = (CCrateFor2ndSlab / 100) / DaysPerMonth
CC3Rate = (CCrateFor3rdSlab / 100) / DaysPerMonth
'First 15 days CC evaluation
NumDays = IIf(Days >= 15, 15, Days)
Result = pLotVal * CC1Rate * NumDays
sngArray(1, 1) = "1st Slab CC @" & CStr(CCrateFor1stSlab) & "% :"
sngArray(1, 2) = pLotVal
sngArray(1, 3) = NumDays
sngArray(1, 4) = Result
sngTotal = Result
Days = Days - NumDays
'Second 15 days CC evaluation
NumDays = IIf(Days >= 15, 15, Days)
Result = pLotVal * CC2Rate * NumDays
sngArray(2, 1) = "2nd Slab CC @" & CStr(CCrateFor2ndSlab) & "% :"
sngArray(2, 2) = pLotVal
sngArray(2, 3) = NumDays
sngArray(2, 4) = Result
sngTotal = sngTotal + Result
Days = Days - NumDays
'subsequent each 30 days value and CC evaluation
For i = 3 To ArrayUB
NumDays = IIf(Days >= DaysPerMonth, DaysPerMonth, Days)
DaysVal = IIf(i = 3, pLotVal + sngTotal, DaysVal + Result)
Result = DaysVal * CC3Rate * NumDays
' sngArray(i) = Result
Select Case i
Case 3
sString = "3rd"
Case Else
sString = CStr(i) & "th"
End Select
sngArray(i, 1) = sString & " Slab CC @" & CStr(CCrateFor3rdSlab) & "% :"
sngArray(i, 2) = Round(DaysVal + 0.5, 0)
sngArray(i, 3) = NumDays
sngArray(i, 4) = Result
sngTotal = sngTotal + Result
Days = Days - NumDays
Next
'-------------------------------
'this is where you would update a (temp) table for the report.
'I was thinking of a form/subform display.
' 1 -----> many
' Contracts----->tblDetails
D.Execute "DELETE * FROM tblDetails", dbFailOnError
For i = 1 To ArrayUB
sSQL = "INSERT INTO tblDetails (ContractNumberFK, LabelSlab, Slab, Days, Amt, theTotal, theOrder)"
sSQL = sSQL & " VALUES (" & C_num & ", '" & sngArray(i, 1) & "', " & sngArray(i, 2) & ", " & sngArray(i, 3) & ", " & sngArray(i, 4) & ", " & sngTotal & ", " & i & ");"
' Debug.Print sSQL
D.Execute sSQL, dbFailOnError
Next
'-------------------------------
'Total CC
Me.TotalAmt = sngTotal
Me.Refresh
Set D = Nothing
End Sub