Click here to Skip to main content
15,308,835 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I have created a system that will calculate monthly payment for loan. Everything seems to be okay but when I calculate the monthly and will display it in datagridview first months is okay but the rest months is only the same with each other. It should be different until it reach zero balance.

Months        Sequence  Cash Flow     Interest  Principal  Balance      Interest 2
August, 2018	1	    1,555.00	   93.64	  229.12    7,261.88	87.64
September,2018	2	    1,555.00	   93.64	  229.12    7,261.88	87.64
October, 2018	3	    1,555.00	   93.64	  229.12    7,261.88	87.64
November, 2018	4	    1,555.00	   93.64	  229.12    7,261.88	87.64
December, 2018	5	    1,555.00	   93.64	  229.12    7,261.88	87.64

What I have tried:

Here's my code

'Formula Sample
        P = MonthPay.Text 'Monthly dblMonthlyPayment
        Num = NoTerms.Text 'Number of Terms
        r = Val(IntRate.Text / 100) / 12 'Interest dblIntRate
        I = r
        PVIFA = 1 / I - 1 / (I * (1 + I) ^ Num)
        pmt = dblPV / PVIFA
        IPmt = (r * intSeq) * (Num ^ 12) * PV.Text

        'Clear the ListBox

        Dim dt As New DataTable
        Dim dr As DataRow
        Dim result As New List(Of String)

   dt.Columns.AddRange(New DataColumn() {New DataColumn("Months", GetType(String)), _
      New DataColumn("Seq#", GetType(Integer)), _
      New DataColumn("Cash Flow", GetType(String)), _
      New DataColumn("Interest", GetType(String)), _
      New DataColumn("Principal", GetType(String)), _
      New DataColumn("Balance", GetType(String)), _
      New DataColumn("Interest2", GetType(String))})

        Do While intSeq <= intNumOfPayments

            CashFlow = dblPV
            PI = dblBalance * I
            PP = MonthPay.Text - PI
            P = dblBalance - PP
            interestPaid2 = dblBalance * int2

            Dim thisDay As DateTime = DateTime.Today.AddMonths(intSeq)
            While thisDay = Now()
                thisDay = thisDay.AddMonths(1)
            End While

            dr = dt.NewRow
            dr("Months") = String.Format("{0:Y}", thisDay)
            dr("Seq#") = intSeq
            dr("Cash Flow") = String.Format("{0:N}", CashFlow)
            dr("Interest") = String.Format("{0:N}", PI)
            dr("Principal") = String.Format("{0:N}", PP)
            dr("Balance") = String.Format("{0:N}", P)
            dr("Interest2") = String.Format("{0:N}", interestPaid2)


            intSeq += 1
        grd_order.DataSource = dt
Updated 25-Jul-18 1:43am
willifritz 25-Jul-18 7:21am
Only the values for intSeq and thisDay are changed inside your loop, I don't really understand what you want to calculate, but all other values are just the same for each iteration as they are calculated once outside the while-loop.
And I would recommend you to give your variables clearly readable names.

1 solution

willfritz is right - the values just don;t change at all inside your loop, so they never change when you display them.

When you get a problem like this, don't ask for help - start with the debugger. 5 minutes with the debugger would have shown you what was happening, and that's a lot quicker (and more rewarding) than waiting for someone else to get round to looking at it! Heck, it's probably quicker than typing the question in the first place! :laugh:

Compiling does not mean your code is right! :laugh:
Think of the development process as writing an email: compiling successfully means that you wrote the email in the right language - English, rather than German for example - not that the email contained the message you wanted to send.

So now you enter the second stage of development (in reality it's the fourth or fifth, but you'll come to the earlier stages later): Testing and Debugging.

Start by looking at what it does do, and how that differs from what you wanted. This is important, because it give you information as to why it's doing it. For example, if a program is intended to let the user enter a number and it doubles it and prints the answer, then if the input / output was like this:
Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Then it's fairly obvious that the problem is with the bit which doubles it - it's not adding itself to itself, or multiplying it by 2, it's multiplying it by itself and returning the square of the input.
So with that, you can look at the code and it's obvious that it's somewhere here:
Private Function Double(ByVal value As Integer) As Integer
    Return value * value
End Function

Once you have an idea what might be going wrong, start using the debugger to find out why. Put a breakpoint on the first line of the method, and run your app. When it reaches the breakpoint, the debugger will stop, and hand control over to you. You can now run your code line-by-line (called "single stepping") and look at (or even change) variable contents as necessary (heck, you can even change the code and try again if you need to).
Think about what each line in the code should do before you execute it, and compare that to what it actually did when you use the "Step over" button to execute each line in turn. Did it do what you expect? If so, move on to the next line.
If not, why not? How does it differ?
Hopefully, that should help you locate which part of that code has a problem, and what the problem is.
This is a skill, and it's one which is well worth developing as it helps you in the real world as well as in development. And like all skills, it only improves by use!

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900