Bonjour,
Je débute actuellement sous SAS PC et SAS GUIDE et je dois convertir un code de SAS PC vers SAS GUIDE.
Le code qui fonctionne parfaitement sous SAS PC est le suivant:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 %let debut=200712; %let arrete=200806; /*********************************** II - DEFINITION DES MACROS ************************************************/ /*********************** Macro permettant de définir les dates de chaque fin de mois ***************************/ %macro dateop(do_period,do_number); %if %eval(&do_number.<1 and &do_number.>-1)=1 %then &do_period. ; %else %if %eval(&do_number.>0)=1 %then %do; %if %substr(&do_period.,5,2)=12 %then %dateop(%eval(&do_period.+89),%eval(&do_number.-1)) ; %else %dateop(%eval(&do_period.+1),%eval(&do_number.-1)) ; %end; %else %if %eval(&do_number.<0)=1 %then %do; %if %substr(&do_period.,5,2)=01 %then %dateop(%eval(&do_period.-89),%eval(&do_number.+1)) ; %else %dateop(%eval(&do_period.-1),%eval(&do_number.+1)) ; %end; %mend dateop; /***Macro permettant de créer et d'enregistrer des dates de fin de mois pour un mois et une variable donnés****/ %macro definition_fin_mois(date=,var=); data _NULL_; %global &var; tmpdt=input("&date.01",yymmdd8.); tmpdt=intnx('month',tmpdt,0,'end'); call symput("&var" ,compress("'"||put(tmpdt,date9.)||"'d")); run; %mend definition_fin_mois; /************************ Itération sur les 12 mois de la pocédure definition_fin_mois ***********************/ %macro creation_date(); %do i=1 %to 12; %global dt_fin_&i; %let fin_&i=%dateop(&debut.,&i); %put &&fin_&i; %definition_fin_mois(date = &&fin_&i,var=dt_fin_&i); %end; %mend creation_date; /******************* Macro permettant de répéter d'une ligne de code un nombre de fois donnée ******************/ %macro iteration(debut,fin,parametre); %do i=%eval(&debut) %to %eval(&fin); %str(%sysfunc(dequote(¶metre))); %end; %mend; /*************************************** III - CREATION DES DATES **************************************/ /* Création de la date fin de mois de début d'année */ %definition_fin_mois(date = &debut,var =dt_deb); %put &dt_deb; /* Création de la date fin de mois de la date d'Arrete */ %definition_fin_mois(date = &arrete,var =dt_arr); %put &dt_arr; /* Création de la date fin de mois de la date de fin de capitalisation*/ %let fin_capi=%dateop(&arrete.,-1); %definition_fin_mois(date = &fin_capi,var =dt_fin_capi); %put &dt_fin_capi; /* Création de la date fin de mois de l'année concernée*/ %creation_date();
Le problème de la convertion vers SAS GUIDE est du au fait que les invites (input) me donnent en entrée les variables
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part arretesous la forme suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part debut
au lieu de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 %LET debut = 31Dec2007; %LET arrete = 30Jun2008;
Comment faire tourner ce programme avec ces nouveaux inputs i.e comment faire fonctionner le programme SAS sous la forme ci-dessous:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 %let debut=200712; %let arrete=200806;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 %LET debut = 31Dec2007; %LET arrete = 30Jun2008; /*********************************** II - DEFINITION DES MACROS ************************************************/ /*********************** Macro permettant de définir les dates de chaque fin de mois ***************************/ %macro dateop(do_period,do_number); %if %eval(&do_number.<1 and &do_number.>-1)=1 %then &do_period. ; %else %if %eval(&do_number.>0)=1 %then %do; %if %substr(&do_period.,5,2)=12 %then %dateop(%eval(&do_period.+89),%eval(&do_number.-1)) ; %else %dateop(%eval(&do_period.+1),%eval(&do_number.-1)) ; %end; %else %if %eval(&do_number.<0)=1 %then %do; %if %substr(&do_period.,5,2)=01 %then %dateop(%eval(&do_period.-89),%eval(&do_number.+1)) ; %else %dateop(%eval(&do_period.-1),%eval(&do_number.+1)) ; %end; %mend dateop; /***Macro permettant de créer et d'enregistrer des dates de fin de mois pour un mois et une variable donnés****/ %macro definition_fin_mois(date=,var=); data _NULL_; %global &var; tmpdt=input("&date.01",yymmdd8.); tmpdt=intnx('month',tmpdt,0,'end'); call symput("&var" ,compress("'"||put(tmpdt,date9.)||"'d")); run; %mend definition_fin_mois; /************************ Itération sur les 12 mois de la pocédure definition_fin_mois ***********************/ %macro creation_date(); %do i=1 %to 12; %global dt_fin_&i; %let fin_&i=%dateop(&debut.,&i); %put &&fin_&i; %definition_fin_mois(date = &&fin_&i,var=dt_fin_&i); %end; %mend creation_date; /******************* Macro permettant de répéter d'une ligne de code un nombre de fois donnée ******************/ %macro iteration(debut,fin,parametre); %do i=%eval(&debut) %to %eval(&fin); %str(%sysfunc(dequote(¶metre))); %end; %mend; /*************************************** III - CREATION DES DATES **************************************/ /* Création de la date fin de mois de début d'année */ %definition_fin_mois(date = &debut,var =dt_deb); %put &dt_deb; /* Création de la date fin de mois de la date d'Arrete */ %definition_fin_mois(date = &arrete,var =dt_arr); %put &dt_arr; /* Création de la date fin de mois de la date de fin de capitalisation*/ %let fin_capi=%dateop(&arrete.,-1); %definition_fin_mois(date = &fin_capi,var =dt_fin_capi); %put &dt_fin_capi; /* Création de la date fin de mois de l'année concernée*/ %creation_date();
L'idée pour moi serait de créer un sous routine qui passerait les intputs
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 %LET debut = 31Dec2007; %LET arrete = 30Jun2008;
en
Aprés avoir passé une après midi à me casser les dents sur le sujet, je laisse ce sujet tres important pour moi à vos brillant esprits.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 %let debut=200712; %let arrete=200806;
Merci énormément de m'aider
Partager