J'ai 2 macros ci-dessous que j'essaie d'exécuter 1 après l'autre comme une boucle en utilisant une table de métadonnées et la commande call execute dans une étape de données. Macro% TWO nécessite la variable globale & noms_agg. Cela est censé être créé dans la macro% ONE. Cependant, dans le code ci-dessous, & names_agg est vide la première fois que je l'exécute. Si je l'exécute à nouveau, il ne conservera que la valeur de la dernière fois qu'il est exécuté. L'idée est que chaque fois que% ONE est exécuté, un nouveau & noms_agg. est créé.Problème de variables macro lors de l'utilisation d'appel
Qu'est-ce que je fais mal?
Merci
%macro ONE(condition);
%global names_agg;
%let names_agg = ;
proc sql;
select
cats(name,"_agg"),
into
:names_agg separated by " ",
from dataset
where condition = "&condition."
;
quit;
%mend;
%macro TWO(name_OT);
data &name_OT.;
set &names_agg.;
run;
%mend;
data _null_;
length code $32767;
set meta_table;
code = "%ONE(" || cats(condition) || "); %TWO(" || cats(Name_OT) || ");";
call execute(code);
run;
Désolé sur le journal en désordre, c'est le code réel. Le problème est avec NAMES_AGG_A _B et _C ne résolvent correctement
871 data test;
872 length code $32767;
873 set c.new_name_OT (obs=1);
874 code = '%OT_Append(' || cats(portfolio) || ',' || cats(scorecard) || ',' ||
874! cats(event_table) || ',' ||
875 cats(scorecard_type) || ',' || cats(obs_period) || ',' || cats(outcome_period) ||
875! ',' || cats(x_var) ||
876 ',' || cats(y_var) || ',' || cats(use) || ',' || cats(condition) || '); %put
876! &names_agg_a.; %OT_Append2(' || cats(Name_OT) || ');';
877 call execute(code);
878 run;
MLOGIC(OT_APPEND): Beginning execution.
MLOGIC(OT_APPEND): Parameter PORTFOLIO has value MTG
MLOGIC(OT_APPEND): Parameter SCORECARD has value A
MLOGIC(OT_APPEND): Parameter EVENT_TABLE has value event_table_name
MLOGIC(OT_APPEND): Parameter SCORECARD_TYPE has value Application
MLOGIC(OT_APPEND): Parameter OBS_PERIOD has value 1
MLOGIC(OT_APPEND): Parameter OUTCOME_PERIOD has value 18
MLOGIC(OT_APPEND): Parameter X_VAR has value PI
MLOGIC(OT_APPEND): Parameter Y_VAR has value GB_Odds
MLOGIC(OT_APPEND): Parameter USE has value Development
MLOGIC(OT_APPEND): Parameter CONDITION has value
MLOGIC(OT_APPEND): %LET (variable name is NAMES_AGG_A)
MLOGIC(OT_APPEND): %LET (variable name is NAMES_AGG_B)
MLOGIC(OT_APPEND): %LET (variable name is NAMES_AGG_C)
MPRINT(OT_APPEND): proc sql;
SYMBOLGEN: Macro variable PORTFOLIO resolves to MTG
SYMBOLGEN: Macro variable SCORECARD resolves to A
SYMBOLGEN: Macro variable EVENT_TABLE resolves to event_table_name
SYMBOLGEN: Macro variable SCORECARD_TYPE resolves to Application
SYMBOLGEN: Macro variable OBS_PERIOD resolves to 1
SYMBOLGEN: Macro variable OUTCOME_PERIOD resolves to 18
SYMBOLGEN: Macro variable X_VAR resolves to PI
SYMBOLGEN: Macro variable Y_VAR resolves to GB_Odds
SYMBOLGEN: Macro variable USE resolves to Development
SYMBOLGEN: Macro variable CONDITION resolves to
MPRINT(OT_APPEND): select cats("c.",name,"_agg_a"), cats("c.",name,"_agg_b"),
cats("c.",name,"_agg_c") into :names_agg_a separated by " ", :names_agg_b separated by " ",
:names_agg_c separated by " " from c.datasets_pit where portfolio = "MTG" and scorecard = "A"
and event_table = "event_table_name" and scorecard_type = "Application" and obs_period = 1 and
outcome_period = 18 and x_var = "PI" and y_var = "GB_Odds" and use = "Development" and
condition = "" ;
MPRINT(OT_APPEND): quit;
MLOGIC(OT_APPEND): Ending execution.
SYMBOLGEN: Macro variable NAMES_AGG_A resolves to
Essentiellement, le problème est ici, la déclaration de vente ci-dessus dans l'appel execute montre que rien NAMES_AGG_A résout.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
MLOGIC(OT_APPEND2): Beginning execution.
MLOGIC(OT_APPEND2): Parameter NAME_OT2 has value MTG_Dev_OT_1
SYMBOLGEN: Macro variable NAME_OT2 resolves to MTG_Dev_OT_1
MPRINT(OT_APPEND2): data c.MTG_Dev_OT_1_ODDS;
SYMBOLGEN: Macro variable NAMES_AGG_A resolves to
MPRINT(OT_APPEND2): set ;
MPRINT(OT_APPEND2): run;
SYMBOLGEN: Macro variable NAME_OT2 resolves to MTG_Dev_OT_1
MPRINT(OT_APPEND2): data c.MTG_Dev_OT_1_GINI;
SYMBOLGEN: Macro variable NAMES_AGG_B resolves to
MPRINT(OT_APPEND2): set ;
MPRINT(OT_APPEND2): run;
SYMBOLGEN: Macro variable NAME_OT2 resolves to MTG_Dev_OT_1
MPRINT(OT_APPEND2): data c.MTG_Dev_OT_1_DIST;
SYMBOLGEN: Macro variable NAMES_AGG_C resolves to
MPRINT(OT_APPEND2): set ;
MPRINT(OT_APPEND2): run;
MLOGIC(OT_APPEND2): Ending execution.
NOTE: There were 1 observations read from the data set C.NEW_NAME_OT.
NOTE: The data set WORK.TEST has 1 observations and 12 variables.
NOTE: CALL EXECUTE generated line.
1 + proc sql;
1 + select cats("c.",name,"_agg_a"),
cats("c.",name,"_agg_b"), cats("c.",name,"_agg_c") into
:names_agg_a separated by " ", :names_agg_b separated by " ",
2 + :names_agg_c separated by " " from c.datasets_pit where portfolio =
"MTG" and scorecard = "A" and event_table = "event_table_name"
and scorecard_type = "Application" and
3 + obs_period = 1 and outcome_period = 18 and x_var = "PI"
and y_var = "GB_Odds" and use = "Development" and
condition = "" ; quit;; data c.MTG_Dev_OT_1_ODDS; set
NOTE: PROCEDURE SQL used (Total process time):
real time 0.01 seconds
cpu time 0.00 seconds
4 + ; run;
NOTE: There were 1 observations read from the data set WORK.TEST.
NOTE: The data set C.MTG_DEV_OT_1_ODDS has 1 observations and 12 variables.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
4 + data c.MTG_Dev_OT_1_GINI; set ; run;
NOTE: There were 1 observations read from the data set C.MTG_DEV_OT_1_ODDS.
NOTE: The data set C.MTG_DEV_OT_1_GINI has 1 observations and 12 variables.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
4 + data c.MTG_Dev_OT_1_DIST; set ; run;
NOTE: There were 1 observations read from the data set C.MTG_DEV_OT_1_GINI.
NOTE: The data set C.MTG_DEV_OT_1_DIST has 1 observations and 12 variables.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
Merci Chang! Je viens d'ajouter% nrstr à mon code et cela a résolu mon problème! – MarkG