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 06/01/2011, 10h01   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 33
Points : 10
Points : 10
Par défaut Macro variable tableau

Ma question me paraît stupide mais je n'arrive à rien en ce bon matin donc viens chercher de l'aide sur ce forum

Est-il possible de faire un "macro-tableau" sous SAS? Autrement dit, comment traduire la phrase suivante en langage macro? :
Code :
1
2
 
Array TabMois{12} Janvier Fevrier Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre Décembre;
Au pire je crée 12 macro-variables mais c'est un peu con;
cemyr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 10h16   #2
Membre chevronné
 
Avatar de steelspirit
 
Inscription : janvier 2008
Messages : 420
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2008
Messages : 420
Points : 739
Points : 739
Envoyer un message via MSN à steelspirit
Bonjour Cemyr,

Hélas non, la notion de tableau (ARRAY) ne marche que dans une étape data.
Pas d'autre choix que de créer 12 macro-variables ... après y a plusieurs façon de faire (boucle macro ou étape data) ...

Bon courage,

Steel
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 10h25   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 33
Points : 10
Points : 10
Merci pour l'info! .. j'ai bien fait de ne pas chercher seule trop longtemps
cemyr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 19h11   #4
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
Bonjour,
Tu peux créer une macro variable comme suit:
Code :
%LET Liste=Janvier Fevrier Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre Décembre;
après ça dépend de ce que tu veux en faire

Cdt,
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 10h02   #5
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Pour compléter la réponse de Mégamind, tu peux accéder aux valeurs de la liste grâce à une macro qui renvoie la valeur de rang i. Exactement comme pour un tableau array.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
%macro MOIS(i);
%LOCAL mois;
%let mois=Janvier Fevrier Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre Décembre;
 
	%scan(&mois, &i., %str( ))  
 
%mend;
 
 
%put %MOIS(1) ;
%put %MOIS(2) ;
%put %MOIS(12) ;
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/01/2011, 10h45   #6
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
Sasadm Bonjour, Tu peux automatiser compètement ton code comme suit (pas de rouge dans la log, rassures-toi ):

[
Code :
1
2
3
4
5
6
7
8
9
10
11
12
%LET Liste=Janvier Fevrier Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre Décembre;
%LET eff=%EVAL(%SYSFUNC(count(%cmpres(&liste.),%STR( )))+1);/* Pour compter le nombre de mots dans la macro &liste*/
%PUT eff=&eff.;
 
%MACRO M;
	%DO i_=1 %TO &eff.;
		%LET liste&i_.=%SCAN(&liste,&i_.,' ');/* parcourir la liste et extraire cquaque mots*/
		%PUT &&liste&i_.;/* afficher chaque mots*/
	%END;
%MEND M;
 
%M;/* executer la macro*/
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 12h32   #7
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Citation:
Tu peux automatiser compètement ton code comme suit
Merci Mégamind, c'est un exemple parmi d'autre.

D'autres exemples d'utilisation :

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
 
 
/* utilisation dans du langage macro */
 
%let initiale_mois5=%substr(%MOIS(5), 1,1);
%put Mai commence par &initiale_mois5.; 
 
%put le 6eme mois est %MOIS(6);
 
/* utilisation dans une étape data */
DATA mois;
input i;
length mois $32.;
mois=resolve(cats('%MOIS(', i,')'));
RETURN;
cards;
1
2
3
9
12
45
;
run;
A savoir que pour tous ces exemples, il est quand même plus "naturel" d'utiliser un format.
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 13h14   #8
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
Pas mal Sasadm, je connaissais pas!
Je ne vois pas en quoi "il est naturel d'utiliser un format"
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 15h19   #9
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Citation:
Je ne vois pas en quoi "il est naturel d'utiliser un format"
Parce que les formats sont faits pour ça et que la majorité des développeurs opteront pour les formats dans de tels cas :

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
 
proc format; 
value  mois
		1="Janvier"
	   	2="Fevrier"
	   	3="Mars"
	 	4="Avril" 
		5="Mai"
		6="Juin" 
		7="Juillet"
		8="Août"
		9="Septembre"
		10="Octobre"
		11="Novembre"
		12="Décembre"
;
run;
 
 
%macro FMOIS(i);
	 %sysfunc(putn(&i. , mois.))    
%mend;
 
 
%put mois1=%FMOIS(1) ;
%put mois2=%FMOIS(2) ;
 
 
DATA mois;
input i;
length mois $32.;
mois=put(i,mois.);
RETURN;
cards;
1
2
3
9
12
;
run;
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 15h29   #10
Membre expérimenté
 
Inscription : avril 2009
Messages : 537
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 537
Points : 540
Points : 540
Citation:
Envoyé par sasadm Voir le message
la majorité des développeurs opteront pour les formats
Citation:
Envoyé par xav Voir le message
La majorité des développeurs devraient opter pour les formats
xav2229 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 16h13   #11
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Salut Xav,
à propos des formats, je suis tombé sur une excellente doc sur le site d'une SSII anglaise.
On y apprend beaucoup de choses.
Par ailleurs, le site est excellent. C'est pas souvent qu'une boite privée partage sa connaissance...
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 16h40   #12
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 connais proc format mais merci quand même.
Par contre, je sais maintenant comment mettre une macro variable définie en liste dans une table.
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 17h03   #13
Membre confirmé
 
Inscription : janvier 2010
Messages : 185
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 185
Points : 250
Points : 250
Je t'en prie Mégamind,
par contre je dois t'avouer que je n'utilise jamais la fonction resolve et que pour répondre à ce genre de problèmes requérant des listes de valeurs, je passe par des formats.
Maintenant il ne faut jamais dire "jamais" et peut-être que resolve a son utilité dans certains cas bien particuliers.
sasadm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2011, 17h22   #14
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 connaissais la fonction resolve que de nom , jamais utilisé.
Ci-dessous ce que je ferai moi pour mettre une macro liste dans une table, ça pourrait servir...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
LET liste_ville=PARIS BORDEAUX LYON ;
%LET eff=%EVAL(%SYSFUNC(count(%cmpres(&liste_ville.),%STR( )))+1);/* Pour compter le nombre de mots dans la macro &liste*/
%PUT eff=&eff.;
 
%MACRO PRINTZ;
 
		%DO i=1 %TO &eff. ;
 
		%LET liste_ville&i=%scan(&liste_ville.,&i,' ');
			DATA &&liste_ville&i;/* Creation d'une table par ville*/
			ATTRIB VILLE length=$30;
			VILLE=%sysfunc(quote(&&liste_ville&i.));
			RUN;
 
	%END;
 
	DATA FINALE; SET %DO i=1  %TO &eff.; &&liste_ville&i %end;; RUN;/* Concaténation de toutes les tables temporaires*/
 
%MEND;
 
%PRINTZ;/* Execution de la macro*/
MEGAMIND2 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 13h17.


 
 
 
 
Partenaires

Hébergement Web