Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-04-2008
Avatar de chino150
chino150 chino150 is offline
Miembro
 
Registrado: dic 2007
Posts: 86
Poder: 17
chino150 Va por buen camino
Programa para amortización de prestamos

Hola todos.

Necesito ayuda con lo que es amortización como lo logro uso el database desktop y delphi 5 el usuario inserta el capital y la tasa de interes y el numero de cuotas presona un botton para los calculos donde se muestran los resultados en un dbgrid #Pagare, ValorActual,Interes, Amortización, MontoCuota, ValorFuturo.

Gracias!!!!!
Responder Con Cita
  #2  
Antiguo 07-04-2008
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
Hola chino150, te dejo aquí el código que uso en un procedimiento almacenado para el calculo de cuotas de de amortización de Leasing, pero puede valerte para la amortización de cualquier tipo de prestamo. Espero que puedas sacar algo en limpio, si no entiendes pregunta, ahora no tengo tiempo y te lo pongo tal cual lo tengo yo en un procedimiento almacenado.

Código SQL [-]
CREATE PROCEDURE CALCULOLEASING (
    in_codben integer,
    in_anoben integer,
    in_importe numeric(15,2),
    in_vresidual numeric(15,2),
    in_interes float,
    in_periodicidade integer,
    in_cuotas integer,
    in_fecini date,
    in_mult integer,
    in_iso numeric(15,2))
returns (
    ou_cuota numeric(15,2),
    ou_cfin numeric(15,2),
    ou_pendente numeric(15,2))
as
declare variable v_int float;
declare variable v_acumulado numeric(15,2);
declare variable v_ncuota integer;
declare variable v_dia integer;
declare variable v_mes integer;
declare variable v_ano integer;
declare variable v_pam numeric(15,4);
declare variable v_afi numeric(15,2);
declare variable v_data date;
declare variable v_cuofisini numeric(15,2);
declare variable v_imp numeric(15,2);
begin
  v_data = in_fecini;

  --Calculamos o tipo de interes en tanto por 1 que lle corresponde á
  --periodicidade escollida
  v_int = (in_interes * in_periodicidade)/ 1200;

  if (in_vresidual is null) then --Valor residual igual a unha cuota
    begin
      --Calculamos a cuota mensual
      Ou_cuota = Redondeo(in_importe * Exp((1 + v_int),in_cuotas), 2);

      Ou_cuota = Redondeo(Ou_cuota / ((((1 + v_int) *
                                        (1 -(1 / Exp((1 + v_int), in_cuotas))) *
                                        Exp((1 + v_int), in_cuotas)
                                       )
                                       / v_int) +
                                      1
                                     ), 2);
      in_vresidual = Ou_cuota;
    end
  else  --Valor residual introducido polo usuario
    begin
       Ou_cuota = Redondeo(in_importe - (in_vresidual / Exp((1 + v_int),in_cuotas)), 2);

       Ou_cuota = Redondeo((Ou_cuota * v_int) / ((1+ v_int) * (1 - (1/Exp((1 + v_int), in_cuotas)))), 2);
    end

  v_ncuota = 0;
  v_acumulado = 0;
  ou_pendente = in_importe;
  v_dia = cast(extract(day from in_fecini) as integer);

  while (v_ncuota < in_cuotas - 1) do
    begin
      v_ncuota = v_ncuota +1;

      Ou_cfin = Redondeo((ou_pendente - Ou_cuota) * v_int, 2);

      v_acumulado = Redondeo(v_acumulado + Ou_cfin, 2);

      ou_pendente = Redondeo(ou_pendente - Ou_cuota + Ou_cfin, 2);

      --Se o código do ben é nulo tratase dunha simulación, polo tanto so
      --devolvemos o resultado do calculo das cuotas de leasing
      if (in_codben is null) then
        suspend;
      else --Se non se trata dunha simulación introducimos os datos na táboa de leasing
        begin
          insert into Leasing values (:in_codben, :in_anoben, :v_data, :ou_cuota,
                                      :ou_cfin, :ou_pendente, 0, 0, 0);

          --Calculamos a fecha de pago da próxima cuota
          v_mes = cast(extract(month from v_data) as integer);
          v_ano = cast(extract(year from v_data) as integer);

          if (v_mes = 12) then
            begin
               v_mes = in_periodicidade;
               v_ano = v_ano + 1;
            end
          else
            v_mes = v_mes + in_periodicidade;

          if (v_mes > 12) then
            begin
              v_mes = v_mes - 12;
              v_ano = v_ano + 1;
            end

          if ((v_mes <> 2) or (v_dia <= 28)) then
            v_data = cast(v_mes || '/' || v_dia || '/' || v_ano as date);
          else
            begin
              if (bisiesto(v_ano) = 1) then
                v_data = cast(v_mes || '/' || 29 || '/' || v_ano as date);
              else
                v_data = cast(v_mes || '/' || 28 || '/' || v_ano as date);
            end
        end
    end

  v_ncuota = v_ncuota + 1;

  Ou_cfin = Redondeo(Ou_cuota * (v_ncuota) + in_vresidual - in_importe - v_acumulado, 2);

  Ou_pendente = Redondeo(ou_pendente - ou_cuota + Ou_cfin, 2);

  --Se o código do ben é nulo tratase dunha simulación, polo tanto so devolvemos
  --o resultado do calculo das cuotas de leasing
  if (in_codben is null) then
    suspend;
  else --Se non se trata dunha simulación introducimos os datos na táboa de leasing e actualizamos o valor residual
    begin
      insert into Leasing values (:in_codben, :in_anoben, :v_data, :ou_cuota,
                                  :ou_cfin, :ou_pendente, 0, 0, 0);

      update bens
      set vre_be = :in_vresidual
      where cod_Be = :in_codben and ano_be = :in_anoben;

      -- Introducimos a cuota pertencente ao valor residual no caso de que este
      -- sexa distinto de 0
      if (in_vresidual > 0) then
        begin
          --Calculamos a fecha de pago da próxima cuota
          v_mes = cast(extract(month from v_data) as integer);
          v_ano = cast(extract(year from v_data) as integer);

          if (v_mes = 12) then
            begin
              v_mes = in_periodicidade;
              v_ano = v_ano + 1;
            end
          else
            v_mes = v_mes + in_periodicidade;

          if (v_mes > 12) then
            begin
              v_mes = v_mes - 12;
              v_ano = v_ano + 1;
            end

          if ((v_mes <> 2) or (v_dia <= 28)) then
            v_data = cast(v_mes || '/' || v_dia || '/' || v_ano as date);
          else
            begin
              if (bisiesto(v_ano) = 1) then
                v_data = cast(v_mes || '/' || 29 || '/' || v_ano as date);
              else
                v_data = cast(v_mes || '/' || 28 || '/' || v_ano as date);
            end

          -- Insertamos a cuota Leasing
          insert into Leasing values (:in_codben, :in_anoben, :v_data, :in_vresidual,
                                      0, 0, 0, 0, 0);

          in_cuotas = in_cuotas + 1;
        end

      -- Calculamos a porcentaxe de amortización anual
      select Redondeo(Pam_be/100, 4)
      from bens
      where cod_be = :in_codben and ano_be = :in_anoben
      into :V_PAM;

      v_pam = v_pam * in_mult;

      -- Calculamos a cuota fiscal
      v_afi = Redondeo(in_importe * v_pam, 2);
      v_afi = Redondeo(v_afi / truncar(12/in_periodicidade), 2);

      -- Calculamos a primeira cuota parcial, no caso que non se inicie
      -- a amortización ao principio do periodo
      v_cuofisini = mod((cast(extract(month from in_fecini) as integer) - 1), in_periodicidade);
      v_cuofisini = Redondeo(v_afi * (in_periodicidade - v_cuofisini) / in_periodicidade, 2);

      v_ncuota = 0;
      v_data = in_fecini;

      while ((in_importe > 0) or (v_ncuota < in_cuotas)) do
        begin
          v_ncuota = v_ncuota + 1;

          if (v_ncuota = 1) then
            v_imp = v_cuofisini;
          else if (in_importe = 0) then
            v_imp = 0;
          else if (v_imp >= in_importe) then
            v_imp = in_importe;
          else
            v_imp = v_afi;

          if (v_ncuota <= in_cuotas) then
            update leasing
            set afi_le = :V_IMP, iso_le = Redondeo((cuo_le - cfi_le - :v_imp) * :in_iso, 2)
            where cbe_le = :in_codben and abe_le = :in_anoben and
                  fec_le = :V_DATA;
          else
            insert into leasing values(:in_codben, :in_anoben, :v_data, 0,
                                       0, 0, 0, :V_IMP, Redondeo(-:v_imp * :in_iso, 2));

          if (in_importe > 0) then
            in_importe = in_importe - v_imp;

          --Calculamos a data de pago da próxima cuota
          v_mes = cast(extract(month from v_data) as integer);
          v_ano = cast(extract(year from v_data) as integer);

          if (v_mes = 12) then
            begin
               v_mes = in_periodicidade;
               v_ano = v_ano + 1;
            end
          else
            v_mes = v_mes + in_periodicidade;

          if (v_mes > 12) then
            begin
              v_mes = v_mes - 12;
              v_ano = v_ano + 1;
            end

          if ((v_mes <> 2) or (v_dia <= 28)) then
            v_data = cast(v_mes || '/' || v_dia || '/' || v_ano as date);
          else
            begin
              if (bisiesto(v_ano) = 1) then
                v_data = cast(v_mes || '/' || 29 || '/' || v_ano as date);
              else
                v_data = cast(v_mes || '/' || 28 || '/' || v_ano as date);
            end
        end
    end
end

Los comentarios están en gallego, espero que no sea inconveniente.

Un saúdo, y lo dicho, si no entiendes pregunta, pero ahora mismo tengo que marchar.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)

Última edición por Ivanzinho fecha: 07-04-2008 a las 22:52:08.
Responder Con Cita
  #3  
Antiguo 14-04-2008
Avatar de chino150
chino150 chino150 is offline
Miembro
 
Registrado: dic 2007
Posts: 86
Poder: 17
chino150 Va por buen camino
Hola

No entiendo nada pero esto es el codigo que estoy utilizando todo funciona bien lo unico que no me funciona el FV Valor Futuro y el valor actual.

Codigo Delphi [-]

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
NPeriods, IniValue, FinValue : Integer;
Principal, Pago, Interest, Rate, PI : Double;
Amortizacion, FV : Double;

begin
Rate := TAmorTasa_Anual.Value;
TAmor.FieldValues['Pagos_X_Ano']:= StrToInt(Edit1.Text);
NPeriods := StrToInt(Edit1.Text);
//NPeriods2 := StrToInt(Edit1.Text);
IniValue := 1;
FinValue := NPeriods;
Principal := TAmorMonto_Prestamo.Value;
Interest := Principal * Rate;
PI := Interest/NPeriods;
//PV := Principal;
FV := Principal + Interest;
Pago := FV / NPeriods;
Amortizacion := Principal/NPeriods;
for NPeriods := finvalue downto IniValue do
begin
TAmor.Insert;
TAmorCuota.Value := Pago;
TAmorInteres.Value := PI;
TAmorAmortizacion.Value := Amortizacion;
TAmorPagares.Value := NPeriods;
TAmorPago_Calculado.Value := Pago;
TAmorMonto_Prestamo.Value := Principal;
TAmorTasa_Anual.Value := Rate;
TAmorsaldo_Final.Value := FV - Pago;
end;
end;


Gracias mill!!!
Responder Con Cita
  #4  
Antiguo 15-04-2008
Avatar de Ivanzinho
[Ivanzinho] Ivanzinho is offline
Miembro Premium
 
Registrado: ene 2005
Ubicación: Galicia
Posts: 595
Poder: 20
Ivanzinho Va por buen camino
No entiendo muy bien lo que hace tu código, pero te voy a explicar como lo hago yo.

El procedimiento que muestro arriba está preparado para el calculo de cuotas de amortización leasing, por lo que voy a realizar unos pequeños cambios en las formulas para acoplarlo a tus necesidades, que se tratan de la amortización de un prestamo. Para el calculo de de la cuota voy a utilizar el metodo francés, que es el más utilizado para estos casos. En caso de querer utilizar otro sólo tendrías que cambiar la formula.

Las paremetros de entrada utilizados son los siguientes :

Código Delphi [-]
  in_codben : integer, //no lo necesitas
  in_anoben : integer, //no lo necesitas
  in_importe : Double, //Importe a amortizar
  in_vresidual : numeric(15,2), //no lo necesitas
  in_interes : Double; //Interes anual del préstamo
  in_periodicidade : integer; //Periodicidad de los pagos en nº de meses : mensual(1), trimestral(3), semestral(6), anual(12), ....
  in_cuotas : integer; //nº de cuotas a amortizar
  in_fecini : date; //Fecha de primera cuota
  in_mult : integer, //no lo necesitas
  in_iso : Double//no lo necesitas

Los campos que no necesitas son utilizados para la gestión de inmovilizado y el cálculo de las cuotas fiscales.

El siguiente paso es calcular la cuota de amortización, aquí realicé unos pequeños cambios para ajustarlo a tus necesitades. El método utilizado es el método francés.

Código Delphi [-]
  //Calculamos el tipo de interés en tanto por 1 que le corresponde a
  //la periodicidad escogida
  v_int = (in_interes * in_periodicidade)/ 1200;

  //Calculamos la cuota utilizando el método francés
  ou_cuota = Redondeo(in_importe * v_int, 2);

  ou_cuota = Redondeo(ou_cuota / (1 - Exp((1 + v_int), - in_cuotas)), 2);

Una vez calculada la cuota a pagar pasamos a calcular qué parte de esa cuota corresponde a la amortización del préstamo y cuál al pago de los intereses en cada período.

Código Delphi [-]
  v_ncuota = 0;//nº de cuota
  v_acumulado = 0;//Carga finaciera acumulada
  ou_pendente = in_importe;//Importe pendiente de amortizar
  v_fecha = in_fecha //Fecha pago de la cuota 

  while (v_ncuota < in_cuotas - 1) do
    begin
      v_ncuota = v_ncuota +1;

      //Carga financiera para el período n. 
      //Aquí tendrás que distinguir si el pago es al principio del período o al final.

      //En el primero de los casos los intereses se calcularían así
      if pago = finalperiodo then
        Ou_cfin = Redondeo((ou_pendente) * v_int, 2)
      else//Y en el segundo de la siguiente manera
      Ou_cfin = Redondeo((ou_pendente - Ou_cuota) * v_int, 2);//Aquí estás pagando los interses de la cuota n+1 por anticipado,
                                                              //Puesto que al pagarse al principio del periodo la primera cuota
                                                              //no tiene intereses.

      //Intereses acumulados
      v_acumulado = Redondeo(v_acumulado + Ou_cfin, 2);

      //Importe pendiente de amortizar
      ou_pendente = Redondeo(ou_pendente - Ou_cuota + Ou_cfin, 2);

      v_fecha = SiguienteFecha(v_fecha, in_periodicidade)

      //La función redondeo redondea un número real pasado como parámetro al número de 
      //decimales también pasados com parámetro

      //La función SiguienteFecha cálcula la fecha de siguiente amortización en base 
      //a la fecha de amortización actual y la periodicidad de las amortizaciones
    end

  //Calculo de la última cuota
  v_ncuota = v_ncuota + 1;

  //Ajustamos los intereses para que la cuota quede correcta, ya que por culpa de los 
  //redondeos se pudo haber cobrado de más o de menos. También se podería dejar los intereses
  //que tocasen y ajustar en el importe de amortización, puedes encontrarte de todo, esto ya 
  //depende de como lo desee realizar a la empresa que realiza el préstamo.
  Ou_cfin = Redondeo(Ou_cuota * (v_ncuota) + in_vresidual - in_importe - v_acumulado, 2);

  //Importe pendiente de amortizar, si todo ha ido bien debería quedar cero
  Ou_pendente = Redondeo(ou_pendente - ou_cuota + Ou_cfin, 2);

Espero que te sirva

Un saúdo.
__________________
Si no lees esto no vivirás tranquilo
Non lle poñades chatas â obra namentras non se remata. O que pense que vai mal que traballe n’ela; hai sitio para todos. (Castelao)
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Modulo de prestamos personales chino150 Varios 0 02-01-2008 18:34:05
programa de prestamos en delphi ingmichel Internet 3 24-08-2007 05:10:36
programa para ver en que direccion del registro de windows escribe un programa? JuanErasmo Varios 1 09-11-2006 20:42:05
programa para instalar alfil123 Varios 1 20-10-2006 10:56:31
¿ayuda para un programa para el msn kaiser_robert Internet 1 15-06-2005 20:52:07


La franja horaria es GMT +2. Ahora son las 11:58:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi