GLOBAL尝试存在于本地环境中的名称宏变量

时间:2018-03-27 14:22:35

标签: macros sas

大家早上好。 我正在尝试运行以下代码:

%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宏删除宏变量时出现错误消息?

要求帮助我

3 个答案:

答案 0 :(得分:2)

在创建宏变量时,无论是本地变量还是全局变量,都要明确,将所有Symput()替换为Symputx()

本地示例:

call symputx('Estrato',ESTRATO,'L');

Global的例子:

call symputx('Estrato',ESTRATO,'G');

SymputX Documentation

答案 1 :(得分:0)

尝试将%SYSMSTORECLEAR;添加到代码的开头。这将在导致错误的情况下关闭存储的已编译宏目录。

答案 2 :(得分:0)

如果您指定的宏变量尚不存在,

call symput()将创建一个新的宏变量。如果你没有告诉SAS在哪里创建宏变量(需要使用call symputx()而不是call symput()),那么它将在当前宏的范围内创建新的宏变量。如果您稍后尝试使用%global语句创建具有相同名称的全局宏变量,则会收到该错误消息。

在尝试为其赋值之前,您可以将宏变量定义为全局变量。

%global TipoDocumento ;

请注意,如果您切换到使用call symputx(),您可以告诉SAS在全局符号表中创建宏变量。

call symputx('TipoDocumento',Tipo_Id,'g');