Précédent   Forum des professionnels en informatique > Bases de données > Autres SGBD > InterBase
InterBase Forum d'entraide sur le SGBD InterBase de Codegear. Avant de poster -> F.A.Q Interbase, Tutoriels
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/11/2010, 13h12   #1
Membre du Club
 
Inscription : novembre 2006
Messages : 219
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 219
Points : 68
Points : 68
Par défaut Calculer Montant Amortissement

Bonjour,
Je dois ecrire une requête que malheuresement, je sais pas par ou debuté même si je comprend l'enchainement que je dois faire....
Soit la table:
Code :
1
2
3
4
5
6
7
8
9
10
 
CREATE TABLE "AMORTISSEMENT" 
(
  "NUMERO"	VARCHAR(6) NOT NULL,
  "Lib_Materiel" VARCHAR(30) NOT NULL,
  "Montant_INV"	INTEGER NOT NULL,
  "Date_Mise_Service" DAte NOT NULL
  "DUREE"	integer NOT NULL,
 PRIMARY KEY ("NUMERO")
);
ou Montant_INV represente le montant de l'investissment, Date_Mise_Service represente la date à laquelle le materiel acquerit est mis en service et DUREE represente le nombre de mois pour que le matériel soit complètement amorti après que Date_Mise_Service(AAAA-MM-JJ) + Durée c'est à dire que la valeur du materiel soit = 0.

Dans mon application, j'enregistre donc l'ensemble du materiel de mon utilisateur et je dois être en mésure de pouvoir faire un listing des matériels (Libelle_Materiel, valeur de l'amortissement durant la période) non complètement amortis sur une periode de debut et fin.
La valeur mensuelle de l'amortissement = Montant_INV / DUREE

Si pour un materiel,
Code :
(Date_Mise_Service + DUREE) < Debut
alors cet article n'est pas renvoyé.
Si
Code :
(Date_Mise_Service) > Debut
alors cet article n'est pas renvoyé.

Dans les autres cas, je dois retourner le libellé du matériel + la valeur de l'amortissement. Et c'est la que je bloque car savant pas comment le faire.
Mais néammoins, j'ai essayé ceci, mais le paramètre dans le CASE me renvoie une erreure.

Code :
1
2
3
4
5
SELECT Lib_Materiel, CASE WHEN Date_Mise_Service  < :Debut AND (Date_Mise_Service + Duree*30)  < :Fin then Date_Mise_Service + Duree*30 - :Debut
...............
 
FROM AMORTISSEMENT
 WHERE .......

Faites moi toutes vos propositions, je suis prenant.
SOPSOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 09h20   #2
Membre éprouvé
 
Inscription : janvier 2009
Messages : 300
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 300
Points : 453
Points : 453
Bonjour,

Avant de t'expliquer comment réaliser, il me faut quelques explications complémentaires. En effet, il existe plusieurs méthodes d'amortissements.
  • L'amortissement linéaire ;
  • L'amortissement dérogatoire qui a remplacé l'amortissement dégressif antérieur.
Si le calcul de l'amortissement linéaire est assez simple, il n'en est pas de même pour l'amortissement dérogatoire.

Généralement, le calcul de l'amortissement se fait par période. En principe l'exercice de l'entreprise, il te faut donc une date de début d'exercice et une date de fin d'exercice pour gérer l'amortissement annuel. Attention, les règles pour le calcul de l'amortissement lors de l'acquisition ne sont pas les mêmes suivant qu'il s'agit d'un amortissement linéaire ou d'un amortissement dérogatoire.

Je pense qu'avant de créer tes tables, il serait bien d'établir un MCD afin de définir les besoins exacts pour le calcul.

Il existe des programmes qui font cela très bien pour un coût raisonnable. Il faut peut être réfléchir sur ce point.

Fixes les règles de gestion, nous pourrons ensuite d'aider.

Bon courage
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 13h41   #3
Membre du Club
 
Inscription : novembre 2006
Messages : 219
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 219
Points : 68
Points : 68
Salut,
Il s'agit d'un amortissement linéaire. En fait, je dois faire tout le traitement dans la requête et renvoyer le résultat dans un état (FastReport).
SOPSOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 14h26   #4
Membre éprouvé
 
Inscription : janvier 2009
Messages : 300
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 300
Points : 453
Points : 453
Bonjour,

Tu veux le calcul pour chaque période. Il faut définir les périodes. Je ne vois pas comment il est possible de calculer des amortissements sans connaître lé début et la fin de la période de l'amortissement à calculer.

Ou bien, il s'agit de présenter une fiche des amortissements du matériel avec une périodicité de 12 mois. Exemple : achat d'un matériel au 15 juin 2010 ayant une durée d'amortissement de 5 ans. Nous aurons :

Année 1 - du 15/06/2010 au 31/12/2010 = 6,5 mois
Année 2 - du 01/01/2011 au 31/12/2011 = 12 mois
Année 3 - du 01/01/2012 au 31/12/2012 = 12 mois
Année 4 - du 01/01/2013 au 31/12/2013 = 12 mois
Année 5 - du 01/01/2014 au 14/06/2014 = 5,5 mois

Ce schéma répond-t-il à ta demande ? Si oui, je te présenterai un modèle de requête.

A bientôt
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2010, 15h48   #5
Membre du Club
 
Inscription : novembre 2006
Messages : 219
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 219
Points : 68
Points : 68
Salut,
Voici un exemple:
Soit la table Amortissement contenant simplement une seule ligne(peut contenir plusieurs lignes):

Code :
1
2
3
 
N°  Lib_Materiel    Montant_INV   Date_Mise_Service    Durée (en mois)
1    Article1           12 000         '2010-08-01'               6
NB: Amortissement Linéaire et '2010-08-01' = 'AAAA-MM-JJ'

Si l'utilisateur me dit de lister le ou les Libellé Materiel ainsi que la valeur de l'amortissement de la periode:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
-----'2010-04-01' & '2010-04-30' 
        Pas d'article
-----'2011-03-31' & '2011-04-30' 
        Pas d'article
-----'2010-04-01' & '2010-08-30'
1        Article1      2 000
-----'2010-04-01' & '2010-09-30'
1  Article1  4 000
-----'2010-04-01' & '2011-01-31'
1   Article1  12 000
-----'2010-08-01' & '2010-09-30'
1   Article1  4 000
-----'2010-09-01' & '2010-09-30'
1   Article1  2 000
-----'2010-09-01' & '2010-10-31'
1   Article1  4 000
...............................
NB: L'amortissement se calcule par mois et non par jour ou année donc pas de demi mois....
SOPSOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 09h45   #6
Membre éprouvé
 
Inscription : janvier 2009
Messages : 300
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 300
Points : 453
Points : 453
Bonjour,

Effectivement le calcul des amortissements ne fait pas par mois, mais il s'agissait de présenter un schéma. Pour information, il ne peut pas se faire par année, car il y a celles qui sont bissextiles d'où le calcul erroné d'un jour. La seule méthode exacte est le calcul par jour.

Or, dans ta base d'amortissements, tu présentes une durée en mois pour calculer l'amortissement. Je te cite :
Citation:
Dans mon application, j'enregistre donc l'ensemble du materiel de mon utilisateur et je dois être en mésure de pouvoir faire un listing des matériels (Libelle_Materiel, valeur de l'amortissement durant la période) non complètement amortis sur une periode de debut et fin.
La valeur mensuelle de l'amortissement = Montant_INV / DUREE
Il me semble qu'il y a une incohérence.

En général, dans un tableau d'amortissement, la période totale d'amortissement s'exprime avec une date de début et une date de fin
Exemple : Un matériel amorti sur 5 ans, nous aurons :
Date départ = 2010/01/08
Date fin = 2015/01/07

Ainsi, nous pourrons déterminer le taux d'amortissement par jour et faire la calcul sur la période souhaitée.

Aujourd'hui, je suis indisponible. Je te présente une requête jeudi pour traiter cette situation.

A plus
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2010, 09h42   #7
Membre du Club
 
Inscription : novembre 2006
Messages : 219
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 219
Points : 68
Points : 68
Bonjour, je pense que nous disons la meme chose à la différence que moi, je raisonne en mois.
Soit ton exemple:
Citation:
En général, dans un tableau d'amortissement, la période totale d'amortissement s'exprime avec une date de début et une date de fin
Exemple : Un matériel amorti sur 5 ans, nous aurons :
Date départ = 2010/01/08
Date fin = 2015/01/07
Je reformule suivant ma BD

Citation:
En général, dans un tableau d'amortissement, la période totale d'amortissement s'exprime avec une date de début et une date de fin
Exemple : Un matériel amorti sur 5 ans ce qui correspond à 60 mois, nous aurons :
Date départ = 2010/01/01
Date fin = 2014/12/31
Si tu fais la difference entre Date Fin et Date Debut, tu auras 60 mois ce qui equivaut à 5 ans.
Fais moi ta proposition et je vais l'adapter à mon cas.
Cordialement.
SOPSOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 07h22   #8
Membre éprouvé
 
Inscription : janvier 2009
Messages : 300
Détails du profil
Informations personnelles :
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2009
Messages : 300
Points : 453
Points : 453
Bonjour,

Je remets, comme promis, la requête pour calculer les amortissements. En réalité, j'ai fait cette requête sous la forme d'une procédure stockée, sinon il est impossible de calculer la durée d'amortissements avec des valeurs paramétrées.

Il aurait été possible d'utiliser les Common Table Expressions (CTE), mais je ne suis pas certain qu'elles soient implantées dans Interbase. Pour ma part, j'ai utilisé Firebird pour faire mes essais.

J'ai créé la table suivante
Code :
1
2
3
4
5
6
7
8
9
CREATE TABLE AMORTISS (
    NUMERO            CHAR(6) NOT NULL,
    LIB_MATERIEL      VARCHAR(30) NOT NULL,
    MONTANT_INV       NUMERIC(15,2) NOT NULL,
    DATE_MISE_SERV    DATE NOT NULL,
    DUREE_AMORT_MOIS  INTEGER NOT NULL,
    DATE_FIN_AMORT    DATE NOT NULL
);
ALTER TABLE AMORTISS ADD CONSTRAINT PK_AMORTISS PRIMARY KEY (NUMERO);
Valeurs incluses dans la table
Code :
1
2
3
  NUMERO   LIB_MATERIEL   MONTANT_INV     DATE_MISE_SERV  DUREE_AMORT_MOIS      DATE_FIN_AMORT
  000001   Matériel n° 1       10 000.00  15.12.2009                        60  14.12.2014
  000002   Matériel n° 2      100 000.00  20.06.2006                        48  19.06.2010
La procédure stockée écrite pour le calcul de la dotation aux amortissements
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
CREATE OR ALTER PROCEDURE CALCUL_AMORT (
    datedebut date,
    datefin date)
returns (
    libelle varchar(30),
    valeur_inv numeric(15,2),
    date_serv date,
    mois_amort integer,
    taux_jour numeric(15,8),
    nbre_jours integer,
    dotation numeric(15,2))
AS
begin
  FOR
    SELECT LIB_MATERIEL, Montant_Inv, Date_Mise_Serv, Duree_Amort_Mois, AmortJours, DATE_FIN_AMORT - Date_Mise_Serv + 1,
      case WHEN Date_Mise_Serv <= :DateDebut AND :DateFin <= DATE_FIN_AMORT THEN AmortJours * (:datefin - :DateDebut + 1)
           WHEN Date_Mise_Serv >= :DateDebut AND :DateFin <= DATE_FIN_AMORT THEN AmortJours * (:datefin - Date_Mise_Serv + 1)
           WHEN Date_Mise_Serv <= :DateDebut AND :DateFin >= DATE_FIN_AMORT THEN AmortJours * (DATE_FIN_AMORT - :DateDebut + 1)
      END
    FROM AMORTISS A0
      INNER JOIN (SELECT NUMERO, ROUND(Montant_Inv * 1.00000000 / (DATE_FIN_AMORT - Date_Mise_Serv + 1), 8) AS AmortJours FROM AMORTISS) A1
        ON A1.NUMERO = A0.NUMERO
    WHERE :DateDebut <= DATE_FIN_AMORT AND :DateFin >= DATE_MISE_SERV
    INTO :libelle, :valeur_inv, :date_serv, :mois_amort, :taux_jour, :Nbre_Jours, :Dotation
  do
  begin
    suspend;
  end
end^
Les valeurs DateDebut et DateFin sont à saisir pour déterminer la période de calcul des amortissements. Dans l'exemple, j'ai pris 01/01/2010 et 31/12/2010.

Voici le résultat
Code :
1
2
3
  LIBELLE                VALEUR_INV     DATE_SERV   MOIS_AMORT    TAUX_JOUR         NBRE_JOURS   DOTATION
  Matériel n° 1              10 000.00  15.12.2009            60        5.47645126        1826       1 998.90
  Matériel n° 2             100 000.00  20.06.2006            48       68.44626968        1461      11 635.87
La mise forme mérite quelques améliorations.

Bon courage
seabs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2010, 13h08   #9
Membre du Club
 
Inscription : novembre 2006
Messages : 219
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 219
Points : 68
Points : 68
Salut,
Je vais le tester mais je suis d'ores et deja convaincu que ça marche en le compilant manuellement.

Big up à toi seabs
SOPSOU est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h33.


 
 
 
 
Partenaires

Hébergement Web