Conversion Programme SAS PC sous SAS GUIDE
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:
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 sous la forme suivante:
Code:
1 2 3
|
%LET debut = 31Dec2007;
%LET arrete = 30Jun2008; |
au lieu de
Code:
1 2 3
|
%let debut=200712;
%let arrete=200806; |
Comment faire tourner ce programme avec ces nouveaux inputs i.e comment faire fonctionner le programme SAS sous la forme ci-dessous:
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 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:
1 2 3
|
%LET debut = 31Dec2007;
%LET arrete = 30Jun2008; |
en
Code:
1 2 3
|
%let debut=200712;
%let arrete=200806; |
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.
Merci énormément de m'aider