Calcul interets : amortissement constant et variable avec differe ou non

Soyez le premier à donner votre avis sur cette source.

Vue 22 238 fois - Téléchargée 1 236 fois

Description

c'est mon premier prog! indulgence

ce petit prog permet de calculer l'amortissement constant ou variable d'un prêt et prend en compte le delai de differé ou pas.

le fichier "TECHEANCE_CREDIT" du dossier interets est le fichier de DB;
creer un alias "interet" pour la connexion.

encore une fois de plus votre indulgence quant à la qualité du prog

Source / Exemple :


unit Calcul_Interet;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, Menus, DB, DBTables, Buttons, StdCtrls, Mask,
  ExtCtrls, Math, IniFiles;

type
  TF_Calcul_Interet = class(TForm)
    Label24: TLabel;
    Label20: TLabel;
    Label58: TLabel;
    Label25: TLabel;
    Bevel5: TBevel;
    Label1: TLabel;
    SpeedButton1: TSpeedButton;
    RadioGroupTypeAmort: TRadioGroup;
    RadioGroup2: TRadioGroup;
    EditMontant: TEdit;
    MaskEditDateDde: TMaskEdit;
    EditDureeDiffere: TEdit;
    EditDuree: TEdit;
    MaskEditTaux: TMaskEdit;
    ButtonSaisies: TButton;
    BitBtnCalcul: TBitBtn;
    DataSource2: TDataSource;
    Table1: TTable;
    Table1PECHEANCE: TIntegerField;
    Table1DATEECHEANCE: TDateField;
    Table1MENSUALITE: TFloatField;
    Table1CAPITALE_REST: TFloatField;
    Table1INTERETS: TFloatField;
    Table1AMORTISSEMENT: TFloatField;
    Table1MONTANTTVA: TFloatField;
    Table1MENSUALITE_TOTALE: TFloatField;
    Database1: TDatabase;
    DBGrid4: TDBGrid;
    procedure BitBtnCalculClick(Sender: TObject);
    procedure ButtonSaisiesClick(Sender: TObject);
    procedure EditMontantKeyPress(Sender: TObject; var Key: Char);
    procedure EditDureeKeyPress(Sender: TObject; var Key: Char);
    procedure EditDureeDiffereKeyPress(Sender: TObject; var Key: Char);
    procedure MaskEditDateDdeKeyPress(Sender: TObject; var Key: Char);
    procedure SpeedButton1Click(Sender: TObject);
    procedure RadioGroupTypeAmortClick(Sender: TObject);
    procedure RadioGroup2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure CreationAlias(NomAlias,DataDir:String);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  F_Calcul_Interet: TF_Calcul_Interet;

  MontantLigne, Pduree, Amortissement,duree, MontantInterets, MontantP, TVA, Annuite :double;
  TauxP, TauxTVA, DelaiP, differe  :double;

  Year, Month, Day: Word;

  periode,Temps, temps1, Lemois, Annees, Lejour, an, mois, jour, i:integer;
  
  TypeAmort, etat, Interet_Alias :string;
  debut, fin, DPEcheance :Tdate;
implementation

uses Apropos;

{$R *.dfm}

procedure TF_Calcul_Interet.BitBtnCalculClick(Sender: TObject);
Var cumul :double;
begin

 RadioGroup2Click(Sender);
 RadioGroupTypeAmortClick(Sender);

 if RadioGroup2.ItemIndex <> -1 then
 begin
   if RadioGroupTypeAmort.ItemIndex <> -1 then
   begin
     if EditMontant.Text <>'' then
     begin
      if EditDuree.Text <>'' then
      begin
        if MaskEditDateDde.Text <>'  /  /    ' then
        begin
          if MaskEditTaux.Text <>'  ,  ' then
          begin
             TauxTVA :=18.25;

             if RadioGroupTypeAmort.ItemIndex =0 then
             begin
               //Cas amortissement constant
               Table1.Close;
               Table1.EmptyTable;
               Table1.Open;

               If RadioGroup2.ItemIndex =1 then
               begin
                 //Cas amortisssement constant sans differé
                 DecodeDate(strtodate(MaskEditDateDde.Text), Year, Month, Day);

                 Annees := Year;
                 Lemois := Month;
                 Lejour := Day;

                 MontantP:=strtofloat(Editmontant.Text);
                 Tauxp:= strtofloat(MaskEditTaux.Text);
                 temps:=round(strtofloat(editduree.Text));

                 mois:=Lemois;
                 an:=annees;
                 jour:=Lejour;

                 periode:=1;
                 CUMUL :=0;
                 while (periode<=temps) do
                 begin
                   Amortissement:=round(MontantP/temps);
                   MontantInterets:=round((MontantP-CUMUL)* tauxp/100);
                   Annuite:=Amortissement+MontantInterets;
                   TVA:=round(MontantInterets*tauxtva/100);

                   Table1.Append;
                   Table1PECHEANCE.Value     :=periode;
                   Table1DATEECHEANCE.Value  :=Encodedate(an, mois, jour);
                   Table1MENSUALITE.Value    :=Annuite;
                   Table1CAPITALE_REST.Value :=MontantP-CUMUL;
                   Table1AMORTISSEMENT.Value :=Amortissement;
                   Table1INTERETS.Value      :=MontantInterets;
                   Table1MONTANTTVA.Value          :=TVA;
                   Table1MENSUALITE_TOTALE.VALUE   :=Annuite+tva;

                   Table1.Post;

                   if mois=12 then
                   begin
                     inc(an);
                     mois:=1;
                   end
                   else
                   begin
                     inc(mois);
                   end;

                   if mois=2 then
                   begin
                     If jour=29 then
                     begin
                      if IsLeapYear(an) then Jour:=jour else Jour := 28;
                     end
                     else if jour=30 then
                     begin
                       if IsLeapYear(an) then Jour:=29 else Jour := 28;
                     end
                     else if jour=31 then
                     begin
                       if IsLeapYear(an) then Jour:=29 else Jour := 28;
                     end
                     else jour:=Lejour;
                   end
                   else if ((mois=4) or (mois=6) or (mois=9) or (mois=11)) and (jour=31) then
                   begin
                      jour:=30;
                   end
                   else jour:=lejour;

                   periode:=periode+1;
                   cumul:=cumul+Amortissement;
                 end;
               end
               else
               begin
                 //Cas amortissement constant avec differé
                 DecodeDate(strtodate(MaskEditDateDde.Text), Year, Month, Day);

                 Annees := Year;
                 Lemois := Month;
                 Lejour := Day;

                 MontantP:=strtofloat(Editmontant.Text);
                 tauxp   :=strtofloat(MaskEditTaux.Text);
                 differe :=round(strtofloat(EditDureeDiffere.Text));
                 temps   :=round(strtofloat(editduree.Text)+differe);

                 mois   :=Lemois;
                 jour   :=lejour;
                 an     :=annees;
                 periode:=1;
                 CUMUL  :=0;

                 while periode<=temps do
                 begin
                   if periode<=differe then
                   begin
                     //Amortissement:=round(MontantP/strtofloat(editduree.Text));
                     MontantInterets:=round((MontantP* tauxp)/100);
                     //Annuite:=Amortissement+interet;
                     TVA:=round(MontantInterets*tauxtva/100);

                     Table1.Append;
                     Table1PECHEANCE.Value     :=periode;
                     Table1DATEECHEANCE.Value  :=Encodedate(an, mois, jour);
                     Table1MENSUALITE.Value    :=MontantInterets;
                     Table1CAPITALE_REST.Value :=MontantP;
                     Table1AMORTISSEMENT.Value :=Amortissement;
                     Table1INTERETS.Value      :=MontantInterets;
                     Table1MONTANTTVA.Value          :=TVA;
                     Table1MENSUALITE_TOTALE.VALUE   :=Annuite+tva;

                     Table1.Post;
                   end
                   Else
                   begin
                     Amortissement:=round(MontantP/strtofloat(editduree.Text));
                     MontantInterets:=round((MontantP-CUMUL)* tauxp/100);
                     Annuite:=Amortissement+MontantInterets;
                     TVA:=round(MontantInterets*TauxTVA/100);

                     Table1.Append;
                     Table1PECHEANCE.Value     :=periode;
                     Table1DATEECHEANCE.Value  :=Encodedate(an, mois, jour);
                     Table1MENSUALITE.Value    :=Annuite;
                     Table1CAPITALE_REST.Value :=MontantP-CUMUL;
                     Table1AMORTISSEMENT.Value :=Amortissement;
                     Table1INTERETS.Value      :=MontantInterets;
                     Table1MONTANTTVA.Value          :=TVA;
                     Table1MENSUALITE_TOTALE.VALUE   :=Annuite+tva;

                     Table1.Post;
                   end;

                   if mois=12 then
                   begin
                     inc(an);
                     mois:=1;
                    // Lejour:=lejour;
                   end
                   else
                   begin
                     inc(mois);
                   end;

                   if mois=2 then
                   begin
                     If jour=29 then
                     begin
                      if IsLeapYear(an) then Jour:=jour else Jour := 28;
                     end
                     else if jour=30 then
                     begin
                       if IsLeapYear(an) then Jour:=29 else Jour := 28;
                     end
                     else if jour=31 then
                     begin
                       if IsLeapYear(an) then Jour:=29 else Jour := 28;
                     end
                     else jour:=Lejour;
                   end
                   else if ((mois=4) or (mois=6) or (mois=9) or (mois=11)) and (jour=31) then
                   begin
                      jour:=30;
                   end
                   else jour:=lejour;

                 periode:=periode+1;
                 cumul:=cumul+Amortissement;

                 end;
               end;

             end
             else
             begin
               //CAs amortissement variable
               Table1.Close;
               Table1.EmptyTable;
               Table1.Open;

               If RadioGroup2.ItemIndex =1 then
               begin
                 //CAs amortissement variable sans differé
                 DecodeDate(strtodate(MaskEditDateDde.Text), Year, Month, Day);

                 Annees := Year;
                 Lemois := Month;
                 Lejour := Day;

                 MontantP:=strtofloat(Editmontant.Text);
                 tauxP:=strtofloat(MaskEditTaux.Text);
                 temps:=round(strtofloat(editduree.Text));

                 mois:=Lemois;
                 an:=annees;
                 jour:=lejour;
                 periode:=1;
                 CUMUL :=0;
                 while (periode<=temps) do
                 begin
                  Annuite:=round((MontantP*tauxp/100)/(1-power((1+tauxp/100),-temps)));
                  MontantInterets:=round((MontantP-CUMUL)* TAUXP/100);
                  Amortissement:=Annuite-MontantInterets;
                  TVA:=round(MontantInterets*TauxTVA/100);

                   Table1.Append;
                   Table1PECHEANCE.Value     :=periode;
                   Table1DATEECHEANCE.Value  :=Encodedate(an, mois, jour);
                   Table1MENSUALITE.Value    :=Annuite;
                   Table1CAPITALE_REST.Value :=MontantP-CUMUL;
                   Table1AMORTISSEMENT.Value :=Amortissement;
                   Table1INTERETS.Value      :=MontantInterets;
                   Table1MONTANTTVA.Value          :=TVA;
                   Table1MENSUALITE_TOTALE.VALUE   :=Annuite+tva;

                   Table1.Post;

                   if mois=12 then
                   begin
                     inc(an);
                     mois:=1;
                    // Lejour:=lejour;
                   end
                   else
                   begin
                     inc(mois);
                   end;

                   if mois=2 then
                   begin
                     If jour=29 then
                     begin
                      if IsLeapYear(an) then Jour:=jour else Jour := 28;
                     end
                     else if jour=30 then
                     begin
                       if IsLeapYear(an) then Jour:=29 else Jour := 28;
                     end
                     else if jour=31 then
                     begin
                       if IsLeapYear(an) then Jour:=29 else Jour := 28;
                     end
                     else jour:=Lejour;
                   end
                   else if ((mois=4) or (mois=6) or (mois=9) or (mois=11)) and (jour=31) then
                   begin
                      jour:=30;
                   end
                   else jour:=lejour;

                   periode:=periode+1;
                   cumul:=cumul+Amortissement;
                 end;
               end
               else
               begin
                 //Cas amortissement variable avec differé
                 DecodeDate(strtodate(MaskEditDateDde.Text), Year, Month, Day);

                 Annees := Year;
                 Lemois := Month;
                 Lejour := Day;

                 MontantP:=strtofloat(Editmontant.Text);
                 tauxP:=strtofloat(MaskEditTaux.Text);
                 differe:=round(strtofloat(EditDureeDiffere.Text));
                 temps:=round(strtofloat(editduree.Text));
                 temps1:=round(strtofloat(editduree.Text)+differe);

                 mois:=Lemois;
                 an:=annees;
                 jour:=Lejour;
                 periode:=1;
                 CUMUL :=0;
                 while (periode<=temps1) do
                 begin
                   if periode<=differe then
                   begin
                   //Amortissement:=round(MontantP/strtofloat(editduree.Text));
                   MontantInterets:=round((MontantP)* TAUXP/100);
                   //Annuite:=Amortissement+interet;
                   TVA:=round(MontantInterets*TauxTVA/100);

                   Table1.Append;
                   Table1PECHEANCE.Value     :=periode;
                   Table1DATEECHEANCE.Value  :=Encodedate(an, mois, jour);
                   Table1MENSUALITE.Value    :=Annuite;
                   Table1CAPITALE_REST.Value :=MontantP-CUMUL;
                   Table1AMORTISSEMENT.Value :=Amortissement;
                   Table1INTERETS.Value      :=MontantInterets;
                   Table1MONTANTTVA.Value          :=TVA;
                   Table1MENSUALITE_TOTALE.VALUE   :=Annuite+tva;

                   Table1.Post;
                   end
                   Else
                   begin
                     Annuite:=round((MontantP*tauxp/100)/(1-power((1+tauxp/100),-temps)));
                     MontantInterets:=round((MontantP-CUMUL)* TAUXP/100);
                     Amortissement:=Annuite-MontantInterets;
                     TVA:=round(MontantInterets*TauxTVA/100);

                     Table1.Append;
                     Table1PECHEANCE.Value     :=periode;
                     Table1DATEECHEANCE.Value  :=Encodedate(an, mois, jour);
                     Table1MENSUALITE.Value    :=Annuite;
                     Table1CAPITALE_REST.Value :=MontantP-CUMUL;
                     Table1AMORTISSEMENT.Value :=Amortissement;
                     Table1INTERETS.Value      :=MontantInterets;
                     Table1MONTANTTVA.Value          :=TVA;
                     Table1MENSUALITE_TOTALE.VALUE   :=Annuite+tva;

                     Table1.Post;
                   end;

                   if mois=12 then
                   begin
                     inc(an);
                     mois:=1;
                    // Lejour:=lejour;
                   end
                   else
                   begin
                     inc(mois);
                   end;

                   if mois=2 then
                   begin
                     If jour=29 then
                     begin
                      if IsLeapYear(an) then Jour:=jour else Jour := 28;
                     end
                     else if jour=30 then
                     begin
                       if IsLeapYear(an) then Jour:=29 else Jour := 28;
                     end
                     else if jour=31 then
                     begin
                       if IsLeapYear(an) then Jour:=29 else Jour := 28;
                     end
                     else jour:=Lejour;
                   end
                   else if ((mois=4) or (mois=6) or (mois=9) or (mois=11)) and (jour=31) then
                   begin
                      jour:=30;
                   end
                   else jour:=lejour;

                 periode:=periode+1;
                 cumul:=cumul+Amortissement;
                 end;
               end;
            ButtonSaisies.SetFocus;
          end;
          end
          else
          begin
            showmessage('Préciser le taux d''intérêt SVP.');
            MaskEditTaux.SetFocus;
          end;
         end
         else
         begin
           showmessage('Préciser la date de la première écheance SVP.');
           MaskEditDateDde.SetFocus;
         end;
        end
        else
        begin
          showmessage('Préciser la durée du crédit SVP.');
          EditDuree.SetFocus;
        end;
      end
      else
      begin
         showmessage('Préciser le capital du crédit SVP.');
         EditMontant.SetFocus;
      end;
     end
     else
     begin
       showmessage('Préciser le type d''amortissement SVP.');
     end;
   end
   else
   begin
     showmessage('Préciser s''il y a différé ou non.');
   end;
   BitBtnCalcul.Enabled :=false;
   ButtonSaisies.Enabled :=true;
   ButtonSaisies.SetFocus;
end;

procedure TF_Calcul_Interet.ButtonSaisiesClick(Sender: TObject);
begin
 RadioGroupTypeAmort.ItemIndex :=-1;
 RadioGroup2.ItemIndex :=-1;

 EditMontant.SetFocus;
 EditMontant.Clear;
 EditDuree.Clear;
 EditDureeDiffere.Clear;
 MaskEditDateDde.Text :='';
 MaskEditTaux.Text :='';

 BitBtnCalcul.Enabled   :=true;
 ButtonSaisies.Enabled  :=false;

 //Vider la table
 Table1.Close;
 Table1.EmptyTable;
 Table1.Open;
end;

procedure TF_Calcul_Interet.EditMontantKeyPress(Sender: TObject;
  var Key: Char);
begin
  if not (Key in ['0'..'9', DecimalSeparator, Chr(VK_BACK), Chr(VK_DELETE), Chr(VK_RETURN)])then
  Key := #0;
  if Key = DecimalSeparator then
    if Pos(DecimalSeparator, EditMontant.Text) <> 0 then
      Key := #0;

  if key=#13 then MaskEditDateDde.SetFocus;
end;

procedure TF_Calcul_Interet.EditDureeKeyPress(Sender: TObject;
  var Key: Char);
begin
  if not (Key in ['0'..'9', DecimalSeparator, Chr(VK_BACK), Chr(VK_DELETE), Chr(VK_RETURN)])then
  Key := #0;
  if Key = DecimalSeparator then
    if Pos(DecimalSeparator, EditDuree.Text) <> 0 then
      Key := #0;

  if key=#13 then MaskEditTaux.SetFocus;
end;

procedure TF_Calcul_Interet.EditDureeDiffereKeyPress(Sender: TObject;
  var Key: Char);
begin
  if not (Key in ['0'..'9', DecimalSeparator, Chr(VK_BACK), Chr(VK_DELETE), Chr(VK_RETURN)])then
  Key := #0;
  if Key = DecimalSeparator then
    if Pos(DecimalSeparator, EditDureeDiffere.Text) <> 0 then
      Key := #0;
 if key=#13 then BitBtnCalcul.SetFocus;
end;

procedure TF_Calcul_Interet.MaskEditDateDdeKeyPress(Sender: TObject;
  var Key: Char);
begin
  if key=#13 then EditDuree.SetFocus;
end;

procedure TF_Calcul_Interet.SpeedButton1Click(Sender: TObject);
begin
  F_APropos.Show;
end;

procedure TF_Calcul_Interet.RadioGroupTypeAmortClick(Sender: TObject);
begin
  if RadioGroupTypeAmort.ItemIndex =0 then typeamort:='C'
  else typeamort:='V';
end;

procedure TF_Calcul_Interet.RadioGroup2Click(Sender: TObject);
begin
 If RadioGroup2.ItemIndex =1 then
 begin
   EditDureeDiffere.Enabled :=false;
   EditDureeDiffere.Clear;
 end
 else
 begin
   EditDureeDiffere.Enabled :=true;
   EditDureeDiffere.SetFocus;
 end;
end;
//MISE A JOUR
procedure TF_Calcul_Interet.FormShow(Sender: TObject);
 Var DataDir,NomAlias:string;
     I:Integer;
begin
  Top  := 90;
  Left := 168;
  // appel de la procedure creation alias

  dataDir:='C:\Interets';
  CreateDir(DataDir);
  NomAlias:='Interet_Alias';
  CreationAlias(NomAlias,datadir);

  database1.Close;
  database1.DatabaseName :='Gestion';
  database1.AliasName := NomAlias;
  database1.Open;
  database1.Connected :=true;

  Table1.Close;
  Table1.DatabaseName :='Gestion';
  Table1.TableName :='TECHEANCE_CREDIT';
  Table1.TableType :=ttParadox;
  Table1.EmptyTable;
  Table1.Open;
end;

procedure TF_Calcul_Interet.FormKeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #27 then Close;
end;

//MISE A JOUR POUR LA Création de l''alias AUTOMATIQUE 
// Ici la procedur creation alias paradox
procedure TF_Calcul_Interet.CreationAlias(NomAlias,DataDir:String);
begin
  if not Session.IsAlias(NomAlias) then
 session.AddStandardAlias(NomAlias,DataDir,'PARADOX');
end;

end.

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
23
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
26 août 2009

cantador, merci je ferais d'aurenavant des efforts a+
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
@tgr74 :
bonne réaction de ta part et bon courage pour ton projet.
Penses aussi à te manifester sur les réponses qu'on apporte aux questions que tu poses sur le forum..

On fait des efforts moi et bcp d'autres pour informer.
alors clique sur réponse acceptée ou tape "ça ne va pas".
Messages postés
23
Date d'inscription
jeudi 22 mars 2007
Statut
Membre
Dernière intervention
26 août 2009

Salut frsof, il ne s'agit pas ici du calcul des amortissements des immobilisations. ce code permet de simuler les écheanciers d'un crédit. il existe deux formules de calcul :
- le calcul en utilisant la methode des annuités constants
- le calcul rn utilisant la methode des annuités variables.

cantador, je m'excuse car j'ai peché par la precipitation à poste ce code. en fait il est extrait d'un projet de gestion d'epargne et de crédit donc je travaille dessus. ce projet utilise comme SGDB Interbase.
cependant, je me rattrape par une mise à jour dans laquelle l'alias est crée automatiquement.
Messages postés
18
Date d'inscription
mardi 7 septembre 2004
Statut
Membre
Dernière intervention
3 décembre 2008

slt , just une petite remarque
pour le calcule des amortissement tu doit calculer d'abort l'annuite, et pour la 1 annnee en calcule pas tjrs sur 12 mois mais selon la date d'achat ex :
1) si tu achete l'invetissment 01/01/2007 EN CACULE pour 12 moi
2) si tu achete l'invetissment 01/02/2007 EN CACULE pour 11 moi
Messages postés
4719
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
1 février 2021
14
pour le début :
création d'un alia "Interet" que nous ne pouvons pas avoir par défaut -->> plantage de l'appli à l'ouverture.
soit tu crée automatiquement l'alia, soit tu places tes tables dans un alia existant par défaut, soit tu ne mets pas d'alia..
j'ai pas encore vu le reste..
@bientôt

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.