none
Amortizacion de prestamos en C# RRS feed

  • Pregunta

  • Saludos,

    Quisiera me ayudaran con el siguiente ejercicio. 

    Estoy creando una aplicacion en C# Windows Form para guardar los prestamos que realizo a clientes y quisiera poder crear una tabla de amortizacion del prestamo como se hace en excel.  Ejemplo:

    Prestamo: 10,000

    Plazo(Meses): 3

    Interes(Mensual): 10%

    Con estos datos me gustaria generar la tabla indicando no solo el valor de la cuota del prestamo si no mostrar el detalle de la cuota en datagrid por ejemplo: 

    Valor de cuota mensual: 4,021.15

    Cuota #                        Capital                           Interes                      Pendiente

        1                            3,021.15                          1,000                        6,9788.85  

        2                            3,323.29                          697.89                       3,655.59

        3                            3,655.59                          365.56                            0

    Quisiera generar esto en C# windows Form, Gracias.


    viernes, 16 de marzo de 2018 11:40

Respuestas

  • Te paso una clase que hice para calcular planes de pagos para viviendas. Todos los cálculos se realizan en la clase Cuota, la cual tiene la propiedades: Nro, Valor, Amortización, Intereses, TotalAmortizado y Saldo. Luego puedes obtener una lista de cuotas con un bucle.

      public class Cuota
      {
    
    #region Cosntructores
    
        public Cuota(double monto, int mesesPlazo, double taza)
        {
          this.Nro = 1;
          this.valor = CalcularCuota(monto, mesesPlazo, taza);
          this.totalAmortizado = CalcularTotalAmortizado(monto, mesesPlazo, 1, taza);
          this.amortizacion = totalAmortizado;
          this.saldo = CalcularSaldo(monto, mesesPlazo, 1, taza);
        }
    
        public Cuota(int nro, double monto, int mesesPlazo, double taza)
        {
          this.Nro = nro;
          this.valor = CalcularCuota(monto, mesesPlazo, taza);
          this.totalAmortizado = CalcularTotalAmortizado(monto, mesesPlazo, 1, taza);
          this.amortizacion = totalAmortizado;
          this.saldo = CalcularSaldo(monto, mesesPlazo, 1, taza);
        }
    
        public Cuota(int nro, double monto, int mesesPlazo, int periodoActual, double taza)
        {
          this.Nro = nro;
          this.valor = CalcularCuota(monto, mesesPlazo, taza);
          this.totalAmortizado = CalcularTotalAmortizado(monto, mesesPlazo, periodoActual, taza);
          this.amortizacion = CalcularAmortizacion(monto, mesesPlazo, periodoActual, taza);
          this.saldo = CalcularSaldo(monto, mesesPlazo, periodoActual, taza);
        }
    
    #endregion Cosntructores
    
    #region Propiedades
    
        public int Nro { get; set; }
    
        private double valor;
        public double Valor 
        {
          get { return valor; }
        }
    
        private double amortizacion;
        public double Amortizacion
        {
          get { return amortizacion; }
        }
    
        public double Interes
        {
          get { return valor - amortizacion; }
        }
    
        private double totalAmortizado;
        public double TotalAmortizado
        {
          get { return totalAmortizado; }
        }
    
        private double saldo;
        public double Saldo
        {
          get { return saldo; }
        }
    
    #endregion Propiedades
    
    
    #region Metodos Privados
    
        private double CalcularCuota(double monto, int mesesPlazo, double taza)
        {      
          /***** FORMULA DE CALCULO
           * PMT = -RATE * ( FV + PV * Math.pow(1+RATE,NPER)) / ((Math.pow(1+RATE,NPER)-1));
           */
    
          double t = taza / 1200;
          double b = Math.Pow((1 + t), mesesPlazo);
          return t * monto * b / (b - 1);
        }
    
        private double CalcularAmortizacion(double monto, int mesesPlazo, int periodo, double taza)
        {
          double totAmortAnterior=0;
          if (periodo > 1)
            totAmortAnterior = CalcularTotalAmortizado(monto, mesesPlazo, periodo - 1, taza);
    
          return TotalAmortizado - totAmortAnterior;
        }
    
        private double CalcularTotalAmortizado(double monto, int n, int p, double taza)
        {
          double t = taza / 1200;
          double b = Math.Pow((1 + t), n);
          double c = Math.Pow((1 + t), p);
          return monto * ((c - 1) / (b - 1));
        }
    
        private double CalcularSaldo(double monto, int mesesPlazo, int periodo, double taza)
        {
          double t = taza / 1200;
          double b = Math.Pow((1 + t), mesesPlazo);
          double c = Math.Pow((1 + t), periodo);
          return monto * (1-((c - 1) / (b - 1)));
        }
    
    
    #endregion Metodos Privados
    
      }
    
     

    Esta función te devolverá una la lista de cuotas correspondientes a los parámetros monto, periodos y taza.

        private List<Cuota> ListaCuotas(double monto, int periodos, double taza)
        {
          List<Cuota> cuotas = new List<Cuota>();
          Cuota c;
    
          for (int i = 1; i <= periodos; i++)
          {
            c = new Cuota(i, monto, periodos, i, taza);
          }
    
          return cuotas;
        }
    

    lunes, 19 de marzo de 2018 14:49
  • para mostrar en una grilla, (asumo que ya tenes la clase Cuota y la función ListaCuota que te mostré mas arriba) en el evento click de un boton para calcular las cuotas escribís este código;

        private void btnCalcularCuota_Click(object sender, EventArgs e)
        {
            double m = double.Parse(txtMonto.Text); //el monto de la deuda
            int p = int.Parse(txtPeriodos.Text); //La cantidad de meses o cuotas
            double t = double.Parse(txtTaza.Text); //La taza de interes
            List<Cuota> cuotas = ListaCuotas(m, p, t);
            grCuotas.DataSource = null;
            grCuotas.DataSource = cuotas;
        }
    

    martes, 20 de marzo de 2018 23:30
  • Ya encontré el error, faltó agregar las cuotas creadas a la lista cuotas. Aquí está:

        private List<Cuota> ListaCuotas(double monto, int periodos, double taza)
        {
          List<Cuota> cuotas = new List<Cuota>();
          Cuota c;
    
          for (int i = 1; i <= periodos; i++)
          {
            c = new Cuota(i, monto, periodos, i, taza);
            cuotas.Add(c);
          }
    
          return cuotas;
        }
      }


    • Editado AntiWork viernes, 23 de marzo de 2018 3:57
    • Marcado como respuesta ing. John Vargas viernes, 23 de marzo de 2018 13:37
    viernes, 23 de marzo de 2018 3:57

Todas las respuestas

  • Hola ing. John Vargas,

    En ralacion a tu consulta te comento que lo que debes de hacer es manipular las filas y columnas para que muestren los resultados que deseas, te comparto un enlace donde se muestra mas a detalle como manipular los datagridview, de cualquier forma quedo atento a tus comentarios.

    https://docs.microsoft.com/es-es/dotnet/framework/winforms/controls/how-to-manipulate-rows-in-the-windows-forms-datagridview-control

    Saludos cordiales, gracias por usar los foros de MSDN

    Tonatiuh Abrego

    _____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft. 

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    viernes, 16 de marzo de 2018 23:55
    Moderador
  • Deleted
    sábado, 17 de marzo de 2018 0:29
  • He visto el link que enviaste, perdon por la ignorancia pero soy nuevo en la programacion. 

    miqui quilmes, si tengo interes en los comentarios de las personas que me puedan ayudar. 

    Gracias.

    lunes, 19 de marzo de 2018 11:29
  • Una forma de realizarlo en el DataGgridView seria crear un DataTable y mediante un bucle For ir calculando y añadiendo los resultados en las filas del DataTable, la cual asignaras al DataSourse del DataGridView.

                double prestamo = 10000;
                double plazo = 3;
                double interesporcentaje = 10;
    
                double saldo = prestamo;
                double interes = 0;
                double cuotamensual = 4021.15;
                double capital = 0;
    
    
                DataTable dt = new DataTable();
                dt.Columns.Add("NroCuota", typeof(int));
                dt.Columns.Add("Capital", typeof(double));
                dt.Columns.Add("Interes", typeof(double));
                dt.Columns.Add("cuotaMensual", typeof(double));
                dt.Columns.Add("Pendiente", typeof(double));
               for (int i = 1; i <= plazo; i++)
                {
                    interes = (saldo * interesporcentaje)/100;
                    capital = cuotamensual - interes;
                    saldo = saldo - capital;
                    dt.Rows.Add(i, capital, interes, cuotamensual, saldo);
                }
    
                dataGridView3.DataSource = dt;

    Y el resultado seria este

    Obs: Los cálculos son de ejemplo no sabría decirte si son correctos.

    Espero te sirva de ayuda.

    Saludos.



    lunes, 19 de marzo de 2018 14:14
  • Te paso una clase que hice para calcular planes de pagos para viviendas. Todos los cálculos se realizan en la clase Cuota, la cual tiene la propiedades: Nro, Valor, Amortización, Intereses, TotalAmortizado y Saldo. Luego puedes obtener una lista de cuotas con un bucle.

      public class Cuota
      {
    
    #region Cosntructores
    
        public Cuota(double monto, int mesesPlazo, double taza)
        {
          this.Nro = 1;
          this.valor = CalcularCuota(monto, mesesPlazo, taza);
          this.totalAmortizado = CalcularTotalAmortizado(monto, mesesPlazo, 1, taza);
          this.amortizacion = totalAmortizado;
          this.saldo = CalcularSaldo(monto, mesesPlazo, 1, taza);
        }
    
        public Cuota(int nro, double monto, int mesesPlazo, double taza)
        {
          this.Nro = nro;
          this.valor = CalcularCuota(monto, mesesPlazo, taza);
          this.totalAmortizado = CalcularTotalAmortizado(monto, mesesPlazo, 1, taza);
          this.amortizacion = totalAmortizado;
          this.saldo = CalcularSaldo(monto, mesesPlazo, 1, taza);
        }
    
        public Cuota(int nro, double monto, int mesesPlazo, int periodoActual, double taza)
        {
          this.Nro = nro;
          this.valor = CalcularCuota(monto, mesesPlazo, taza);
          this.totalAmortizado = CalcularTotalAmortizado(monto, mesesPlazo, periodoActual, taza);
          this.amortizacion = CalcularAmortizacion(monto, mesesPlazo, periodoActual, taza);
          this.saldo = CalcularSaldo(monto, mesesPlazo, periodoActual, taza);
        }
    
    #endregion Cosntructores
    
    #region Propiedades
    
        public int Nro { get; set; }
    
        private double valor;
        public double Valor 
        {
          get { return valor; }
        }
    
        private double amortizacion;
        public double Amortizacion
        {
          get { return amortizacion; }
        }
    
        public double Interes
        {
          get { return valor - amortizacion; }
        }
    
        private double totalAmortizado;
        public double TotalAmortizado
        {
          get { return totalAmortizado; }
        }
    
        private double saldo;
        public double Saldo
        {
          get { return saldo; }
        }
    
    #endregion Propiedades
    
    
    #region Metodos Privados
    
        private double CalcularCuota(double monto, int mesesPlazo, double taza)
        {      
          /***** FORMULA DE CALCULO
           * PMT = -RATE * ( FV + PV * Math.pow(1+RATE,NPER)) / ((Math.pow(1+RATE,NPER)-1));
           */
    
          double t = taza / 1200;
          double b = Math.Pow((1 + t), mesesPlazo);
          return t * monto * b / (b - 1);
        }
    
        private double CalcularAmortizacion(double monto, int mesesPlazo, int periodo, double taza)
        {
          double totAmortAnterior=0;
          if (periodo > 1)
            totAmortAnterior = CalcularTotalAmortizado(monto, mesesPlazo, periodo - 1, taza);
    
          return TotalAmortizado - totAmortAnterior;
        }
    
        private double CalcularTotalAmortizado(double monto, int n, int p, double taza)
        {
          double t = taza / 1200;
          double b = Math.Pow((1 + t), n);
          double c = Math.Pow((1 + t), p);
          return monto * ((c - 1) / (b - 1));
        }
    
        private double CalcularSaldo(double monto, int mesesPlazo, int periodo, double taza)
        {
          double t = taza / 1200;
          double b = Math.Pow((1 + t), mesesPlazo);
          double c = Math.Pow((1 + t), periodo);
          return monto * (1-((c - 1) / (b - 1)));
        }
    
    
    #endregion Metodos Privados
    
      }
    
     

    Esta función te devolverá una la lista de cuotas correspondientes a los parámetros monto, periodos y taza.

        private List<Cuota> ListaCuotas(double monto, int periodos, double taza)
        {
          List<Cuota> cuotas = new List<Cuota>();
          Cuota c;
    
          for (int i = 1; i <= periodos; i++)
          {
            c = new Cuota(i, monto, periodos, i, taza);
          }
    
          return cuotas;
        }
    

    lunes, 19 de marzo de 2018 14:49
  • Te pido José que elimines esta respuesta. Es por tu causa que yo mismo no puedo eliminarla.

    De todas formas, el autor del hilo no ha demostrado interés en la respuesta.

     
    Sería genial si dejara de borrar las contribuciones realmente útiles que aporta.  ¿Cuál es su propósito?  Primero aporta una buena respuesta, luego decide borrarla.  Veo que también tiene problemas con la mayoría (¿o todos?) los moderadores y expertos que participan aquí.  Si tan molesto es este foro, ¿por qué participa en él?  No me malinterprete, me parece muy bien que participe pues parece ser una persona muy conocedora de los temas.  O sea, mi pregunta es una pregunta honestamente hecha por curiosidad solamente.  Me intriga.

    Jose R. MCP
    Code Samples

    lunes, 19 de marzo de 2018 17:14
    Moderador
  • Deleted
    martes, 20 de marzo de 2018 16:05
  • Hola miqui Quilmes,

    Espero estés teniendo un excelente día.

    He leído lo sucedido en esta conversación y te solicitamos de favor evitar el lenguaje altisonante, te recuerdo que ya ha habido varios temas con el Moderador Pablo Rubio, por favor déjanos saber tus comentarios para poder ponernos en contexto en este tema.

    Recibe un cordial saludo.

    Gracias por usar los foros de MSDN.

    Juan
     _____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    martes, 20 de marzo de 2018 16:34
    Moderador
  • Hola hermano, 

    Gracias por todas sus respuestas de antemano, 

    Quisiera saber como hago para mostrar esta informacion en un grid. 

    Gracias tambien a osrol, lo hice como indicas y funciona


    martes, 20 de marzo de 2018 17:20
  • para mostrar en una grilla, (asumo que ya tenes la clase Cuota y la función ListaCuota que te mostré mas arriba) en el evento click de un boton para calcular las cuotas escribís este código;

        private void btnCalcularCuota_Click(object sender, EventArgs e)
        {
            double m = double.Parse(txtMonto.Text); //el monto de la deuda
            int p = int.Parse(txtPeriodos.Text); //La cantidad de meses o cuotas
            double t = double.Parse(txtTaza.Text); //La taza de interes
            List<Cuota> cuotas = ListaCuotas(m, p, t);
            grCuotas.DataSource = null;
            grCuotas.DataSource = cuotas;
        }
    

    martes, 20 de marzo de 2018 23:30
  • Muchas gracias AntiWork

    He hecho todo lo que me has indicado pero el grid me queda de esta forma: 

    Sin datos 

    miércoles, 21 de marzo de 2018 18:36
  • En el ultimo codigo que te pasé poné un punto de interrupción donde dice grCuotas.DataSource=null; y fijate cuantos elementos tiene la variable "cuotas".

    Tené en cuenta que txtMonto, txtPeriodos y txtTaza son cajas de textos del form en el que estás haciendo el calculo y tenes que ponerle los datos que corresponda. Controlá también el tema del separador decimal.

    jueves, 22 de marzo de 2018 12:52
  • Ya encontré el error, faltó agregar las cuotas creadas a la lista cuotas. Aquí está:

        private List<Cuota> ListaCuotas(double monto, int periodos, double taza)
        {
          List<Cuota> cuotas = new List<Cuota>();
          Cuota c;
    
          for (int i = 1; i <= periodos; i++)
          {
            c = new Cuota(i, monto, periodos, i, taza);
            cuotas.Add(c);
          }
    
          return cuotas;
        }
      }


    • Editado AntiWork viernes, 23 de marzo de 2018 3:57
    • Marcado como respuesta ing. John Vargas viernes, 23 de marzo de 2018 13:37
    viernes, 23 de marzo de 2018 3:57
  • Hermano muchisimas gracias!!

    Funciona perfectamente

    viernes, 23 de marzo de 2018 13:37
  •   if (saldo <0)
                    {
                        saldo = 0;
                    }

    para que de cero el saldo

    lunes, 18 de junio de 2018 11:43