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 :

macro avec call symput


Sujet :

Macro

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut macro avec call symput
    Bonjour,

    Je voudrais savoir s'il est possible de mettre dans le premier paramètre de call symput une macro variable ?

    Ci dessous un exemple table essaie:
    obs toto tata titi
    1 a rr yy
    2 b ss vv
    3 c tt ww

    Je souhaite créer autant de macro variable qu'il y a de données (soit 9 = a, b, c, rr, ss, tt, yy, vv, ww).

    pour prendre les données de chaque colonne je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    data _null_;
    set essaie end=fin;
    call symput('soleil'||left(_n_),(trim(toto)));
    if fin tehn call symput('nb',_n_);
    run;
     
    %macro repet;
    %local i;
    %do i=1 %to &nb;
    %put soleil&i is &&soleil&i;
    %end;
    %mend repet;
    résultats :

    soleil1 is a
    soleil2 is b
    soleil3 is c

    Maintenant je souhaite faire la meme chose pour les colonnes "tata" et "titi" : jaimerais donc savoir ce que je dois faire pour ne pas avoir 3 fois le meme programme ? autrement dit peut on mettre une macro var dans call symput qui permettra de changer automatiquement le nom de la colonne à prendre en compte et le nom des macro variable.

    Merci d'avance pour votre aide.

  2. #2
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    tu peux utiliser la proc contents pour créer une table qui contient les noms des variables de ta table, que tu trransforme après en macro variable.
    Pour chaque macro variable créée au dessus tu exécutes ton code.

  3. #3
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    Exactement, tu créé la table avec
    proc contents data= out=

    tu fais le call symput pout récupérer les nom de variables
    call symput('var'||left(_n_),(trim(varname)));
    if fin tehn call symput('nb_var',_n_);

    tu met ton précédent programme dans une boucle %do j=1 %to &nb_var

    juste avant %do i=1 %to &nb; tu pourra mettre
    %put TABLE &&var&j ;

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Bonsoir,

    je souhaite que le nom des macro var soit différent entre les 3 variables : par exemple, les valeurs de la variables "toto" sont récupérées dans les macro var "soleil1, soleil2, soleil3"
    pour les valeurs de la variable "tata", les macro var seront "lune1 lune2 lune3"
    et pour les valeurs de la variable "titi", les macro var seront "terre1 terre2 terre3"

    je souhaite donc avoir : call symput(&zz,&var) pour changer à la fois le nom de la variable à prendre en compte mais également le nom des macro var
    => le programme ne fonctionne pas

    Merci.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Bonsoir,

    Il me semble que ce que je souhaite mettre en place n'est pas possible.
    Je récupère donc au fur et à mesure les valeurs que je stocke dans des macro var à l'aide de call symput et je relance le pgm sur les autres variables (à l'aide d'une macro).

  6. #6
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    c'est possible
    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
    34
    35
    36
     
    data essai;
    format toto $1. tata $2. titi $2.;
    input toto $ tata $ titi $;
    cards;
    a rr yy
    b ss vv
    c tt ww
    ;
    run;
     
    %macro toto (var);
    option nomprint;
    DATA _null_;
    SET essai ;
    call symput("&var"||left(_n_),(&&var));
    call symput('nb',_n_);
    run;
    %LOCAL i;
    %do i=1 %TO &nb;
    	%put Affichage &var IS &&&var&i;
    %end;
    %mend;
    %macro appel;
    proc contents data=essai out=cont noprint; run;
    data _null_; set cont;
    call symput('var'||left(_n_),(trim(name)));
    call symput('nb_var',_n_);
    run;
    %do i=1 %to &nb_var;
    	%put Appel &i &&var&i;
    	%toto(&&var&i);
     
    %end;
    %mend;
    %appel;

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Bonsoir,

    Merci !
    j'ai ajouté "&i" dans "%put Affichage &var&i IS &&&var&i";
    ainsi on a bien une macro var pour chaque donnée

    mais pour récupérer l'info dans une table avec symget ça ne fonctionne, il met à blanc :

    data tab;
    donnee1=symget("tata1");
    run;

    Merci encore pour votre aide.

  8. #8
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Le symget tu le fais dans la macro ou en dehors?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    je le fais en dehors mais je crois qu'effectivement le pb vient de là

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    je l'ai mis à l'interieur de la macro mais ça ne fonctionne toujours pas...

    la solution finale (avant que tu ne trouves comment faire) que j'avais retenu est :

    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
     
    %macro repetition(modif,num);
    data _null_;
    set tab end=fin;
    call symput('teach'||left(_n_),(trim(&modif)));
    if fin then call symput('nb',_n_);
    run;
    %do i=1 %to &nb;
    %put teach&i is &&teach&i;
    %end;
    data don#
    dona&num=symget ('teach1');
    donb&num=symget ('teach2');
    donc&num=symget ('teach3');
    run;
    %mend;
     
    %repetition(livres,5);
    %repetition(films,6);
    %repetition(jeux,7);

  11. #11
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Que veux tu faire?
    Est ce que tu peux m'envoyer un extrait de la table tab pour que je vérifie le code?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    voici la table sur laquelle j'ai fait le test :

    livre cd dvd ;
    44 125 90
    12 5 10
    500 1000 2000

    ces 9 données je souhaite les mettre dans des macro var qui ont chacune un nom différent
    et ensuite je mets la valeur de toutes ces macro var dans une table (on a une macro var = une colonne, table que je transpose ensuite pour avoir 1 ligne = 1 macro var)

    je ne sais pas si suis claire...

  13. #13
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Je ne comprends pas pourquoi :
    table => macro variabel => créer une nouvelles tables
    Tu ne peux pas transposer la table dés le début?
    Je ne sais pas si j'ai bien compris==> tu veux créer autant de variavles que de tables (une table par variable)?

  14. #14
    Membre éprouvé
    Avatar de steelspirit
    Homme Profil pro
    SAS discute
    Inscrit en
    Janvier 2008
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SAS discute
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 472
    Points : 916
    Points
    916
    Par défaut
    Citation Envoyé par kabstat Voir le message
    ces 9 données je souhaite les mettre dans des macro var qui ont chacune un nom différent
    Peux tu être plus précis ? combien de macro variables veux tu créer ? quelles sont leurs noms et quelles valeurs contiennent elles ?
    Citation Envoyé par kabstat Voir le message
    et ensuite je mets la valeur de toutes ces macro var dans une table (on a une macro var = une colonne, table que je transpose ensuite pour avoir 1 ligne = 1 macro var)
    A partir de ton exemple, peux tu nous montrer la table que tu souhaite avoir en sortie ?

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    je veux créer autant de macro variable qu'il existe de données
    dans mon exemples il y a 9 données donc je crée 9 macro variables
    et ces macro var sont regroupées par type de colonne => d'ou un "numéro" commun pour les reconnaitre
    et une fois que toutes ces macro variables sont créées je les mets dans une table => pour obtenir une ligne = 1 macro variable

    mais dans le pgm que j'ai fait je n'ai pas réussi à changer à chaque fois le nom de la macro var, je les récupère donc puis les écrase au fur et à mesure

    il faudrait lancer le pgm pour vous permettre de mieux voir ce que j'ai in fine car je ne sais pas si j'ai été claire...

Discussions similaires

  1. Problème appel autre macro avec Call
    Par Novice72 dans le forum Macros et VBA Excel
    Réponses: 23
    Dernier message: 30/06/2015, 07h15
  2. Macro programme avec call symput
    Par joan_27 dans le forum Macro
    Réponses: 2
    Dernier message: 22/10/2013, 22h27
  3. Stockage pas dynamique avec call symput
    Par enicnath dans le forum SAS Base
    Réponses: 1
    Dernier message: 18/10/2012, 16h39
  4. [Macro] la macro call symput
    Par r_dani dans le forum Macro
    Réponses: 2
    Dernier message: 17/10/2008, 15h03
  5. Réponses: 4
    Dernier message: 10/07/2008, 15h51

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