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 02/01/2012, 16h54   #1
Invité de passage
 
Femme
Chef de projet
Inscription : janvier 2012
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Chef de projet
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 3
Points : 0
Points : 0
Par défaut Récupération de la valeur d'une macro-variable pour l'insérer dans une macro

Bonjour,

Je voudrais utiliser dans ma boucle la valeur de ma macro-variable précédemment créée, mais ça ne marche pas. Je ne comprends pas pourquoi.
Le but est de créer autant de table que d'observations. Si je met la valeur à la main, dans la boucle %do, ça marche très bien.

Merci de votre aide.

Ci-après mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
%macro test;
DATA _null_;
SET sashelp.titi nobs=nobs ;
call symput ("nbobs",nobs);
run;
%let nb_var= %sysfunc(countc(&nobs.,"&dlm"));
%put _user_;
%do i=1 %TO &nb_var;
PROC SQL;
CREATE TABLE DETECT.CD_RMA&i AS 
SELECT *
FROM detect.CD_RM03b
WHERE cnt=&i;
QUIT;
%end;
%mend;
%test;
babounes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 17h18   #2
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
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 : 957
Points : 1 368
Points : 1 368
Bonjour,
ça te va ça?


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
%macro test;
DATA _null_;
SET sashelp.class nobs=nobs ;
call symput ("nobs",nobs);
run;
 
%do i=1 %TO &nobs;
 
DATA toto;
SET sashelp.class;
cpt=_n_;
run;
 
DATA table_&i;
SET toto;
WHERE cpt=&i.;
run;
 
%end;
%mend;
%test;
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/01/2012, 17h37   #3
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 828
Points : 2 828
Je ne comprends pas l'utilité de cette ligne de ton code
Code :
%let nb_var= %sysfunc(countc(&nobs.,"&dlm"));
A part ça, Brice propose une autre solution pour coder, j'imagine qu'on pourrait encore l'écrire d'autres façons. Par exemple ce code, sans macro-programme ni besoin de compter à l'avance les observations (mais il faut avoir la liste des variables, ce qui pour le coup pourrait s'automatiser avec PROC CONTENTS + PROC SQL --> macro-variable en liste).
Code :
1
2
3
4
5
6
7
8
9
10
11
DATA _NULL_ ;
  DO i=1 BY 1 UNTIL(fin) ;
    DECLARE HASH h () ;
    h.DEFINEKEY("i") ;
    h.DEFINEDATA("name","age","sex","weight","height") ;
    h.DEFINEDONE() ;
    SET sashelp.class END=fin ;
    h.ADD() ;
    h.OUTPUT(DATASET:CATS("DETECT.CD_RMA",i)) ;
  END ;
RUN ;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 02/01/2012, 18h27   #4
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 957
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 : 957
Points : 1 368
Points : 1 368
Trop fort Olivier et Bonne année 2012 dans la foulée!!!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2012, 21h33   #5
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 012
Points : 1 717
Points : 1 717
Hello;
sans macro, sans SQL et sans contents,...

Code :
1
2
3
4
5
6
 
DATA _null_;
n=_n_; 
SET sashelp.class;
call execute ("data tab"|| LEFT(_n_)|| ";"|| "set sashelp.class ;"||  "if"|| n ||"=_n_"||";run;" );
run;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 10h50   #6
Invité de passage
 
Femme
Chef de projet
Inscription : janvier 2012
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Chef de projet
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 3
Points : 0
Points : 0
Bonjour,

Merci pour vos réponses successives. Mais je n'y arrive tjrs pas.

Ce qui bloque c'est lorsque j'utilise la macro-variable &nobs dans la boucle %DO %TO, la création des tables est OK, ainsi que la partie DATA _NULL_ puisque lorsque je vérifie avec %PUT _USER_ la macro-variable &nobs est bien créée et la valeur 14 lui est bien associée.

est ce que ça ne peut pas venir du fait que je suis sur Enterprise Guide?
babounes est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 10h56   #7
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 012
Points : 1 717
Points : 1 717
t'y tiens vraiment au code macro?
Même remarque que Olivier:
Code :
1
2
 
%let nb_var= %sysfunc(countc(&nobs.,"&dlm"));
tu veux compter quoi? , NOBS est un nombre , et c'est quoi &dlm.?

pour moi c'est sa qu'il faut faire :

Code :
1
2
3
4
5
6
7
8
9
%do i=1 %TO &nbobs;
PROC SQL;
CREATE TABLE DETECT.CD_RMA&i AS 
SELECT *
FROM detect.CD_RM03b
WHERE cnt=&i;
QUIT;
%end;
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2012, 11h14   #8
Invité de passage
 
Femme
Chef de projet
Inscription : janvier 2012
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Chef de projet
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : janvier 2012
Messages : 3
Points : 0
Points : 0
Je sais que cette ligne est inutile, mais comme ça ne marchais pas avec &nobs, j'ai essayé d'autres variantes!!
En fait, j'ai juste fait une erreur dans le nom de ma macro-variable.

merci beaucoup de votre rapidité pour nous répondre et de vos conseils précieux.
babounes 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 03h43.


 
 
 
 
Partenaires

Hébergement Web