Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > Macro
Macro Forum d'entraide sur le langage Macro de SAS
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 22/04/2011, 16h57   #1
Invité de passage
 
jawed dridi
Inscription : juin 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : jawed dridi

Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
Par défaut Macro pour Tableau d'amortissement

Bonjour, je travaille actuellement sur une Macro qui calcule pour chaque personne de ma table le tableau d'amortissment associé a son pret.
Voici le code :

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
DATA tarif.test_devis;
INPUT Id_Assure:1. Montant_emp:6. N_ech:3. Tx_per:6.5;
CARDS;
1 350000 360 0.00333 20100101
2 120000 300 0.00404 20100501
3 200000 240 0.00500 20101101
RUN;
 
DATA tarif.Var1;
    SET tarif.test_devis;
    CALL SYMPUT(COMPRESS("Montant_emprunte"!!_N_),Montant_emp);
RUN;
 
DATA tarif.Var2;
    SET tarif.test_devis;
    CALL SYMPUT(COMPRESS("Nombre_echeances"!!_N_),N_ech);
RUN;
 
DATA tarif.Var3;
    SET tarif.test_devis;
    CALL SYMPUT(COMPRESS("Taux_periodique"!!_N_),Tx_per);
RUN;
 
%MACRO AMORTISSMT(Mt_emprunt,Nb_echeance,Taux_periodiq,tab_amortissement); 
DATA TARIF.&tab_amortissement;
    Montant_emp=&Mt_emprunt;
    N_ech=&Nb_echeance;
    Tx_per=&Taux_periodiq;
        CRD=Montant_emp;
        Interets=CRD*Tx_per;
        Capital_remb=Montant_ech-CRD*Tx_per;
        Montant_ech=ROUND(Montant_emp*Tx_per*(1+Tx_per)**N_ech/((1+Tx_per)**N_ech-1),0.01);
            DO i=1 TO N_ech BY 1;
                Interets=ROUND(CRD*Tx_per,0.01);
                Capital_remb=ROUND(Montant_ech-Interets,0.01);
                CRD=ROUND(CRD-Capital_remb,0.01);
                OUTPUT;
            END;
RUN;
%MEND AMORTISSMT;
 
%MACRO BOUCLE;
DATA _NULL_;
  SET tarif.test_devis END=FIN;
  IF FIN THEN CALL SYMPUT('FIN',Id_Assure);
RUN; 
 
%DO j=1 %TO &FIN;
    %AMORTISSMT(&&Montant_emprunte&j.,&&Nombre_echeances&j.,&&Taux_periodique&j.,tab_amort&j.);
%END;
%MEND BOUCLE;
%BOUCLE;

Ce code fonctionne mais mon soucis est qu'il me créer une table pour chaque tableau d'amortissement. Cela ne pose pas de problème dans ce cas car j'en ai que trois mais je souhaite l'appliquer à une base contenant environ 100 000 prêts. J'aimerais donc créer une table vide qui se remplierait au fur et à mesure avec les différents tableaux d'amortissement les uns à la suite des autres et donc ne plus avoir une table par tableau.

Si vous avez une idée, n'hésitez pas !
Merci d'avance.
Cordialement
funkymam69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h31   #2
Nouveau Membre du Club
 
Homme Gaëtan
Inscription : avril 2011
Messages : 29
Détails du profil
Informations personnelles :
Nom : Homme Gaëtan
Localisation : France

Informations forums :
Inscription : avril 2011
Messages : 29
Points : 26
Points : 26
alors voila la solution que je te propose, tu copies le code ci-dessous dans ta macro "BOUCLE" juste après l'execution de la macro "%AMORTISSMT"


Code :
1
2
3
4
5
proc datasets lib=tarif nolist;
	append out = TAB_TOT
	DATA = tab_amort&j. ;
	DELETE tab_amort&j.;
run;
ça va te créer une nouvelle table "TAB_TOT" qui contiendra toutes tes tables "tab_amort&j." et ça supprimera ces derniere à chaque fois
boutchiwah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h33   #3
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
Détails du profil
Informations personnelles :
Nom : Homme Brice Beare
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Paris

Informations forums :
Inscription : janvier 2011
Messages : 956
Points : 1 366
Points : 1 366
Je t'ai simplifié le programme, et j'espere que ça répond à tes besoins.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
DATA test_devis;
INPUT Id_Assure:1. Montant_emp:6. N_ech:3. Tx_per:6.5;
CARDS;
1 350000 360 0.00333 20100101
2 120000 300 0.00404 20100501
3 200000 240 0.00500 20101101
RUN;
 
DATA _NULL_;
	SET test_devis END=EOF;
	CALL SYMPUT(COMPRESS("Montant_emprunte"!!_N_),Montant_emp);
	CALL SYMPUT(COMPRESS("Nombre_echeances"!!_N_),N_ech);
	CALL SYMPUT(COMPRESS("Taux_periodique"!!_N_),Tx_per);
	IF EOF THEN CALL SYMPUT("NB",_N_);
RUN;
 
 
 
%MACRO AMORTISSMT; 
 
%DO i=1 %TO &NB.;
 
	DATA tab_amortissement_&i.;
	Montant_emp=&&Montant_emprunte&i.;
	N_ech=&&Nombre_echeances&i.;
	Tx_per=&&Taux_periodique&i.;
	CRD=Montant_emp;
	Interets=CRD*Tx_per;
	Capital_remb=Montant_ech-CRD*Tx_per;
	Montant_ech=ROUND(Montant_emp*Tx_per*(1+Tx_per)**N_ech/((1+Tx_per)**N_ech-1),0.01);
	DO i=1 TO N_ech BY 1;
	Interets=ROUND(CRD*Tx_per,0.01);
	Capital_remb=ROUND(Montant_ech-Interets,0.01);
	CRD=ROUND(CRD-Capital_remb,0.01);
	OUTPUT;
	END;
		DROP i;
	RUN;
 
%END;
 
DATA tab_amortissement; SET %DO i=1 %TO &NB.; tab_amortissement_&i. %end;; RUN;/* concaténation des tables*/
 
 
%MEND AMORTISSMT;
 
%AMORTISSMT;
Bon wk!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 18h45   #4
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Euh... pourquoi tant de macros ?
Si le but est de faire une table avec tous les amortissements de tous les devis, il suffit de prendre l'étape DATA au centre de ta macro et d'y greffer le SET qui se trouve avant (là où tu fais actuellement les CALL SYMPUT)... non ?
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
DATA tab_amortissement (DROP=i) ;
  SET tarif.test_devis;
	CRD=Montant_emp;
	Interets=CRD*Tx_per;
	Capital_remb=Montant_ech-CRD*Tx_per;
	Montant_ech=ROUND(Montant_emp*Tx_per*(1+Tx_per)**N_ech/((1+Tx_per)**N_ech-1),0.01);
	DO i=1 TO N_ech BY 1;
	Interets=ROUND(CRD*Tx_per,0.01);
	Capital_remb=ROUND(Montant_ech-Interets,0.01);
	CRD=ROUND(CRD-Capital_remb,0.01);
	OUTPUT;
	END;
	RUN;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2011, 15h21   #5
Invité de passage
 
jawed dridi
Inscription : juin 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : jawed dridi

Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
Par défaut Macro amortissement

Merci à tous pour vos réponses !!!

Je m'excuse pour ces remerciements tardifs mais n'étant pas un utilsateur avéré de ce site, je n'avais malheureusement pas vu vos messages.

Je m'empresse de tester vos solutions afin de vous informer des résultats.

Merci encore.

Bonne journée
funkymam69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/05/2011, 14h25   #6
Invité de passage
 
jawed dridi
Inscription : juin 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : jawed dridi

Informations forums :
Inscription : juin 2010
Messages : 8
Points : 0
Points : 0
Par défaut Tableau d'amortissement

Bonjour, je poste ce message juste pour tous vous remercier pour vos conseils.

La PROC DATASETS m'a permis de faire exactement ce que je souhaitais.

Merci egalement pour la simplification du code c'était cool.

EN vous souhaitant une bonne journée,

Cordialement.
funkymam69 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 06h06.


 
 
 
 
Partenaires

Hébergement Web