【问题标题】:SAS Enterprise guide and conditional Macro ValuesSAS Enterprise 指南和条件宏值
【发布时间】:2015-04-09 10:31:22
【问题描述】:

我有一个简单的宏来检查数据集 (DATA01) 是否存在:

%GLOBAL base_exists;
%MACRO does_base_exist();
  %IF %SYSFUNC(exist(DATA_01)) %THEN
    %LET base_exists= 1;
  %ELSE %LET base_exists= 0;

%MEND;

%does_base_exist();

%PUT Base exist check is &base_exists 

上面的代码在我的主进程之前执行的程序中表示。输出消息如下:

"Base exist check is 1"

我对我的主进程设置了一个配置,即仅在 &base_exists 等于 1 时运行(它是)。出于某种原因,我的主要进程一直未能说明 &base_exists 不存在。

关于我做错了什么有什么想法吗?我是 EG 的新手,更习惯于在 BASE SAS 工作。

更新: 为了清楚起见,我在我的错误 &base_exists 后面添加了一个“s”。

【问题讨论】:

  • 你在“base_exist's”中缺少“s”吗?
  • '未能声明 &base_exist 不存在' -- 宏是 &base_exists -- 以 S 结尾。确保您的名称正确。
  • 只是您的帖子在 %Put 语句后缺少分号吗?还是在你的代码中也是如此?
  • 您能张贴条件对话框的屏幕打印吗?

标签: sas sas-macro enterprise-guide


【解决方案1】:

如果您愿意,还可以进一步简化。甚至不需要宏。您所需要的只是开放代码中的这一行:

%let base_exists = %sysfunc(exist(DATA_01));

该函数将返回一个值或01,因此甚至不需要if 语句。因为您不需要宏,所以也不需要%global 语句,因为在开放代码中定义的任何宏都将自动成为全局的。

【讨论】:

  • 这是一个让我的代码保持简洁的绝佳解决方案!谢谢@罗伯特
  • 很高兴它有帮助。您可能会发现另一件有用的事情是知道当您稍后检查此值时,您可以简单地这样做:if &base_exists then do; *some code; end;。无需在if 语句中显式检查该值是否等于1。这是因为零值等于假,任何非零值(正或负)都将等于真。这适用于很多编程环境。这意味着如果您使用命名良好的变量,您可以保持代码自记录。
【解决方案2】:

经过多次尝试,我设法修复了它。更有经验的 EG 用户可能会认为这很琐碎,但我还是会为我这样的初学者发布它。

我将宏定义作为 AutoExec 的一部分。我将它移到我的流程中并将其连接到使用宏作为条件变量的流程。它还需要设置为 %GLOBAL 才能在特定程序范围之外使用。

现在好像很开心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    相关资源
    最近更新 更多