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 31/01/2011, 16h17   #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 et SAS_EXECFILEPATH

Bonjour,

Je m'embrouille

J'ai une macro qui récupère le répertoire courant de l'exécution du programme.
(J'ai le path et le nom du fichier est retiré)
Code :
1
2
3
4
5
%global path; /*Contains the execution path for this sas program.*/
 
%macro grabpath ;
%let path = %qsubstr(%sysget(SAS_EXECFILEPATH),1,%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILEname)));
%mend grabpath;
Donc dans path j'ai H:\AppData\SAS\SASPC-ICSC\SasProc\Test\

Je voudrais utiliser cette valeur avec l'instruction %include
avant j'avais le code suivant:
Code :
%include Initialization;
qui allait me rechercher le code du programme Initialization.sas

J'ai du changer de répertoire et j'aurais voulu pouvoir faire ceci:
Code :
%include &path.Initialization;
Mais SAS n'est pas très content.

Quelqu'un peut-il m'aider?

Merci
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 16h24   #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
Il te manque les quotes je pense

Code :
include "&path.Initialization"
et Initialization ne serait pas Initialization.sas?
MEGAMIND2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 16h25   #3
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
bonjour;

Code :
1
2
3
4
5
6
7
8
 
 
proc sql noprint;
SELECT xpath INTO :progname
FROM sashelp.vextfl WHERE upcase(xpath) LIKE '%.SAS';
quit;
 
%include "&progname";
  Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 21h48   #4
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 823
Points : 2 823
Bonjour.
Il y a en fait 3 syntaxes pour %INCLUDE :
- %INCLUDE nomProgramme ; que tu utilisais jusqu'à présent. Elle ne fonctionne qu'en sous-entendant le répertoire, c'est à dire que SAS cherche dans son répertoire par défaut (en bas à droite de la session sur SAS Windows). Et ne fonctionne que si tu n'as aucun caractère "spécial" dans ton nom de programme, par exemple des tirets feront planter.
- %INCLUDE pgm ; avec PGM le nom logique associé à une instruction FILENAME préalable. Dans ton cas ça donnerait :
Code :
1
2
3
 
FILENAME init "&path.initialization.sas" ;
%INCLUDE init ;
- %INCLUDE "chemin et nom du fichier avec son extension" ; qui correspond à la suggestion de Brice.
Code :
%INCLUDE "&path.initialization.sas" ;
Bon courage.
Olivier

@Julie : 2 remarques sur ton (très joli) code. La première c'est que tu récupères exactement la même info qu'avec %sysget(SAS_EXECFILEPATH). La 2e c'est que dans la proc SQL, on a intérêt à attaquer les vues DICTIONARY équivalentes à celles de la SASHELP. Car en fait, la SASHELP fait des vues vers les vues DICTIONARY !
Code :
1
2
3
4
proc sql noprint;
SELECT xpath INTO :progname
FROM dictionary.extfiles WHERE upcase(xpath) LIKE '%.SAS';
quit;
Même résultat, mais ça doit aller (marginalement, je le concède) un poil plus vite.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 01/02/2011, 09h21   #5
Invité
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Citation:
Envoyé par olivier.decourt Voir le message
@Julie : 2 remarques sur ton (très joli) code. La première c'est que tu récupères exactement la même info qu'avec %sysget(SAS_EXECFILEPATH). La 2e c'est que dans la proc SQL, on a intérêt à attaquer les vues DICTIONARY équivalentes à celles de la SASHELP. Car en fait, la SASHELP fait des vues vers les vues DICTIONARY !
Code :
1
2
3
4
proc sql noprint;
SELECT xpath INTO :progname
FROM dictionary.extfiles WHERE upcase(xpath) LIKE '%.SAS';
quit;
Même résultat, mais ça doit aller (marginalement, je le concède) un poil plus vite.

Merci Olivier.


On apprend toujours . Mais je me disais que pour une vue sur les tables de SASHELP sont tellement trop petites qu'il n'y a pas de différence entre interroger une table ou une vue.
Mais personnellement j’opte pour la solution N°1 c'est-à-dire avec le %sysget ( moins de code et même résultat )

Merci encore Olivier.

Julie.
  Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 09h42   #6
Rédacteur
 
Homme Stéphane
Consultant et formateur SAS et Cognos
Inscription : avril 2009
Messages : 1 791
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Consultant et formateur SAS et Cognos
Secteur : Conseil

Informations forums :
Inscription : avril 2009
Messages : 1 791
Points : 4 012
Points : 4 012
J'utilise une autre syntaxe pour l'include.

Code :
1
2
3
4
Filename pgm "d:\projet\pgm";
 
%include pgm(prog1.sas);
%include pgm(prog2.sas);
Ca permet de composer des variantes

Code :
1
2
%include pgm(prog1,prog2)
%include pgm(prog1) lrecl=2000
Ca vient des environnements Mainframe mais ca fonctionne partout.
__________________
N'oubliez pas de cliquer sur lorsque votre problème est réglé !

Moteur de recherche dans les papiers SAS
datametric est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 11h00   #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
Bonjour!

Merci à tous pour vos réponses!

J'ai opté pour la solution de datametric et olivier (%include pgm).
(en fait c'est exactement celle que je voulais atteindre hier mais je me suis trop embrouillé à force d'avoir trop essayé
Comme je dois faire plusieurs include dans le code, je trouve cette solution plus visible plutôt que d'aller chercher dans la chaîne de caractères... --> C'est juste une question de goût )

@Tous merci pour ces explications. C'est toujours impressionnant ce qu'on apprend en postant sur ce forum.(Je ne savais pas par exemple qu'il y avait différentes possibilités pour utiliser un %include.)

@megamind
De ce que j'avais lu, l'utilisation du *.sas n'était pas obligatoire.
(Mais je ne sais pas si c'est toujours optionnel ou bien obligatoire dans certains cas.)

Voici donc le code final:
Code :
1
2
3
 
/*code de t2.sas juste pour vérifier que l'appel a fonctionné.*/
%put hello!;
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
/*programme principal*/
%global path; /*Contains the execution path for this sas program.*/
 
%macro grabpath ;
%let path = %qsubstr(%sysget(SAS_EXECFILEPATH),1,%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILEname)));
%mend grabpath;
 
%grabpath;
%put &path;
filename dir "&path";
 
%include dir(t2);
Et voilà.... encore une de mes questions avec un tag "Résolu"!
L0007 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 11h25   #8
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
Comme quoi on a pas fini d'apprendre!!
MEGAMIND2 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 06h48.


 
 
 
 
Partenaires

Hébergement Web