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 :

Créer une macro variable à partir d'une macro variable


Sujet :

Macro

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 11
    Points
    11
    Par défaut Créer une macro variable à partir d'une macro variable
    Bonjour !

    Je souhaite créer une macro variable ayant une autre macro variable en paramètre.
    Voici le code et ce qu'il fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    /* Création de la macro variable mv contenant la liste des noms de mes tables */
    %let mv=;
     
    %MACRO liste_tab (var=);
    	%let mv=%str(&mv.METHODO_&var/);
    %MEND ;
     
    %liste_tab (var=FRE_GAU_NB);
    %liste_tab (var=SOE_GAU_NB);
    %liste_tab (var=VAR1_TEST);
    %liste_tab (var=VAR2_TEST);
     
    %put &mv;
     
    /* Macro programme pour créer une macro variable par nom de table */
    %MACRO test_liste;
     
    	*%global mv nomTab test tab tab1 tab2 tab3 tab4 tab5 lng ;
     
    	data _null_;
    		%let i=0;
    		%do %while (%length(&mv) NE 0) ; /* Tant que ma liste &mv n'est pas vide */
    			%let i = %eval(&i+1); /* Compteur i */
    			%let nomTab = %scan(&mv,1,'/'); /* &nomTab contient le nom de la 1ère table de la liste &mv */
    			call symput ("tab"!!left(&i),&nomTab); /* &&tab&i contiendra le nom récupéré par &nomTab */
    			%let lng = %length(&nomTab); /* Longueur du nom récupéré dans &nomTab */
    			%let mv = %substr(&mv,&lng.+2); /* Mise à jour de la liste &mv (j'en retire le nom de la table scanné par &nomTab) */
    		%end;
    	run;
     
    %MEND ;
     
    %test_liste ;
    Mon problème vient du call symput.
    A la fin de ma macro %test_liste, je devrais avoir :
    &tab1 = FRE_GAU_NB
    &tab2 = SOE_GAU_NB
    &tab3 = VAR1_TEST
    &tab4 = VAR2_TEST

    Or, ces 4 macros programmes sont égales à un point.
    Je ne comprends pas pourquoi mais le paramètre &nomTab dans le call symput bloque la création correcte de mes macros var. J'obtiens l'erreur suivante (au niveau du call):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    call symput ("tab"!!left(&i),&nomTab);
    ----
    180
     
    ERROR 180-322: Statement is not valid or it is used out of proper order.

    J'ai essayé avec call symputx également, mais ce n'est pas mieux.

    Si quelqu'un comprend l'erreur et a une idée de comment la régler, je suis intéressée !

  2. #2
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    A force d'essayer des choses, on en fait des erreurs bêtes...
    L'erreur sur le call symput était simplement due à ma ligne %global que j'avais mis en commentaire par une * (et ça, en macro, ça ne va pas !).

    Je n'ai donc plus d'erreurs apparentes dans ma log... mais mes macros variables contiennent toujours des . à leur création !

  3. #3
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    J'avance petit à petit : j'ai compris que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call symput ("tab"!!left(&i),&nomTab);
    résolvait &nomTab en FRE_GAU_NB (si on prend l'exemple du 1er tour de la boucle) et donc mon programme cherche une variable de ce nom, alors qu'elle n'existe pas. Ce que je voulais, c'était dire à SAS de prendre le contenu de la macro var, mais ce n'est pas ce qu'il fait (et c'est normal en fait).

    Du coup, pour parvenir tout de même à créer une macro var par nom de table, je pense devoir plutôt passer par un %let auquel j'aurai mis un compteur. Voici (idée grossière) ce que j'imagine : Sauf que, bien sûr, tel quel, SAS n'aime pas mon &i dans le %let.

    Savez-vous s'il est possible de mettre un compteur, d'une quelconque façon, à un %let ? Ou de faire autrement ?

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    Au temps pour moi !

    fonctionne très bien. A force d'essayer des trucs, je me suis mélangée les pinceaux et je ne savais plus ce qui marchait et ce qui ne marchait pas.

    Problème résolu

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 482
    Points : 1 547
    Points
    1 547
    Par défaut
    Bonjour,
    Je crois que tu peux également essayer la macro variable de la call symput qui devrait être entre double quote "&nomTab" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    call symput ("tab"!!left(&i), "&nomTab")  ;
    Ward

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    J'avais également pensé à ça, mais ça ne fonctionne pas.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/03/2013, 17h07
  2. Créer une variable à partir d'une macro
    Par cemyr dans le forum Macro
    Réponses: 3
    Dernier message: 08/12/2011, 10h11
  3. Réponses: 4
    Dernier message: 10/10/2010, 11h46
  4. Réponses: 2
    Dernier message: 05/03/2010, 14h15
  5. Réponses: 1
    Dernier message: 10/10/2008, 23h29

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