2012-11-27 12 views
0

Salut J'ai un programme pour utiliser une macro pour en appeler une autre. J'ai deux mois (jun12 et jul12) et chaque mois a deux parties (1 & 2), je veux faire une boucle que je construis une macro appelée "Loop", A l'intérieur, j'ai construit un tableau, et utilisé Comment faire appel à une macro "essayer".sas macro appel macro

On dirait que cela ne fonctionne pas. Quelqu'un peut-il m'aider avec? Je vous remercie!

LIBNAME EC100006 "G:\sample"; 
%MACRO try(month=,part=); 
     ...FROM EC100006.monthitsum&month.lag&part AS t1 
%MEND try; 

%Macro test; 
    ARRAY Mon(2) jun12 jul12; 
    %Do i=1 %to 2; 
     %Do j=1 %to 2 
      %try(month=Mon(i),part=j) 
     %End 
    %End 
%Mend test; 

%test 
+0

Vous avez 'ARRAY' ici, mais pas ensemble de données associé? Essayez-vous de récupérer des valeurs (jun12 jul12) à partir d'autres ensembles de données? C'est aussi '% try (mois = Mon (& i), partie = & j)' comme vous faites référence aux variables macro. –

Répondre

0

Vous ne pouvez pas avoir un tableau de variables macro. La manière la plus simple d'appeler plusieurs fois une macro avec une liste de paramètres consiste à créer un jeu de données avec ces paramètres et à l'appeler depuis l'ensemble de données, soit avec CALL EXECUTE, soit avec PROC SQL pour créer une liste de macro.

data call; 
input month $ part; 
datalines; 
jun12 1 
jul12 2 
;;;; 
run; 

proc sql; 
select cats('%try(month=',month,',part=',part,')') into :mcalllist 
    separated by ' ' 
    from call; 
quit; 

&mcalllist; 

Cela ne fonctionne que si vous avez moins de 20.000 caractères d'une valeur d'appels ou si - si elle est plus que vous avez besoin d'essayer une autre option (% include fichier ou appelez exécuter).

+0

Merci! J'ai utilisé votre code avec ma macro essayer, il semble qu'il ne peut pas lire le fichier d'entrée. L'erreur de log est comme ceci NOTE: Ligne générée par la variable de macro "PART". 1 EC100002 .._ al_1_part_1_lag - ERREUR 22-322: Attendre un nom. ERREUR 200-322: Le symbole n'est pas reconnu et sera ignoré. – user1652926

+0

Outre la correction de l'instruction d'entrée dans mon exemple de jeu de données pour inclure un mois après le mois, l'exemple de code fonctionne comme prévu. L'erreur que vous avez postée suggère souvent que votre code manque d'autre chose, car cela signifie qu'il tape le code d'étape de données ou autre chose en dehors d'un datastep - peut-être devez-vous placer l'appel de & mcalllist dans un PROC ou une étape de données? – Joe

+0

Merci! Le programme fonctionne maintenant! – user1652926

0

Donc maintenant il y a quelque chose comme ça

LIBNAME EC100006 "G:\sample"; 
%MACRO try(month=,part=); 
    ...FROM EC100006.monthitsum&month.lag&part AS t1 
%MEND try; 

Data Array 
ARRAY Mon{2} jun12 jul12; 
RUN; 
%Macro test; 
    %Do i=1 %to 2; 
    %Do j=1 %to 2 
     %try(month=Mon(i),part=j) 
    %End 
%End 
%Mend test; 

%test