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 28/12/2011, 15h23   #1
Candidat au titre de Membre du Club
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : novembre 2011
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Maroc

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 80
Points : 12
Points : 12
Par défaut Récupérer le résultat d'une macro

Bonjour,
J'ai une macro qui évalue une expression à une date, par exemple:
pour l'expression "x+y" renvoie 7. les variables x,y sont sauvegardées ds une table "tableN" qui a deux champs (variable,valeur,date)

tableN
------
Variable | Valeur | Date
--------------------------------
x 3 01JUL2008
y 4 01JUL2008

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
proc sql;
CREATE TABLE TableN (variable char(100),valeur int format=BESTX24.4,date int format=Date9.);
INSERT INTO TableN VALUES ("x",3,17714);
INSERT INTO TableN VALUES ("y",4,17714);
quit;
%macro evaluer(expression,date);
%let nbr=%sysfunc(count(&expression,-))+%sysfunc(count(&expression,+))+%sysfunc(count(&expression,/))+%sysfunc(count(&expression,*)); 
%do j=1 %TO &nbr+1;
%let comp&j=%scan(&expression,&j,'+||-||*||/||(||)');
proc sql noprint;
SELECT valeur INTO :val&j FROM TableN WHERE variable="&&comp&j" AND Date=&date;
quit;
%let k=%eval(&j-1); %let expression0=&expression;
%let valx&j=%sysfunc(compress(%sysfunc(compress(%SYSFUNC(translate("&&val&j",%str( ),%str(,))),%str(%"))),%str( )));
%let expression&j=%sysfunc(tranwrd(&&expression&k,&&comp&j,&&valx&j));
%end;
%let n=%eval(&nbr+1);
%let expression=%sysevalf(&&expression&n);
&expression
%mend;
%evaluer(x+y,17714);
le programme évalue bien le résultat mais il déclenche une erreur à cause de la denière ligne avant %mend que j'ai ajoutée pour me renvoyer le résultat et l'utiliser dans une autre macro %test

Code :
1
2
3
4
5
6
7
8
9
%macro test();
%evaluer(x+y,17714);
%IF &expression=7 %then %do;
proc sql;
SELECT * FROM bib_sm.data_etp1;
quit;
%end;
%mend;
%test;
Merci bien pour vos réponses d'avance.
aminao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 15h36   #2
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
car ce que t'as is ici :
Code :
1
2
3
&expression%mend;
%evaluer(x+y,17714);
n'as pas de sens;
- déjà dans SAS, toutes instructions /expression se terminent par un ";" .
c'est peut être :
Code :
1
2
 
%put &expression.;
que tu veux mettre ?
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 16h07   #3
Candidat au titre de Membre du Club
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : novembre 2011
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Maroc

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 80
Points : 12
Points : 12
Bonjour,
je veux récupérer le résultat renvoyé (et non l'afficher) pour l'utiliser dans un autre macro programme. J'ai ajouté cette ligne d'apèrs une discussion sur ce forum.
aminao est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 16h15   #4
Membre Expert
 
Inscription : mars 2005
Messages : 1 011
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 011
Points : 1 259
Points : 1 259
Envoyer un message via Yahoo à bahraoui
Avec la création d'une macro variavle exp
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
 
proc sql;
CREATE TABLE TableN (variable char(100),valeur int format=BESTX24.4,date int format=Date9.);
INSERT INTO TableN VALUES ("x",3,17714);
INSERT INTO TableN VALUES ("y",4,17714);
quit;
OPTION mprint;
%global exp;
%macro evaluer(expression,date);
%let nbr=%sysfunc(count(&expression,-))+%sysfunc(count(&expression,+))+%sysfunc(count(&expression,/))+%sysfunc(count(&expression,*)); 
%do j=1 %TO &nbr+1;
	%let comp&j=%scan(&expression,&j,'+||-||*||/||(||)');
	proc sql noprint;
	SELECT valeur INTO :val&j FROM TableN WHERE variable="&&comp&j" AND Date=&date;
	quit;
	%let k=%eval(&j-1); %let expression0=&expression;
	%let valx&j=%sysfunc(compress(%sysfunc(compress(%SYSFUNC(translate("&&val&j",%str( ),%str(,))),%str(%"))),%str( )));
	%let expression&j=%sysfunc(tranwrd(&&expression&k,&&comp&j,&&valx&j));
%end;
%let n=%eval(&nbr+1);
 
%let exp=%sysevalf(&&expression&n);
 
%mend;
%macro test();
 %evaluer(x+y,17714);
 %put expression &exp;
%IF &exp=7 %then %do;
proc sql;
SELECT * FROM bib_sm.data_etp1;
quit;
%end;
%mend;
%test;
__________________
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 10
Vieux 28/12/2011, 16h25   #5
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.
Ce n'est pas la macro-fonction %EVALUER qui génère une erreur, mais la façon dont tu t'en sers ensuite.
Puisque tu veux en faire une fonction, ce qui est une bonne idée, tu récupères directement une valeur quand tu exécutes. Pas une macro-variable comme &EXPRESSION.
Donc c'est ton %IF qui est incorrect car la macro-variable &EXPRESSION, locale à la macro-fonction %EVALUER, est inconnue du macro-programme %TEST.

Soit tu crées une macro-variable globale comme le propose Bahraoui, soit tu restes sur son idée de macro-fonction mais tu t'en sers directement dans le %IF.
Code :
1
2
3
4
5
6
7
8
%macro test();
%IF %evaluer(x+y,17714)=7 %then %do;
proc sql;
SELECT * FROM bib_sm.data_etp1;
quit;
%end;
%mend;
%test;
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 16h31   #6
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
Je n'ai pas regardé la suite .
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 16h32   #7
Membre Expert
 
Inscription : mars 2005
Messages : 1 011
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 011
Points : 1 259
Points : 1 259
Envoyer un message via Yahoo à bahraoui
Salut Olivier,

Je l'ai fait aussi selon ta méthode avant de proposer la solution avec la macro variable, mais ça ne marche pas!!!
LOG
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 
 
 
1    proc sql;
2    CREATE TABLE TableN (variable char(100),valeur int format=BESTX24.4,date int format=Date9.);
NOTE: La TABLE WORK.TABLEN a été créée, avec 0 lignes et 3 col.
3    INSERT INTO TableN VALUES ("x",3,17714);
NOTE: 1 ligne a été insérée dans WORK.TABLEN.
 
4    INSERT INTO TableN VALUES ("y",4,17714);
NOTE: 1 ligne a été insérée dans WORK.TABLEN.
 
5    quit;
NOTE: La procédure SQL a utilisé (Durée totale du processus) :
      temps réel                   0.01 secondes
      temps processeur   0.00 secondes
 
 
6    %macro evaluer(expression,date);
7    %let nbr=%sysfunc(count(&expression,-))+%sysfunc(count(&expression,+))+%sysfunc(count(&expression,/))+%sysfunc(count(&expression,*));
8    %do j=1 %TO &nbr+1;
9    %let comp&j=%scan(&expression,&j,'+||-||*||/||(||)');
10   proc sql noprint;
11   SELECT valeur INTO :val&j FROM TableN WHERE variable="&&comp&j" AND Date=&date;
12   quit;
13   %let k=%eval(&j-1); %let expression0=&expression;
14   %let valx&j=%sysfunc(compress(%sysfunc(compress(%SYSFUNC(translate("&&val&j",%str( ),%str(,))),%str(%"))),%str( )));
15   %let expression&j=%sysfunc(tranwrd(&&expression&k,&&comp&j,&&valx&j));
16   %end;
17   %let n=%eval(&nbr+1);
18   %let expression=%sysevalf(&&expression&n);
19   &expression
20   %mend;
21   %macro test();
22
23   %IF %evaluer(x+y,17714)=7 %then %do;
24   proc sql;
25   SELECT * FROM bib_sm.data_etp1;
26   quit;
27   %end;
28   %mend;
29   %test;
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
ERREUR: Opérande caractère trouvé dans la fonction %EVAL ou condition %IF là où un opérande numérique est requis. La condition était : &val1+&val2
ERREUR: L'exécution de la macro EVALUER va s'arrêter.
 
30   %macro test();
31
32   %IF %evaluer(x+y,17714)=7 %then %do;
33   proc sql;
34   SELECT * FROM bib_sm.data_etp1;
35   quit;
36   %end;
37   %mend;
38   %test;
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL1 non traitée.
AVERTISSEMENT: Référence symbolique apparente VAL2 non traitée.
ERREUR: Opérande caractère trouvé dans la fonction %EVAL ou condition %IF là où un opérande numérique est requis. La condition était : &val1+&val2
ERREUR: L'exécution de la macro EVALUER va s'arrêter.
__________________
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 28/12/2011, 16h52   #8
Candidat au titre de Membre du Club
 
Femme
Conseil - Consultant en systèmes d'information
Inscription : novembre 2011
Messages : 80
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Maroc

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Conseil

Informations forums :
Inscription : novembre 2011
Messages : 80
Points : 12
Points : 12
Bonjour,

La solution de Bahraoui marche bien, merci tous.
aminao 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 02h15.


 
 
 
 
Partenaires

Hébergement Web