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 :

Ordre d'exécution: macro, data step, call execute


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 Ordre d'exécution: macro, data step, call execute
    Bonjour,

    Je fais suite à mon message d'hier. Je me demande si les erreurs que j'aie proviennent de l'ordre d'execution de mon code. Dans l'algorithme suivant, pourriez vous me dire l'ordre d'exécution ?

    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
    %macro MaMacro1(p1,p2,p3);
    	data step 1
    	proc transpose
    	data step 2 (avec un call symput)
    	%MaMacro2
    	proc sql
    	data step 3 (avec data _NULL_ dans lequel il y a un call execute qui lance MaMacro3 puis un call execute qui lance une proc report)
    %mend;
     
    data MaTable; 
    	set MaTable;
    	array MonArray {*} S1-S2;
    	do i=1 to dim(MonArray);
    		call execute('%MaMacro1('||MonArray[i]||',J0,J1)');
    		call execute('%MaMacro1('||MonArray[i]||',J2,J3)');
    	end;
    run;

    J'ai tenté de découper le code et de mettre des put dans tous les sens => j'ai l'impression en regardant le log (que j'ai du mal à comprendre...) que mes problèmes viennent peut etre de l'ordre.

    Merci de votre aide.

  2. #2
    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
    Bonjour debdev,

    ordre d'execution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    DATA MaTable
          Appel %MaMacro1
                DATA step 1
                Proc Transpose
                DATA step 2
                Appel %MaMacro2
                Proc SQL
                DATA step 3
                      Appel %MaMacro3
                      Proc Report
     
          Appel %MaMacro1
                idem que ci dessus
    Je pense que la difficulté vient plus de l'algorithme et de ce que tu souhaite faire ...

    La Proc Transpose concerne les variables S1 et S2 ?
    Si c'est le cas, dans ton ARRAY faire référence au NOM de la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Call Execute('%MaMacro1('||vname(MonArray[i])||',J0,J1)'); /* VNAME retourne le nom de la variable */
    Ce que je te conseil : Ecrit d'abord ton code en langage SAS BASE vérifie que ça marche et que tu obtiens bien ce que tu veux. Ensuite optimise avec des macros et des call execute (si nécessaire)

    Bon courage,

    Steel

  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
    Salut!

    Merci pour ta réponse.

    L'ordre que tu as décrit est bien celui que j'imaginais.

    Je viens de comprendre pourquoi sas faisait des trucs bizarres: j'ai utilisé 2 fois le compteur i mais pas pour la meme chose...

    Après déjeuner, je teste ton code pour les arrays.

  4. #4
    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 Macro - Call Symput - Array
    alors ... ben j'ai toujours des problèmes . je détaille un peu plus mon code.

    Voici une partie de la macro. Suivent en dessous, 2 morceaux de code qui lancent cette macro.
    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
    %macro Evol(Sy,StartV,EndV);
     
    	data pe_&Sy._&StartV&EndV;
    		set pe (keep= sid vit &Sy);
    		where vit="&StartV" or vit="&EndV";
    	run;
     
    	proc sort data=pe_&Sy._&StartV&EndV;
    		by sid;
    	run;
     
    	proc transpose data=pe_&Sy._&StartV&EndV out=pe_&Sy._&StartV&EndV._transp;
    		var &Sy;
    		id vis;
    		by sid;
    	run;
     
    	data pe_&Sy._&StartV&EndV._transp;
    		set pe_&Sy._&StartV&EndV._transp;
    		call symput("Sylabel",trim(_LABEL_));
    	run;
     
    	%put Sy &Sy;		/* fonctionne */
    	%put Sylabel &Sylabel;	/* ne fonctionne pas, affiche toujours le même dans une même exécution mais ça change selon les exécutions ... */
     
    %mend;


    Code 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data pe; 
    	set pe;
    	if _N_=1;
    	array PeSy {*} S1 - S15;
    	do icount=1 to dim(PeSy);
    		call execute('%Evol('||vname(PeSy[icount])||',J0,J1)');
    	end;
    run;



    Code 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    data tmp;
       input (V1 - V15) ($) ;
       datalines;
    S1 S2 S3 S4 S5 S6 S7 S8 S9 S10 S11 S12 S13 S14 S15
    ;
     
    data tmp; 
    	set tmp;
    	array PeSys {*} S1-S15;
    	do icount=1 to dim(PeSy);
    		call execute('%Evol('||PeSy[icount]||',J0,J1)');
    	end;
    run;

    Dans les 2 cas, les %put de la macro n'affichent pas ce qu'il faut: &Sylabel devrait avoir 15 labels différents. Il n'en a qu'un seul. Si je relance le code, &Sylabel n'aura toujours qu'un seul label et pas forcément le meme qu'à l'exécution précédente.

    J'ai une autre méthode pour obtenir ce que je veux en passant par des macrovariables et non un Array. Cette autre méthode fonctionne bien et utilise le même call symput donc je ne comprends pas pourquoi là, ça ne fonctionne pas. Même si l'autre méthode fonctionne, j'aimerai réussir avec les Array.

    Voilà. J'espère etre assez claire. Je n'ai d'ailleurs pas mis tout le code pour plus de lisibilité.

    Merci

  5. #5
    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 debdev Voir le message
    &Sylabel devrait avoir 15 labels différents.
    le problème vient de là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DATA pe_&Sy._&StartV&EndV._transp;
    	SET pe_&Sy._&StartV&EndV._transp;
    	call symput("Sylabel",trim(_LABEL_));
    run;
    la valeur de &sylabel est à chaque fois écrasé ! au final tu n'a qu'une seul valeur : le dernier _LABEL_ de ta table en entrée.

    Si tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DATA pe_&Sy._&StartV&EndV._transp;
    	SET pe_&Sy._&StartV&EndV._transp;
    	call symput(compress("Sylabel"||_N_),trim(_LABEL_));
    run;
    Tu créé les macro variables :
    sylabel1
    sylabel2
    etc..
    Tu va ainsi récupérer toutes les valeurs de _LABEL_

    Steel

  6. #6
    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
    Non, ça ne marche pas.
    Si je mets:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    DATA pe_&Sy._&StartV&EndV._transp;
    	SET pe_&Sy._&StartV&EndV._transp;
    	call symput(compress("Sylabel"||_N_),trim(_LABEL_));
    run;
     
    %put Sylabel1 &Sylabel1;
    %put Sylabel2 &Sylabel2;
    ça me donne dans le log:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sylabel1 OtherLabel /* pas le bon */
    WARNING: Apparent symbolic reference Sylabel2 not resolved.
    Sylabel2 &Sylabel2
    Suite à ma transposition, toutes mes observations ont le meme _LABEL_, c'est pour ça que même si j'écrase &Sylabel dans l'étape data, je mets toujours le meme. Il doit correspondre à la table. Or, ce n'est pas le cas. Quand j'en suis au 2ème tour de boucle du %do, ça me crée bien une 2ème table (1er data step de la macro) et ça me transpose bien la 2ème table. Donc le call symput ne devrait plus s'appliquer à la première table. et pourtant, il le fait, et c'est ça que je ne comprends pas

    Si t'as une idée sinon, je compte sur le week end prolongé pour me reposer et trouver la solution mercredi prochain

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, 14h45
  2. CALL EXECUTE dans étape DATA
    Par ibrahima13 dans le forum Macro
    Réponses: 3
    Dernier message: 25/10/2012, 08h45
  3. Macrovariable & Call execute - ordre d'execution
    Par debdev dans le forum Macro
    Réponses: 18
    Dernier message: 19/01/2011, 08h24
  4. Call Execute: macro dans data step avec boucle
    Par debdev dans le forum Macro
    Réponses: 2
    Dernier message: 24/09/2010, 11h28
  5. Réponses: 2
    Dernier message: 21/01/2010, 18h02

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