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 26/06/2008, 19h24   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 21
Points : 13
Points : 13
Par défaut macro avec call symput

Bonjour,

Je voudrais savoir s'il est possible de mettre dans le premier paramètre de call symput une macro variable ?

Ci dessous un exemple table essaie:
obs toto tata titi
1 a rr yy
2 b ss vv
3 c tt ww

Je souhaite créer autant de macro variable qu'il y a de données (soit 9 = a, b, c, rr, ss, tt, yy, vv, ww).

pour prendre les données de chaque colonne je fais donc :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
DATA _null_;
SET essaie end=fin;
call symput('soleil'||LEFT(_n_),(trim(toto)));
IF fin tehn call symput('nb',_n_);
run;
 
%macro repet;
%LOCAL i;
%do i=1 %TO &nb;
%put soleil&i IS &&soleil&i;
%end;
%mend repet;
résultats :

soleil1 is a
soleil2 is b
soleil3 is c

Maintenant je souhaite faire la meme chose pour les colonnes "tata" et "titi" : jaimerais donc savoir ce que je dois faire pour ne pas avoir 3 fois le meme programme ? autrement dit peut on mettre une macro var dans call symput qui permettra de changer automatiquement le nom de la colonne à prendre en compte et le nom des macro variable.

Merci d'avance pour votre aide.
kabstat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2008, 09h08   #2
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
tu peux utiliser la proc contents pour créer une table qui contient les noms des variables de ta table, que tu trransforme après en macro variable.
Pour chaque macro variable créée au dessus tu exécutes ton code.
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2008, 10h37   #3
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
Exactement, tu créé la table avec
proc contents data= out=

tu fais le call symput pout récupérer les nom de variables
call symput('var'||left(_n_),(trim(varname)));
if fin tehn call symput('nb_var',_n_);

tu met ton précédent programme dans une boucle %do j=1 %to &nb_var

juste avant %do i=1 %to &nb; tu pourra mettre
%put TABLE &&var&j ;
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/06/2008, 22h58   #4
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 21
Points : 13
Points : 13
Bonsoir,

je souhaite que le nom des macro var soit différent entre les 3 variables : par exemple, les valeurs de la variables "toto" sont récupérées dans les macro var "soleil1, soleil2, soleil3"
pour les valeurs de la variable "tata", les macro var seront "lune1 lune2 lune3"
et pour les valeurs de la variable "titi", les macro var seront "terre1 terre2 terre3"

je souhaite donc avoir : call symput(&zz,&var) pour changer à la fois le nom de la variable à prendre en compte mais également le nom des macro var
=> le programme ne fonctionne pas

Merci.
kabstat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 22h59   #5
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 21
Points : 13
Points : 13
Bonsoir,

Il me semble que ce que je souhaite mettre en place n'est pas possible.
Je récupère donc au fur et à mesure les valeurs que je stocke dans des macro var à l'aide de call symput et je relance le pgm sur les autres variables (à l'aide d'une macro).
kabstat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2008, 23h25   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
c'est possible
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
 
DATA essai;
format toto $1. tata $2. titi $2.;
input toto $ tata $ titi $;
cards;
a rr yy
b ss vv
c tt ww
;
run;
 
%macro toto (var);
OPTION nomprint;
DATA _null_;
SET essai ;
call symput("&var"||LEFT(_n_),(&&var));
call symput('nb',_n_);
run;
%LOCAL i;
%do i=1 %TO &nb;
	%put Affichage &var IS &&&var&i;
%end;
%mend;
%macro appel;
proc contents DATA=essai out=cont noprint; run;
DATA _null_; SET cont;
call symput('var'||LEFT(_n_),(trim(name)));
call symput('nb_var',_n_);
run;
%do i=1 %TO &nb_var;
	%put Appel &i &&var&i;
	%toto(&&var&i);
 
%end;
%mend;
%appel;
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 22h08   #7
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 21
Points : 13
Points : 13
Bonsoir,

Merci !
j'ai ajouté "&i" dans "%put Affichage &var&i IS &&&var&i";
ainsi on a bien une macro var pour chaque donnée

mais pour récupérer l'info dans une table avec symget ça ne fonctionne, il met à blanc :

data tab;
donnee1=symget("tata1");
run;

Merci encore pour votre aide.
kabstat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 22h12   #8
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Le symget tu le fais dans la macro ou en dehors?
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 22h14   #9
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 21
Points : 13
Points : 13
je le fais en dehors mais je crois qu'effectivement le pb vient de là
kabstat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 22h24   #10
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 21
Points : 13
Points : 13
je l'ai mis à l'interieur de la macro mais ça ne fonctionne toujours pas...

la solution finale (avant que tu ne trouves comment faire) que j'avais retenu est :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
%macro repetition(modif,num);
DATA _null_;
SET tab end=fin;
call symput('teach'||LEFT(_n_),(trim(&modif)));
IF fin then call symput('nb',_n_);
run;
%do i=1 %TO &nb;
%put teach&i IS &&teach&i;
%end;
DATA don#
dona&num=symget ('teach1');
donb&num=symget ('teach2');
donc&num=symget ('teach3');
run;
%mend;
 
%repetition(livres,5);
%repetition(films,6);
%repetition(jeux,7);
kabstat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2008, 22h35   #11
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Que veux tu faire?
Est ce que tu peux m'envoyer un extrait de la table tab pour que je vérifie le code?
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2008, 22h15   #12
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 21
Points : 13
Points : 13
voici la table sur laquelle j'ai fait le test :

livre cd dvd ;
44 125 90
12 5 10
500 1000 2000

ces 9 données je souhaite les mettre dans des macro var qui ont chacune un nom différent
et ensuite je mets la valeur de toutes ces macro var dans une table (on a une macro var = une colonne, table que je transpose ensuite pour avoir 1 ligne = 1 macro var)

je ne sais pas si suis claire...
kabstat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 09h27   #13
Membre Expert
 
Inscription : mars 2005
Messages : 1 028
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 028
Points : 1 278
Points : 1 278
Envoyer un message via Yahoo à bahraoui
Je ne comprends pas pourquoi :
table => macro variabel => créer une nouvelles tables
Tu ne peux pas transposer la table dés le début?
Je ne sais pas si j'ai bien compris==> tu veux créer autant de variavles que de tables (une table par variable)?
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 09h35   #14
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
Citation:
Envoyé par kabstat Voir le message
ces 9 données je souhaite les mettre dans des macro var qui ont chacune un nom différent
Peux tu être plus précis ? combien de macro variables veux tu créer ? quelles sont leurs noms et quelles valeurs contiennent elles ?
Citation:
Envoyé par kabstat Voir le message
et ensuite je mets la valeur de toutes ces macro var dans une table (on a une macro var = une colonne, table que je transpose ensuite pour avoir 1 ligne = 1 macro var)
A partir de ton exemple, peux tu nous montrer la table que tu souhaite avoir en sortie ?
__________________
Avant de poser votre question, n'oubliez pas :
FAQ, SAS DOC et de ce forum
steelspirit est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2008, 23h08   #15
Candidat au titre de Membre du Club
 
Inscription : juin 2008
Messages : 21
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 21
Points : 13
Points : 13
je veux créer autant de macro variable qu'il existe de données
dans mon exemples il y a 9 données donc je crée 9 macro variables
et ces macro var sont regroupées par type de colonne => d'ou un "numéro" commun pour les reconnaitre
et une fois que toutes ces macro variables sont créées je les mets dans une table => pour obtenir une ligne = 1 macro variable

mais dans le pgm que j'ai fait je n'ai pas réussi à changer à chaque fois le nom de la macro var, je les récupère donc puis les écrase au fur et à mesure

il faudrait lancer le pgm pour vous permettre de mieux voir ce que j'ai in fine car je ne sais pas si j'ai été claire...
kabstat est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h01.


 
 
 
 
Partenaires

Hébergement Web