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 08/04/2008, 14h48   #1
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Par défaut Problème boucle %do

Bonjour, j'ai un message d'erreur que je ne comprends pas et que je n'arrive pas à débuguer...

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
 
%let SAScolumns = "SampleName, Matrice, Description";
%let MODcolumns = "name_sample, ref_sample, matrix_name";
 
 
* Calcule et renvoie le nombre de paramètres présents dans la variable mise en paramètres (liste dont les éléments sont séparés par une virgule);
%macro calc_params(param);
	%LOCAL count;
	%let count=1;
	%let var&count = %qscan(&param, &count., %str(,));
	%do %while (&&var&count ne);
		%let count=%eval(&count+1);
		%let var&count = %qscan(&param, &count, %str(,));
	%end;
	%let count=%eval(&count-1);
	&count;
%mend;
 
* Macro où l'erreur est affichée - Macro à compléter par la suite;
%macro test(SAScolumns, MODcolumns);
	%let nb_SAScolumns = %calc_params(&SAScolumns);
	%let nb_MODcolumns = %calc_params(&MODcolumns);
	%put Nombre colonnes SAS : &nb_SAScolumns;
	%put Nombre colonnes MODule : &nb_MODcolumns ;
	%if (&nb_MODcolumns=&nb_SAScolumns) %then
		%put Nombre de colonnes OK;
	%else
		%put "Attention !! Nombre de colonnes différent";
	%do i=1 %to &nb_MODcolumns;
		%let SAScolumn_ = %sysfunc(compress(%qscan(&SAScolumns, &i, %str(,)),%str(%")));
		%let MODcolumn_ = %sysfunc(compress(%qscan(&MODcolumns, &i, %str(,)),%str(%")));
		%put;
		%put I : &i et NbColonnesMOD : &nb_MODcolumns et NbColonnesSAS : &nb_SAScolumns;
		%put SAScolumn_ : &SAScolumn_ ;
		%put MODcolumn_ : &MODcolumn_ ;
	%end;
%mend;
 
 
%test(&SAScolumns, &MODcolumns);


Or le soucis disparaît lorsque je change les deux premières assignations dans la macro %test. C'est à dire quand
Code :
1
2
	%let nb_SAScolumns = %calc_params(&SAScolumns);
	%let nb_MODcolumns = %calc_params(&MODcolumns);
devient :
Code :
1
2
	%let nb_SAScolumns = 3;
	%let nb_MODcolumns = 3;


Voici le message d'erreur :
Citation:
1 The SAS System 14:00 Tuesday, April 8, 2008

1 ;*';*";*/;quit;run;
2 OPTIONS PAGENO=MIN;
3 %LET _CLIENTTASKLABEL=%NRBQUOTE(Code3);
4 %LET _EGTASKLABEL=%NRBQUOTE(Code3);
5 %LET _CLIENTPROJECTNAME=%NRBQUOTE(D:\projet\ISIBIO\Isios\Projet.egp);
6 %LET _SASPROGRAMFILE=;
7
8 ODS _ALL_ CLOSE;
NOTE: Some of your options or statements may not be supported with the Activex or Java series of devices. Graph defaults for these
drivers may be different from other SAS/GRAPH device drivers. For further information, please contact Technical Support.
9 OPTIONS DEV=ACTIVEX;
10 FILENAME EGHTML TEMP;
NOTE: Writing HTML(EGHTML) Body file: EGHTML
11 ODS HTML(ID=EGHTML) FILE=EGHTML ENCODING='utf-8' STYLE=statdoc
11 ! STYLESHEET=(URL="file:///C:/Program%20Files/SAS/Shared%20Files/BIClientStyles/statdoc.css")
11 ! ATTRIBUTES=("CODEBASE"="http://www2.sas.com/codebase/graph/v91/sasgraph.exe") NOGTITLE NOGFOOTNOTE GPATH=&sasworklocation
11 ! ;
12
13 %gaccessible;
14
15
16 %let SAScolumns = "SampleName, Matrice, Description";
17 %let MODcolumns = "name_sample, ref_sample, matrix_name";
18
19
20 * Calcule et renvoie le nombre de paramètres présents dans la variable mise en paramètres (liste dont les éléments sont
20 ! séparés par une virgule);
21 %macro calc_params(param);
22 %local count;
23 %let count=1;
24 %let var&count = %qscan(&param, &count., %str(,));
25 %do %while (&&var&count ne);
26 %let count=%eval(&count+1);
27 %let var&count = %qscan(&param, &count, %str(,));
28 %end;
29 %let count=%eval(&count-1);
30 &count;
31 %mend;
32
33 * Macro où l'erreur est affichée - Macro à compléter par la suite;
34 %macro test(SAScolumns, MODcolumns);
35 %let nb_SAScolumns = %calc_params(&SAScolumns);
36 %let nb_MODcolumns = %calc_params(&MODcolumns);
37 %put Nombre colonnes SAS : &nb_SAScolumns;
38 %put Nombre colonnes MODule : &nb_MODcolumns ;
39 %if (&nb_MODcolumns=&nb_SAScolumns) %then
40 %put Nombre de colonnes OK;
41 %else
42 %put "Attention !! Nombre de colonnes différent";
43 %do i=1 %to &nb_MODcolumns;
44 %let SAScolumn_ = %sysfunc(compress(%qscan(&SAScolumns, &i, %str(,)),%str(%")));
45 %let MODcolumn_ = %sysfunc(compress(%qscan(&MODcolumns, &i, %str(,)),%str(%")));
46 %put;
47 %put I : &i et NbColonnesMOD : &nb_MODcolumns et NbColonnesSAS : &nb_SAScolumns;
48 %put SAScolumn_ : &SAScolumn_ ;
49 %put MODcolumn_ : &MODcolumn_ ;
50 %end;
51 %mend;
2 The SAS System 14:00 Tuesday, April 8, 2008

52
53
54 %test(&SAScolumns, &MODcolumns);
Nombre colonnes SAS : 3;
Nombre colonnes MODule : 3;
Nombre de colonnes OK
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was:
&nb_MODcolumns
ERROR: The %TO value of the %DO I loop is invalid.
ERROR: The macro TEST will stop executing.

55
56 %LET _CLIENTTASKLABEL=;
57 %LET _EGTASKLABEL=;
58 %LET _CLIENTPROJECTNAME=;
59 %LET _SASPROGRAMFILE=;
60
61 ;*';*";*/;quit;run;
62 ODS _ALL_ CLOSE;
63
64
65 QUIT; RUN;
66

Quelqu'un comprend ce que je ne vois pas ?
raf64flo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 15h03   #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
Bonjour,

Supprime le ";" dans la chaine "&count;"

bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 15h07   #3
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 810
Points : 4 810
Citation:
Envoyé par bahraoui Voir le message
Bonjour,

Supprime le ";" dans la chaine "&count;"

Exactement!!
Ta macro variable nb_MODcolumns vaut "3;" et non "3"
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 15h20   #4
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56


J'étais certain que c'était une connerie...

Admettons.

Pour vérifier la chose, voici ce que j'ai fait :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
%macro calc_params(param);
	%local count;
	%let count=1;
	%let var&count = %qscan(&param, &count., %str(,));
	%do %while (&&var&count ne);
		%let count=%eval(&count+1);
		%let var&count = %qscan(&param, &count, %str(,));
	%end;
	%let count=%eval(&count-1);
	%put Count is : ***&count***; *rajouté entre temps;
	*&count;
%mend;
%calc_params(&SAScolumns);
Affiche :
Citation:
13 %gaccessible;
14
15 * Calcule et renvoie le nombre de paramètres présents dans la variable mise en paramètres (liste dont les éléments sont
15 ! séparés par une virgule);
16 %macro calc_params(param);
17 %local count;
18 %let count=1;
19 %let var&count = %qscan(&param, &count., %str(,));
20 %do %while (&&var&count ne);
21 %let count=%eval(&count+1);
22 %let var&count = %qscan(&param, &count, %str(,));
23 %end;
24 %let count=%eval(&count-1);
25 %put Count is : &count;
26 *&count;
27 %mend;
28 %calc_params(&SAScolumns);
Count is : ***3***
29
Et si j'enlève le ";" après &count, alors le %mend; devient grisé puisqu'il manque un point-virgule avant. Je ne peux donc pas l'enlever...

Ou alors j'ai encore raté un truc.


Edit : ah !

C'est dans l'assignation du résultat que ça rajoute la chose. Il faut donc que je supprime le ";" à cet endroit là et pas ailleurs !

Huhu, on y arrive...

Merci bien !
raf64flo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2008, 15h47   #5
Membre du Club
 
Inscription : novembre 2007
Messages : 120
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 120
Points : 56
Points : 56
Question bonus : vous savez pourquoi le ";" est rajouté à la fin de la variable lors de l'assignation ?

Car j'ai fait des test avec l'exemple de la FAQ (%concat) et refaisant des choses du même calibre, mais pas moyen de retrouver ce ";" lors de plusieurs test...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
%let var1 = "Hello";
%let var2 = "World";
 
%macro concat(var1,var2);
%let tmp1 = %sysfunc(compress(&var1,%str(%")));
%let tmp2 = %sysfunc(compress(&var2,%str(%")));
%let test = "&tmp1,&tmp2";
%put Test : &test;
&test; *Précise les éléments à renvoyer par la macro;
%mend;
 
%let maVarResultat = %concat(&var1,&var2);
%put Le résultat renvoyé par la macro 'concat' est : &maVarResultat;
Affiche :
Citation:
13 %gaccessible;
14 %let var1 = "Hello";
15 %let var2 = "World";
16
17 %macro concat(var1,var2);
18 %let tmp1 = %sysfunc(compress(&var1,%str(%")));
19 %let tmp2 = %sysfunc(compress(&var2,%str(%")));
20 %let test = "&tmp1,&tmp2";
21 %put Test : &test;
22 &test; *Précise les éléments à renvoyer par la macro;
23 %mend;
24
25 %let maVarResultat = %concat(&var1,&var2);
Test : "Hello,World"
26 %put Le résultat renvoyé par la macro 'concat' est : &maVarResultat;
Le résultat renvoyé par la macro 'concat' est : "Hello,World"
27
Pas de point-virgule...
raf64flo 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 15h00.


 
 
 
 
Partenaires

Hébergement Web