2 votes

Macro SAS dans macro

J'ai une question concernant %macro. Puis-je mettre %macro dans un autre %macro ?

Exemple court - "image" de la situation :

%macro Tier_1();

   %do Iter = 1 to &i;

       %macro Tier_2()

       proc sql noprint;
         select
         1*&Iter  into :var
       from work._PRODSAVAIL
       ;quit;

        %put &var;

       %mend;
       %Tier_2();
  %end;

%mend;
%Tier_1();

3voto

Joe Points 25165

La réponse à votre question est "oui, c'est possible". Mais c'est un mauvais style. Les mêmes résultats que ci-dessus se produiront si vous déplacez simplement la définition de la macro %Tier_2 à l'extérieur de la macro Tier_1, mais que vous laissez l'appel à l'intérieur de celle-ci.

%macro tier_1();

  ... 

  %Tier_2();
%mend tier_1();

%macro tier_2();
  ...
%mend tier_2;

%tier_1();

Comme vous le voyez ci-dessus, il n'est même pas nécessaire de les ordonner d'une manière particulière - tant que les deux sont compilés avant l'exécution de la macro, cela fonctionnera correctement.

La seule fois où il serait logique de placer une définition de macro à l'intérieur d'une autre définition de macro serait si la macro externe a modifié la macro interne d'une manière ou d'une autre et il était donc nécessaire de recompiler la macro interne chaque fois que la macro externe s'exécutait.

Bien qu'il s'agisse d'un cas d'utilisation théorique, je ne pense pas qu'il soit probable que vous le rencontriez dans la pratique ; il y a beaucoup d'autres façons de modifier les choses sans modifier le code macro lui-même, et en tant que tel, c'est considéré comme un mauvais style de programmation et devrait être évité. Vous ajoutez des frais généraux (minimes, mais certains) pour aucun avantage réel, et vous rendez le code plus difficile à comprendre.

2voto

Tom Points 20872

Les définitions ne sont PAS logiquement imbriquées. Il n'y a qu'un espace plat de noms de macros. Si vous définissez la même %submacro à l'intérieur de %macroA y %macroB il n'y en aura qu'un seul %submacro quelle que soit la définition la plus récente.

Vous pouvez imbriquer les APPELS de macro (appeler une macro en tant que partie d'une macro), mais l'imbrication du code source des définitions de macro n'est pas une bonne idée. Vous pouvez le faire, mais cela ne fera que vous embrouiller.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X