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 29/12/2011, 19h21   #1
Invité de passage
 
Homme
Chercheur en informatique
Inscription : décembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Pays-Bas

Informations professionnelles :
Activité : Chercheur en informatique

Informations forums :
Inscription : décembre 2011
Messages : 4
Points : 3
Points : 3
Par défaut Petite macro qui ne me donne pas le résultat escompté

Bonsoir

j'ai un souci avec cette petite macro:

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
 
 
 
DATA sc;
input tt  rr;
CARDS;
0 1
1 3 
2 4 
;
run;
 
 
%macro cond(dss,dsn,trt);
 
DATA &dss; 
	SET &dsn;
	%IF &trt=0 %then %do;
	    rr=9;
	%end;
	%IF &trt=1 %then %do;
		rr=8;
	%end;
	%else %do ; 
	rr=7;
	%end;
run;
%mend;
 
%cond(fin,sc,tt);
Les valeurs attendues pour rr devraient être (7 8 9 ). Or j'obtiens (7 7 7), c'est comme sila macro ne s’exécutait que pour la dernière condition. J'ai transposer ce code dans un simple data step et là ça marche...Avez vous une explication ?

Merci d'avance

Marcus
marcus73 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2011, 10h32   #2
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
Bonjour Marcus.
Ton code illustre parfaitement la différence de fonctionnement entre un IF et un %IF, qui sont deux instructions très différentes.
IF est une instruction de l'étape DATA, qui est exécutée par le compilateur SAS, à chaque observation lue dans les données en entrée. Les conditions portent sur les valeurs d'une variable SAS pour l'observation en cours.
%IF est une instruction macro, exécutée par le compilateur macro avant toute exécution de code SAS. Les conditions portent sur des valeurs de macro-variables, et le résultat est un morceau de code, pas une action.

Pour avoir ton résultat espéré, laisse des IF normaux dans ton code.
Avec ton %IF actuel, comme le compilateur macro ne connaît pas les variables SAS, les conditions &trt=1 est évaluée à tt=1, ce qui signifie pour le compilateur macro "est-ce que le texte tt est le même que le texte 1 ?". C'est évidemment faux, donc on saute au %ELSE.

Une dernière chose :
IF cas1 THEN ...code1 ;
IF cas2 THEN ...code2 ;
ELSE ...code3 ;
(avec IF ou %IF d'ailleurs) quand cas1 est vrai, tu exécutes code1 ET code3. Un ELSE IF s'impose au milieu.

Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 30/12/2011, 14h23   #3
Invité de passage
 
Homme
Chercheur en informatique
Inscription : décembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Pays-Bas

Informations professionnelles :
Activité : Chercheur en informatique

Informations forums :
Inscription : décembre 2011
Messages : 4
Points : 3
Points : 3
Bonjour Olivier

Merci pour ton éclaircissement.

Mcus
marcus73 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 08h19.


 
 
 
 
Partenaires

Hébergement Web