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 23/11/2010, 17h13   #1
Membre du Club
 
Homme Fabien
Inscription : novembre 2008
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Localisation : France

Informations forums :
Inscription : novembre 2008
Messages : 59
Points : 56
Points : 56
Par défaut Macro dans etape Data

Bonjour,

Je voudrais savoir si c est possible d'appeler une macro ou un fonction à l'intérieur d'une etape data.

J'ai un macro qui fonctionne mais je ne sais pas comment la faire executer à tout une table.

Ci dessous un exemple simplifié de ce que je souhaite faire (je suis obligé d'utiliser du langage macro dans ma fonction).

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
/* Exemple */
DATA table1;
INPUT VAR1 VAR2 ;
CARDS ;
1 10
2 20
3 50
;
run;
%macro test1(mavar1,mavar2);
%let mavar3 = KO ;
	%IF &mavar1 > &mavar2 %then %do;
		%let mavar3 = OK ;
	%end;
%mend;
DATA table2;
	SET table1;
var3 = %test1(var1,var2);
run;
Ici je voudrais que dans var3 il y est OK ou KO.

Merci d'avance !!
suistrop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 17h18   #2
Membre Expert
 
Homme
Biostatisticien
Inscription : juin 2009
Messages : 1 133
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Irlande

Informations professionnelles :
Activité : Biostatisticien
Secteur : Industrie Pharmaceutique

Informations forums :
Inscription : juin 2009
Messages : 1 133
Points : 1 744
Points : 1 744
Citation:
Je voudrais savoir si c est possible d'appeler une macro ou un fonction à l'intérieur d'une etape data.
oui. Le language macro est résolu lors de la compilation.
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 08h46   #3
Membre éprouvé
 
Homme Rémi Bousquet
responsable adjoint service stat
Inscription : mars 2009
Messages : 334
Détails du profil
Informations personnelles :
Nom : Homme Rémi Bousquet
Âge : 35
Localisation : France

Informations professionnelles :
Activité : responsable adjoint service stat
Secteur : Finance

Informations forums :
Inscription : mars 2009
Messages : 334
Points : 464
Points : 464
Comme l'indique Manoutz,
c'est tout à fait faisable et parfois vraiment pratique en fait !

Ton exemple simplifié ne marche pas en l'état toutefois. D'une part, il y a le %let mavar3., qui ne sert à rien ici, d'autre part tu affectes la OK qui est traité comme un variable, alors qu'il faut affecter "OK" comme une valeur caractère.

Deux exemples qui fonctionnent, et qui sont peut-être généralisables à ton besoin :


Exemple 1 : nécessite de mettre mavar3 comme macro variable également
Code :
1
2
3
4
5
6
7
8
9
10
%macro test2(mavar1,mavar2,mavar3) ; 
    length &mavar3. $2. ;
    IF &mavar1. > &mavar2.
        then &mavar3. = "OK" ;
        else &mavar3. = "KO" ; 
%mend ;
DATA table2;
	SET table1;
    %test2(var1,var2,var3);
run;
Exemple 2 : nécessite d'utiliser la fonction ifc
Code :
1
2
3
4
5
6
7
8
%macro test3(mavar1,mavar2) ;
    ifc (&mavar1. > &mavar2., "OK", "KO", "xx") ;
%mend ;  
DATA table2;
	SET table1;
    length var3 $2. ;
    var3 = %test3(var1,var2);
run;
RemiBousquet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 10h57   #4
Membre du Club
 
Homme Fabien
Inscription : novembre 2008
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Localisation : France

Informations forums :
Inscription : novembre 2008
Messages : 59
Points : 56
Points : 56
Bonjour,

Merci de vos réponse mais mon code est quand meme bien plus compliqué, c est pour cela que j ai mis expres du macro langage car je crois que je n'ai pas le choix...

Par exemple je dois creer un certain nombre de variable en fonction de la longueur des mots traités... peut etre en utilisant des array mais je ne maitrise pas trop ces derniers...

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
/* Exemple */
DATA table1;
INPUT VAR1 $ VAR2 $ ;
CARDS ;
TOTO TATTA
;
run;
%macro test2(mot_1,mot_2) ; 
%let longueur_mot_1 = %sysfunc(length(&mot_1));
%let longueur_mot_2 = %sysfunc(length(&mot_2));
%let dist_max = %sysevalf((%sysfunc(max(&longueur_mot_1,&longueur_mot_2)) / 2) - 1);
%put &dist_max;
%let compteur = 0;
/* creation de macro variable dont on aura besoin lors du traitement des transpo */
	%do x = 1 %TO &longueur_mot_1;
		%let M1_&x. = 0 ;
	%end;
	%do y = 1 %TO &longueur_mot_2;
		%let M2_&y. = 0 ;
	%end;
 
	%let mot_match1 = ;
%do i = 1 %TO &longueur_mot_1;
	%IF &&M1_&i. = 1 %then %do;
		%let mot_match1 = &mot_match1%sysfunc(SUBSTR(&mot_1,&i,1)) ;
	%end;
%end;
%put &mot_match1;
 
var3 = &mot_match1;
 
%mend ;
 
DATA table2;
	SET table1;
    %test2(var1,var2);
run;
suistrop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 14h24   #5
Membre du Club
 
Homme Fabien
Inscription : novembre 2008
Messages : 59
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Localisation : France

Informations forums :
Inscription : novembre 2008
Messages : 59
Points : 56
Points : 56
Bonjour,

Finalement je m'en sors avec les array... ca complique encore mon code mais ca semble marcher !

A+
suistrop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2010, 15h05   #6
Membre Expert
 
Inscription : mars 2005
Messages : 1 010
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 010
Points : 1 258
Points : 1 258
Envoyer un message via Yahoo à bahraoui
Bonjour,

Tu peux utiliser un call execute, ça te permet d'appeler une macro dans étape data.

Cordialement
__________________
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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h20.


 
 
 
 
Partenaires

Hébergement Web