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 09/03/2011, 11h15   #1
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Par défaut %include à l'intérieur d'une macro

Bonjour,

Encore un petit problème de macro. (pas encore une partie que j'ai vraiment étudié )

J'essaye d'appeler mon programme "hello.sas" via une macro:
Le programme hello.sas (Assez original, je l'avoue )
Et mon programme appelant qui fait :
Code :
1
2
3
4
5
6
7
8
9
 
%macro run_metrics(nb_metrics);
	%IF &nb_metrics gt 0 %then
		%do;
			%include("hello.sas");
		%end; 
%mend;
 
%run_metrics(1);
J'obtiens le message suivant:
Code :
ERROR: Incorrect %INCLUDE statement will NOT be executed. There IS a syntax error.
Merci pour votre aide, ce doit probablement être un problème de quoting... mais pour l'instant je
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 11h28   #2
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
Salut,
Faudrait tout dire à SAS, ie le répertoire où se trouve le programme que tu appelles. Voici la synthaxe:

Code :
%include "C:\~\hello.sas";
Bon courage
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 11h35   #3
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Salut Megamind,

Je viens d'essayer avec le chemin complet mais ce n'est pas le problème.
Comme je suis dans le répertoire courant (En fait, je fais plusieurs appels avec un %include("nom_programme.sas") et ça fonctionne).
Mais ici c'est différent parce que je fait l'appel à l'intérieur d'une macro.
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 11h39   #4
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
C'est pas parceque tu appelles un programme dans une macro que ça marche pas.

En tout cas j'ai testé et ça marche nickel!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 12h00   #5
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Point positif: J'ai presque écris un code qui fonctionne

Sinon --> MEA CULPA!
Je fais mes appels avec include de la manière suivante (hors macro)
Code :
1
2
3
4
5
6
7
8
 
/* par exemple le chemin est C:\Temp\ */
%global global_path;
%let global_path = C:\Temp\;
filename location "&global_path";
 
/*appel d'un pogramme pas à partir d'une macro*/
%include location("mWindow.sas");
Et donc dans ma macro je devrais avoir le code suivant:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
%macro run_metrics(nb_metrics);
	%let file = hello;
	%let loc = "&global_path";
	%IF &nb_metrics gt 0 %then
		%do;
/* C'est cette ligne qui me pose problème. */
		%include location ("hello.sas");		
                          %end; 
%mend;
 
%run_metrics(1);
location = &global_path
global_path est déclaré comme globale.
....mais pas location

Comment réécrire cette ligne dans une macro?
%include location ("hello.sas");

PS: Encore désolé Megamind --> Mea culpa
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 12h08   #6
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
Je t'en prie!
J'ai pas tout compris (très mal dormi cette nuit)

Pourquoi tu n'écris pas tout simplement:

Code :
1
2
3
4
5
6
7
8
9
%macro run_metrics(nb_metrics);
 
		%IF &nb_metrics gt 0 %then
		%do;
			%include "C:\~\hello.sas";		
%end; 
%mend;
 
%run_metrics(1);
Je ne maitrise pas ta synthaxe (location), désolé !
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 12h19   #7
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Effectivemment, c'est ce que j'étais en train d'essayer.

Et ça fonctionne comme ceci:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
%let test = "&global_path.hello.sas";
%put &test;
 
%macro run_metrics(nb_metrics);
	%let file= "&global_path.hello.sas";
	%let loc = "&global_path";
	%IF &nb_metrics gt 0 %then
		%do;
			%include &file;
		%end; 
%mend;
 
%run_metrics(1);
Donc ton idée de %include chemin_du_fichier_sas fonctionne parfaitemment.

Si quelqu'un voit la solution avec %include location ("fichier.sas") je suis preneur...

En attendant,
Merci beaucoup et bonne journée.
Message Perso: Merci beaucoup Megamind et bonne journée... nuit!
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 12h22   #8
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
quel est l'intérêt du macro programme? Un peu de macro language (sans macro programme) devrait suffire à priori.... Etant donné que tu disposes déjà de la macro variable nb_metrics, et , je suppose, que tu ne vas pas réaliser plusieurs fois un include du même fichier...

cela ne suffit-il pas?
Code :
1
2
3
4
5
 
		%IF &nb_metrics gt 0 %then
		%do;
			%include "C:\~\hello.sas";		
%end;
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 12h23   #9
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
Ne me reveille plus stp!
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 12h27   #10
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
Citation:
Envoyé par Manoutz Voir le message
quel est l'intérêt du macro programme? ;
Dire bonjour à SAS par un autre programme
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/03/2011, 12h29   #11
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
alors quel est l'intérêt du %include????
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 12h37   #12
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
Citation:
Envoyé par Manoutz Voir le message
quel est l'intérêt du macro programme? Un peu de macro language (sans macro programme) devrait suffire à priori.... Etant donné que tu disposes déjà de la macro variable nb_metrics, et , je suppose, que tu ne vas pas réaliser plusieurs fois un include du même fichier...

cela ne suffit-il pas?
Code :
1
2
3
4
5
 
		%IF &nb_metrics gt 0 %then
		%do;
			%include "C:\~\hello.sas";		
%end;
Non, non, effectivement je ne vais pas faire plusieurs fois un include du même fichier.

En fait, j'ai mis ici un code simplifié car mon programme est beaucoup plus long. (Et fais plus que dire Bonjour )

Le but est que si nb_rep = 0 je ne fais rien de spécial.
Par contre si nb rep > 0 (par exemple nb_rep=3)
alors je fais:
1 fois mon include
et ensuite je crée une boucle qui appelle mes programmes pour créer des métriques (metric1.sas, metric2.sas, ....metricn.sas)
du style:
Code :
1
2
3
4
5
6
7
8
9
10
 
%DO num = 1 %TO &nbrep;
		%let fref = %sysfunc(pathname(location))\Metric_&num..sas;
		%IF %sysfunc(fileexist(&fref)) %THEN
		%DO;
			%include "&fref";
		%END;
		%ELSE
			%put %str(WARNING:&fref does NOT exist);
	%END;
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 12h47   #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
Si je comprends bien tu fais plusieurs include, et le fichier de chaque include est adapté en fonction de l'itération de la boucle. OK.

Par contre (c'est un peu chipoter, je sais..) mais dans l'idée il me semble qu'on peut se passer du macro programme
Manoutz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 13h03   #14
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 006
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 006
Points : 1 701
Points : 1 701
Bonjour;
je ne comprends pas ce qui ne marche pas ( la boucle ou les INCLUDE)?

sinon avec un %GO%TO et/ou un (%else %do au lieu de %else),ne marche pas non plus.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2011, 13h17   #15
Membre habitué
 
Homme
Consultant informatique
Inscription : mars 2002
Messages : 211
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique

Informations forums :
Inscription : mars 2002
Messages : 211
Points : 133
Points : 133
S_a_m,

Ne nous égarons pas
Le problème est résolu en codant d'une autre manière.

Sinon, j'aurais voulu savoir si quelqu'un avait une idée pour faire fonctionner le include comme indiqué ci dessous....
(Juste pour voir si c'est possible)
Citation:
Envoyé par L0007 Voir le message
Point positif: J'ai presque écris un code qui fonctionne

Sinon --> MEA CULPA!
Je fais mes appels avec include de la manière suivante (hors macro)
Code :
1
2
3
4
5
6
7
8
 
/* par exemple le chemin est C:\Temp\ */
%global global_path;
%let global_path = C:\Temp\;
filename location "&global_path";
 
/*appel d'un pogramme pas à partir d'une macro*/
%include location("mWindow.sas");
Et donc dans ma macro je devrais avoir le code suivant:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
%macro run_metrics(nb_metrics);
	%let file = hello;
	%let loc = "&global_path";
	%IF &nb_metrics gt 0 %then
		%do;
/* C'est cette ligne qui me pose problème. */
		%include location ("hello.sas");		
                          %end; 
%mend;
 
%run_metrics(1);
location = &global_path
global_path est déclaré comme globale.
....mais pas location

Comment réécrire cette ligne dans une macro?
%include location ("hello.sas");

PS: Encore désolé Megamind --> Mea culpa
L0007 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 18h05.


 
 
 
 
Partenaires

Hébergement Web