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 26/01/2011, 12h17   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 33
Points : 10
Points : 10
Par défaut créer sa propre fonction

Bonjour,

J'ai créé une macro qui récupère un nom de variable dans une table.
Mon problème c'est que je ne sais pas comment réutiliser cette "fonction".
Je voudrais faire un truc du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
%macro recup (tabName);
   %global &vbName;
  /* ... */
  &vbName;
%mend;
 
%macro modif (tabName);
  /*...*/
  %IF %recup(tabName)=1 %then do;
      /*...*/
%mend;
cemyr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 12h21   #2
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
une fois que tu as créé ta macro il faut la compiler, c'est-à-dire lancer le code de %macro à %mend. viens ensuite la deuxième phase, l'éxécution, il suffit d'appeler la macro contenant les paramètres que tu désires.

dans le cas de ta première macro ca donnerais:

mais pour info, tu peux récupérer tes variablezs sans passer par le language macro via la proc contents, par exemple
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 12h22   #3
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
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 : 956
Points : 1 366
Points : 1 366
Bonjour,
C'est plus facile de t'aider si tu postais ton code.
Personne va te le piquer, en tout cas pas moi!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 12h35   #4
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 33
Points : 10
Points : 10
Désolé mais je ne comprend pas la réponse.

En fait ma 1ière macro récupère le nom de ma 1ière variable (en utilisant un proc contents). Voici le code (je l'avais enlever par soucis de simplicité mais c'est raté apparemment )

Code :
1
2
3
4
5
6
7
8
9
10
 
%macro RecupName (mvtable) ;
   %global mvname ;
   proc contents DATA=&mvtable out=resuproc noprint ; run ;
   DATA resultat ;
      SET resuproc (keep=varnum name WHERE=(varnum=1)) ;
      call symputx ("mvname", name) ;
   run ;
   &mvname;
%mend ;
Et dans ma 2ième macro je veux faire -entre autre- un test sur cette 1ière variable sans connaitre son nom (d'où l'appel de la 1ière macro).
/* Je ne pense pas qu'il soit utile de mettre toute la macro */

Mais la ligne
Code :
 %IF %RecupName (lib.tab)=1
engendre un message d'erreur :
Code :
ERREUR: Opérateur requis manquant dans expression : %RecupName (...)=1
cemyr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h07   #5
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
qd tu lances ce code sas "enregistre", si on peux dire, la macro et ce qu"elle peut faire.

après il faut l'appliquer sur des données concrètes. C'est l'éxécution. par exemple si tu veux appplliquer ce code au data set appelé test et situé dans la llibraiie bib, il faut que tu lances:

%recup (bib.test);
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h21   #6
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
Envoyé par cemyr Voir le message

Désolé mais je ne comprend pas la réponse.


Nous non plus, on comprend pas ce que tu veux.
dis nous ce que tu veux vraiment faire, on va réflichir avec toi.Il se peut que tu n'as besoin que d'un seul CODE MACRO.

Julie.
  Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h26   #7
Membre actif
 
Inscription : mars 2003
Messages : 149
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 149
Points : 162
Points : 162
Salut,

A la place de

%if %RecupName (lib.tab)=1 , pourquoi ne ferais tu pas

Code :
1
2
3
 
%RecupName (lib.tab);
%IF &mvname=1 %then ....
Et dans ta macro RecupName, ta dernière ligne est inutile (et engendre une erreur chez moi)
la2002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h26   #8
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 33
Points : 10
Points : 10
Par défaut hum hum

Désolée d'être incompréhensible

Pour chacune de mes tables, Je veux faire un traitement particulier sur la 1ière variable dont je ne connais pas le nom.

Pour le moment ,
1=> je fais "tourner" ma macro 1 qui récupère le nom de ma 1ière variable.
2=> ensuite je veux l'appeler dans ma macro 2

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
/* Engendre un message d'erreur */
%macro essai();
	DATA a;
	SET F1.F110780061tab01_a;
	%IF %RecupName (F1.F110780061tab01_a)="" %then a=1;
	run;
%mend;
%essai();
 
/* Pas de message d'erreur mais ne fonctionne pas */
%macro essai();
	DATA a;
	SET F1.F110780061tab01_a;
	%RecupName (F1.F110780061tab01_a);
	%IF &mvname="" %then a=1;
	run;
%mend;
%essai();
En espérant avoir été plus claire...
cemyr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h29   #9
Membre actif
 
Inscription : mars 2003
Messages : 149
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 149
Points : 162
Points : 162
Et çà, c'est bon ?

Perso, j'évite de mélanger une etape data avec du macro.

Code :
1
2
3
4
5
6
7
8
9
10
%macro essai();
 
	%RecupName (F1.F110780061tab01_a);
 
	DATA a;
	SET F1.F110780061tab01_a;
	IF &mvname="" then a=1;
	run;
%mend;
%essai();
la2002 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h36   #10
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
si tu essaies de voir ce que sas va faire tourner quand tu lances tes deux macros recupname et essai, tu verras que tu fais une étape data dans une étape data, ce qui n'est un code correct pour sas.

comme rose le dit, essaie de tout compresser dans une seule macro
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h42   #11
Membre Expert
 
Avatar de MEGAMIND2
 
Homme Brice Beare
Paris
Inscription : janvier 2011
Messages : 956
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 : 956
Points : 1 366
Points : 1 366
Si On suppose que tu veux faire un proc means sur ta variable passée en paramètre. Je sais pas si j'ai bien compris ce que tu veux

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
DATA TEST;
INPUT X Y Z $;
CARDS;
11 45 L
10 25 M
78 14 U
 
;
RUN;
 
 
 
%MACRO RecupName(mvtable=, var=) ;
 
   proc contents DATA=&mvtable. out=resuproc noprint ; 
    run ;
 
 
   PROC SQL;
   SELECT NAME INTO: mvname separated BY ' ' FROM RESULTAT ;QUIt;
 
%IF "&var."="&mvname." %then %do;
	proc means DATA =TEST;
		var &var.;
		output out=Aout(DROP=_TYPE_  _FREQ_);
	run;
%END;
 
%MEND RecupName;
 
%RecupName(mvtable=TEST,var=X);
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h48   #12
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 33
Points : 10
Points : 10
Effectivement je n'avais même pas vu mes étapes data imbriquées!!!
Ma 2ième macro est très longue et va faire appel de nombreuses fois à la 1ière. C'est pour ca que je les ai séparé.

en tout cas merci pour votre acharnement et désolé pour cette stupide erreur/

Code :
1
2
3
4
5
6
7
8
9
 
%macro essai();
	%RecupName (lib.tab);
	DATA a;
	SET lib.tab;
	IF &mvname="" then vara="1";
	run;
%mend;
%essai();
cemyr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 13h53   #13
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 143
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 143
Points : 1 760
Points : 1 760
pas de soucis...

une dernière chose: ta macro essai n'a pas de paramètres. Ce qui veux dire qu'à chaque fois que tu vas lancer %essai, tu le feras sur la table physique lib.tab. Ce ne serait pas mieux de passer cette table en dynamique, c'est-à-dire en paramètre?
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 14h07   #14
Candidat au titre de Membre du Club
 
Inscription : décembre 2010
Messages : 33
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 33
Points : 10
Points : 10
oui bien sûr.. je me répète ma 2ième macro est bien plus longue que celle-ci... ca ce n'était qu'un "essai" pour tester le problème que j'ai rencontré
cemyr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2011, 14h11   #15
Membre expérimenté
 
Inscription : avril 2009
Messages : 537
Détails du profil
Informations forums :
Inscription : avril 2009
Messages : 537
Points : 540
Points : 540
sans macro :

Utilisation d'un tableau pour y stocker les variables caracteres.
La première position est la première variable.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA WORK.CLASS; 
   length ANALIZ $ 40;
   SET SASHELP.CLASS end=eof;
   IF mod(_N_, 2) then ANALIZ = "";
                  else ANALIZ = "cqssqd";
   IF eof then ANALIZ = repeat(" ", 30) || "  vide";
run;
 
DATA WORK.CHECK;
   SET WORK.CLASS;
   array char $32767. _CHAR_ ;
   IF char{1} = "" then a = 1;
                   else a = 2;
run;
xav2229 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 04h28.


 
 
 
 
Partenaires

Hébergement Web