IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macro Discussion :

%include à l'intérieur d'une macro


Sujet :

Macro

  1. #1
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 243
    Points : 200
    Points
    200
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Salut,
    Faudrait tout dire à SAS, ie le répertoire où se trouve le programme que tu appelles. Voici la synthaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    %include "C:\~\hello.sas";
    Bon courage

  3. #3
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 243
    Points : 200
    Points
    200
    Par défaut
    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.

  4. #4
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    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!

  5. #5
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 243
    Points : 200
    Points
    200
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Je t'en prie!
    J'ai pas tout compris (très mal dormi cette nuit)

    Pourquoi tu n'écris pas tout simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é !

  7. #7
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 243
    Points : 200
    Points
    200
    Par défaut
    Effectivemment, c'est ce que j'étais en train d'essayer.

    Et ça fonctionne comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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!

  8. #8
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		%IF &nb_metrics gt 0 %then
    		%do;
    			%include "C:\~\hello.sas";		
    %end;

  9. #9
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Ne me reveille plus stp!

  10. #10
    Membre expérimenté
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Points : 1 489
    Points
    1 489
    Par défaut
    Citation Envoyé par Manoutz Voir le message
    quel est l'intérêt du macro programme? ;
    Dire bonjour à SAS par un autre programme

  11. #11
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    alors quel est l'intérêt du %include????

  12. #12
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 243
    Points : 200
    Points
    200
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  13. #13
    Membre chevronné
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Juin 2009
    Messages
    1 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 206
    Points : 1 868
    Points
    1 868
    Par défaut
    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

  14. #14
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    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.
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  15. #15
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2002
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 243
    Points : 200
    Points
    200
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  16. #16
    Membre du Club
    Homme Profil pro
    Ingénieur Statisticien
    Inscrit en
    Janvier 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Statisticien
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2013
    Messages : 28
    Points : 59
    Points
    59
    Par défaut
    Quelques mois après la bataille, je passe par ici en touriste mais il est possible de lever le dernier petit mystère posé par L0007 :

    La réponse est simplement de combiner proprement les deux codes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    %macro test_location(chemin,fichier,valeur);
     
    	%let loc =&chemin.;
    	%let file=&fichier.;
     
    	%if &valeur gt 0 %then %do;
    		filename location "&loc.";
    		%include location("&fichier.");
    	%end;
    %mend test_location;
    Si besoin la macro peut être améliorée en modulant le chemin ou le fichier à votre guise...

    Voilà voilà... ça, c'est fait.

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Chargé de sélection client
    Inscrit en
    Février 2017
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de sélection client

    Informations forums :
    Inscription : Février 2017
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Autre option
    Bonjour à tous,

    J'ai parcouru la discussion mais je n'y ai pas trouvé mon bonheur et chez mon ami Google non plus.

    Je souhaite via du code, lancer un programme (ou liste triée) dans le projet en cours et donc sans chemin de fichier externe.

    Voir plus tard, j'aurai besoin d'une solution pour lancer un programme (et un seul) d'un projet extérieur au projet en cours.

    En espérant avoir été clair dans mes besoins, auriez vous une solution svp?

    Merci d'avance.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. include d'une Macro ?
    Par airod dans le forum Zope
    Réponses: 0
    Dernier message: 28/05/2010, 15h04
  2. Suppression de table à l'intérieure d'une macro
    Par CélineM dans le forum Macro
    Réponses: 1
    Dernier message: 23/04/2008, 13h57
  3. Gestion d'une inputbox à l'intérieur d'une macro.
    Par Mourne dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/07/2007, 17h57
  4. Qu'est-ce qu'une macro ?
    Par karli dans le forum Assembleur
    Réponses: 2
    Dernier message: 01/09/2002, 03h38
  5. Réponses: 2
    Dernier message: 22/07/2002, 12h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo