Bonjour à tous,
J'ai un problème existentiel avec les % put que quelqu'un a peut-être rencontré : comment résoudre l'intérieur d'un %put avant que le %put ne le comprenne comme du texte ? (difficile à bien expliquer)
Je vous expose le contexte :
J'ai plein de tables dont la terminaison évolue chaque mois : 1201, 1202, 1203....
Je dois appeler, en fonction d'une date, les n dernières tables => je dois connaitre les n dernières terminaisons de ces tables.
J'ai créé cette macro :
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 %macro N_DERNIERS_MOIS(VAR,NMOIS); data _null_; DATE = mdy( %substr(&VAR,3,2) ,01 ,%sysevalf(2000 + &VAR/100,floor) ); do i=0 to &NMOIS; call symput (compress("DATE"!!put(i,12.)),put(year (intnx('month',DATE,-1*i))-2000,z2.) !!put(month(intnx('month',DATE,-1*i)),z2.)); end; run; %do i=1 %to %eval(&NMOIS-1); %put &&DATE&i.; %end; %mend N_DERNIERS_MOIS; %N_DERNIERS_MOIS(1204,6);
Les dates se mettent les unes après les autres dans la log :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 1203 1202 1201 1112 1111
Maintenant, je veux les voir apparaître en ligne :
La macro ci-dessous ne marche pas parce qu'après le %put, SAS interprète tout comme du texte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 1203 1202 1201 1112 1111
Comment faire en sorte que SAS comprenne que la boucle doit être compilée ??
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 %macro N_DERNIERS_MOIS(VAR,NMOIS); data _null_; DATE = mdy( %substr(&VAR,3,2) ,01 ,%sysevalf(2000 + &VAR/100,floor) ); do i=0 to &NMOIS; call symput (compress("DATE"!!put(i,12.)),put(year (intnx('month',DATE,-1*i))-2000,z2.) !!put(month(intnx('month',DATE,-1*i)),z2.)); end; run; %put %do i=1 %to &NMOIS; &&DATE&i.; %end; ; %mend N_DERNIERS_MOIS; %N_DERNIERS_MOIS(1204,6);
Merci d'avance pour votre aide
Laure.
Partager