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 :

Call Execute: macro dans data step avec boucle


Sujet :

Macro

  1. #1
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut Call Execute: macro dans data step avec boucle
    Bonjour,

    J’ai un souci avec le call execute.
    J’ai une table à 20 lignes et une colonne.
    J’ai stocké mes 20 valeurs dans des macro variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data table;
    	set table;
    	call symputx(cats("a",_n_), cod);
    run;
    Je souhaite exécuter ma macro (qui fonctionne) pour chacune de mes macrovariables, que je passe en paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    data _null_;
    	set table;
        	do i = 1 to nbcod;
    		call execute('%mamacro(tablein1,tablein2,grp,petit,&&a&i,&i)');
    	end;
    run;
    Questions :

    1. combien de fois call execute est elle lancée ?
    - nbcod fois correspondant à mon i ?
    - nbcod fois correspondant au nombre de ligne dans table ?
    - nbcod*nbcod fois car à chaque itération du data step (total=nbcod fois), call execute est lancée nbcod fois ?

    2.
    sans la boucle, sans le call execute : ma macro se lance comme il faut
    sans la boucle, avec le call execute : ma macro se lance comme il faut
    avec la boucle, avec le call execute : ma macro ne se lance pas comme il faut
    => je n’arrive pas à passer le paramètre i : si je mets &i, il n’est pas reconnu
    WARNING: Apparent symbolic reference I not resolved.
    ERROR: The text expression &I contains a recursive reference to the macro variable I. The macro variable will be assigned the null value.


    Auriez vous une idée ?

    Merci

  2. #2
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 372
    Points
    372
    Par défaut
    Salut,

    Un des intérêts du call execute est de fournir une alternative au code macro pour "produire" du code à la chaine.


    Voilà un exemple d'utilisation :

    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
     
     
     
    data TABLE2;
    input cod $;
    cards;
    cod1
    cod2
    cod3
    ;
    run;
     
    %macro mamacro2(data1, data2, _grp, _petit, _cod, _n) ;
    	%put data1=&data1. data2=&data2. _petit=&_petit. ;
     
    	data _null_;
    	cod="&_cod" ; n="&_n";
    	put cod= n=;
    	run;	
    %mend;
     
     
    DATA _null_;
    SET TABLE2;
    call execute('%mamacro2(tablein1, tablein2, grp, petit, '||cod||', '||_n_||' )');
    run;
    En fait call execute permet d'exécuter un programme contenu dans une "chaine de caractere".

    J'aurais pu écrire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    DATA _null_;
    SET TABLE2;
    length pgm $128;
    pgm=cats('%mamacro2(tablein1, tablein2, grp, petit, ', cod, ', ', _n_, ' )');
    call execute(pgm);
    run;
    Par ailleurs, fais bien la distinction entre variable sas et macro variable.

    Quand tu écris do i=1 to 5, une variable sas i va prendre successivement les valeurs 1,2,3,4,5. Ce n'est pas une macro variable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    data _null_;
     
    put "debut boucle";
    do i=1 to 5 ;
     u=i;/* et non &i */
     put u=; 
    end;
    put "fin boucle";
     
    run;

  3. #3
    Membre actif
    Inscrit en
    Janvier 2005
    Messages
    629
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 629
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    Un GRAND MERCI à toi saspgm
    Je n'aurai jamais trouvé sans toi. J'étais partie dans des call symput pour mémoriser les valeurs de ma variable, boucler sur le dataset...

    Et merci pour tes explications



    bonne journée

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

Discussions similaires

  1. Appel de macro dans proc data avec call execute
    Par Laurent04 dans le forum Macro
    Réponses: 4
    Dernier message: 18/02/2013, 13h45
  2. [XL-2003] VB Copier/Coller onglet dans nouveaux classeurs avec boucle
    Par Dbiche dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 05/01/2011, 12h36
  3. multiples array dans un, combiner avec boucle while
    Par leymiris dans le forum Langage
    Réponses: 2
    Dernier message: 27/07/2010, 16h19
  4. [AC-2010] Forme avec macro dans une forme avec bouttons de nav
    Par nico_fr83 dans le forum IHM
    Réponses: 0
    Dernier message: 15/05/2010, 20h48
  5. Réponses: 5
    Dernier message: 10/07/2009, 16h57

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