%macro clearALL;
/*delete macro variables*/
data delete;
set sashelp.vmacro;
where scope eq: 'F' and name ne: 'SYS';
run;
data _null_;
set delete;
call symdel(name) ;
run;
%mend clearALL;
%Macro Test;
%do i = 1 %to 18;
%put &= Iteration : &i;
data _null_;
set work.input;
if _n_ eq &i then do;
call symput('TipoDocumento',Tipo_Id);
call symput('NroDocumento',Numero_Id);
call symput('Fecha_nacimiento',FechaNacimiento);
call symput('TipoEvaluacion',TipoEvaluacion);
call symput('ESP',ESP);
call symput('NIE',NIE);
call symput('NIE_Asociado',NIE_ASOCIADO);
call symput('Estrato',ESTRATO);
call symput('IdConsulta',IdConsulta);
call symput('TipoRespuesta',TIPO_RESPUESTA);
end;
run;
%include "D:/Data_SAS/Sguerrero/TestMomento1.sas";
%clearALL;
%end;
%Mend;
%Test;
数据测试包含将转换为宏变量的变量,以执行include语句中包含的脚本中的代码。此代码使用这些变量并创建全局变量和局部变量。 %clearALL宏消除了在上一次迭代中创建的宏变量。 但是我收到以下错误消息:
错误:%GLOBAL尝试在本地环境中存在名称(CAUSAL)。
为什么使用%clearALL宏删除宏变量时出现错误消息?
要求帮助我
答案 0 :(得分:2)
在创建宏变量时,无论是本地变量还是全局变量,都要明确,将所有Symput()
替换为Symputx()
。
本地示例:
call symputx('Estrato',ESTRATO,'L');
Global的例子:
call symputx('Estrato',ESTRATO,'G');
答案 1 :(得分:0)
尝试将%SYSMSTORECLEAR;
添加到代码的开头。这将在导致错误的情况下关闭存储的已编译宏目录。
答案 2 :(得分:0)
call symput()
将创建一个新的宏变量。如果你没有告诉SAS在哪里创建宏变量(需要使用call symputx()
而不是call symput()
),那么它将在当前宏的范围内创建新的宏变量。如果您稍后尝试使用%global
语句创建具有相同名称的全局宏变量,则会收到该错误消息。
在尝试为其赋值之前,您可以将宏变量定义为全局变量。
%global TipoDocumento ;
请注意,如果您切换到使用call symputx()
,您可以告诉SAS在全局符号表中创建宏变量。
call symputx('TipoDocumento',Tipo_Id,'g');