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 13/09/2007, 15h13   #1
Membre à l'essai
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 22
Points : 22
Envoyer un message via MSN à goulhasch
Par défaut Problème syntaxe macro

Salut,
je rencontre qq soucis à l'éxecution de ma macro ...
dû à des soucis de syntaxe a mon avis ^^

le message d'erreur est :
Citation:
ERREUR: A character operand was found in the %EVAL function or %IF condition where a numeric
operand is required. The condition was: &nbEcg
ERREUR: The %TO value of the %DO I loop is invalid.
ERREUR: The macro UNSCHEDULED will stop executing.
et mon code :
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
 
%macro unscheduled(tabIn, TabOut, nbEcg);
 
/* declaration du compteur */
%LOCAL i;
/*%let i=1;*/
%LOCAL nbvisit;
%let nbvisit=0;
%LOCAL temp;
%let temp=0;
 
/*data &tabIn;
set &tabOut;*/
 
/* teste chaque obseration */
%do i=1 %TO &nbEcg;
	DATA tabIn&i;
	SET tabOut&i
	%IF (%SUBSTRN(visitname, %length(visitname), 1)='U') %then %do;
				%let nbvisit = %eval(&nbvisit + 1); 
                                                   /* compte les UNS */
				/* passe à l'observation precendente */
				%let temp=%eval(&i-1);
				DATA tabIn&temp
				 SET tabOut&temp
				%do %until (%SUBSTRN(visitname, %length(visitname), 1)<>'U');
		                        /*compte les UNS */					          %let nbvisit = %eval(&nbvisit+1); 
                                                 /* decremente les observations */
			         %let temp = %eval(&temp -1); 				          DATA tabIn&temp
                                                 SET tabOut&temp;
			         %end; /* fin du compte des UNS
				/* on connait le nb de UNS, on renomme les formats visit */
				/* temp contient l'indice observation du 1er UNS de la visit */
				/* on est positionner sur temp */
			     %do %while ( temp<=i);
			      DATA tabIn&temp
			     SET tabOut&temp;
			    visno= %CAT( %substr(visno, 1, %length(visno)-1),(%eval(%substr(visno, %length(visno)-1),1)+1));
			   %let temp = %eval(&temp +1);
			     %end; /* fin do while */
		   %end; /* fin if */
%end;
 
%mend;

Je precise que je suis totalement débutante SAS
et que ce n'est pas bourré de conneries je l'espere !


MErci d'avance pour votre aide
goulhasch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2007, 17h20   #2
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 807
Points : 4 807
Je vois déjà une première erreur : data tabIn&temp;
Un conseil met des %PUT pour afficher tes sorties dans le log.

C'est étonnant tu crée deux fois la table 'data tabIn&temp'

Je te conseil d'y aller progressivement avec le langage macro, il vaut mieux que tu fasse par étapes pour bien comprendre le fonctionnement des macro-variables, des appels de variables : & et && et des boucles...... je te rassure ce n'est pas très compliqué.
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2007, 18h03   #3
Membre à l'essai
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 22
Points : 22
Envoyer un message via MSN à goulhasch
Merci encore pour ton aide !
je prefererai aussi y aller petit a petit, je panique un peu car demain apres midi, il faut que çà fonctionne ...
Je vais revoir çà pas à pas ... je n'ai pas trop le choix ^^
par contre il ya qqchose que je ne comprend pas ... pas dans la macro ... mais dans l'autre programme la ou jai mes proc data, j'ai déclarer une variable globale du genre : %global nbocc;

et dans mon proc data, j'affiche dans un des champs
%let nbocc= _N_ ;

donc il m'affiche bien l'indice de chaque observation, cependant j'ai l'impression que lorsque je le passe en parametre de la macro, il n'a pas de valeur ...

c'est possible ?

je precise qu'il ya 1semaine je n'avais jamais vu un prog sas, ma question peut peut être paraitre bête

Merci
goulhasch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 09h14   #4
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 807
Points : 4 807
Je sais pas si j'ai bien compris ton pb mais bon je pense que ça va pouvoir t'aider.
Les macros variabes sont écrites en mémoire tampon .... tu peux quand même les afficher dans ton log .... pour les avoir dans une base ou un data il faut que tu utilise dans ton étape data la fonction symget et call symput.
Ci-dessous un petit exemple qui t'aidera peut être à mieux comprendre.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DATA base;
INPUT var1 var2;
cards ;
10 11
15 22
;
RUN;
%MACRO test();
%let nbocc= _N_ ;
DATA base2;
SET base;
CALL SYMPUT (COMPRESS("mavar"||LEFT(put(_N_,4.))),&nbocc);
varId=symget("mavar"||LEFT(put(_N_,4.)));
RUN;
%MEND test;
%test();
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 09h24   #5
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 807
Points : 4 807
Pour voir les subtilités essaye ça.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DATA base;
INPUT var1 var2;
cards ;
10 11
15 22
;
RUN;
%MACRO test();
DATA base2;
SET base;
CALL SYMPUT (COMPRESS("mavar"||LEFT(put(_N_,4.))),var1);
varId=symget("mavar"||LEFT(put(_N_,4.)));
RUN;
%MEND test;
%test();
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 09h26   #6
Membre à l'essai
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 22
Points : 22
Envoyer un message via MSN à goulhasch
Bonjour,

Donc si je comprend bien, je devrais utiliser call symput, a chaque test d'une observation pour récupérer la valeur du champs souhaité ?

et symget pour rebasculer la valeur changée ?
goulhasch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 09h28   #7
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 807
Points : 4 807
L'avantage des macros - variables est que tu peux ensuite comparer les valeurs d'une colonne données entre différents individus et créer d'autres variables (macro) indiquant la différence observées (en oubliant pas référencer l'individu (un peu comme un tableau)).
Ensuite tu peux sortir les resultats dans ton data avec call symput et symget.
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 09h29   #8
Membre à l'essai
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 22
Points : 22
Envoyer un message via MSN à goulhasch
Merci je vais tester

j'ai l'impression de ramer ^^
goulhasch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 09h29   #9
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 807
Points : 4 807
Citation:
Envoyé par goulhasch Voir le message
Bonjour,

Donc si je comprend bien, je devrais utiliser call symput, a chaque test d'une observation pour récupérer la valeur du champs souhaité ?

et symget pour rebasculer la valeur changée ?
C bien ça.
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 09h37   #10
Membre à l'essai
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 22
Points : 22
Envoyer un message via MSN à goulhasch
ok! je viens de tester, çà me parle un peu mieux

PAr contre il y a encore quelquechose qui me parait flou :
Code :
("mavar"||LEFT(put(_N_,4.)
enfaite "mavar" c'est un nom que tu donne par défaut comme çà ?
Et "left" sert à quoi ?
ke put veut dire que tu souhaite qu'il affiche ta valeur de l'observation n ?

Merci vraiment beaucoup, je vais essayer de faire qqchose de correct maintenant ^^
goulhasch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 09h44   #11
Membre à l'essai
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 22
Points : 22
Envoyer un message via MSN à goulhasch
Derniere petite question, enfaite je n'ai pas besoin d'utiliser de compteur ?
juste en utilisant _N_ çà s'incremente tout seul pour chaque test ?
goulhasch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 09h57   #12
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 807
Points : 4 807
Citation:
Envoyé par goulhasch Voir le message
ok! je viens de tester, çà me parle un peu mieux

PAr contre il y a encore quelquechose qui me parait flou :

("mavar"||left(put(_N_,4.)

enfaite "mavar" c'est un nom que tu donne par défaut comme çà ?
Et "left" sert à quoi ?
ke put veut dire que tu souhaite qu'il affiche ta valeur de l'observation n ?

Merci vraiment beaucoup, je vais essayer de faire qqchose de correct maintenant ^^
En fait tu crée une macro-variable pour chaque valeur. Donc dans le cas présent tu as crée deux marco-variable : mavar1 et mavar2 .... le but du left est juste d'incrémenter l'indice.
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 09h57   #13
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 807
Points : 4 807
Toujours le même programme qui va encore peut être t'aider
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
 
DATA base;
INPUT var1 var2;
cards ;
10 11
15 22
;
RUN;
%MACRO test();
%let nbocc= _N_ ;
DATA base2;
SET base;
CALL SYMPUT (COMPRESS("mavar"||LEFT(put(_N_,4.))),var1);
varId=symget("mavar"||LEFT(put(_N_,4.)));
RUN;
%DO i=1 %TO 2;
	%LET mavar2&i = %eval(&&mavar&i +10 + &i);
%END;
DATA base3;
SET base;
varId=symget("mavar2"||LEFT(put(_N_,4.)));
RUN;
%MEND test;
 
%test();
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 10h01   #14
Membre à l'essai
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 22
Points : 22
Envoyer un message via MSN à goulhasch
ok d'acc, beh je te remercie tout plein,
comme tu me l'a dit je fais petit à petit,
je viens de recopier une de mes colonne dans une nouvelle, c'est cool

le plus dur reste à venir, merki


je vais tester çà
goulhasch est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 10h03   #15
Responsable SAS
 
Inscription : septembre 2006
Messages : 1 973
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 1 973
Points : 4 807
Points : 4 807
Le même prog avec les put :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
%MACRO test();
%let nbocc= _N_ ;
DATA base2;
SET base;
CALL SYMPUT (COMPRESS("mavar"||left(put(_N_,4.))),var1);
varId=symget("mavar"||left(put(_N_,4.)));
RUN;
%DO i=1 %TO 2;
	%LET mavar2&i = %eval(&&mavar&i +10 + &i);
%END;
DATA base3;
SET base;
varId=symget("mavar2"||left(put(_N_,4.)));
RUN;
%PUT &mavar1;
%PUT &mavar22;
%MEND test;
fafabzh6 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/09/2007, 10h09   #16
Membre à l'essai
 
Inscription : janvier 2005
Messages : 71
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : janvier 2005
Messages : 71
Points : 22
Points : 22
Envoyer un message via MSN à goulhasch
merci encore, c'est beaucoup plus clair
goulhasch 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 05h32.


 
 
 
 
Partenaires

Hébergement Web