0

我要做的是制作一个简单的 SAS EG 流程,它要求用户提供两个参数 - 日期和标识符。两者都是可选的。

问题是,如果用户没有填写其中之一,则以下行:

table.insert_date = "&my_date."d 

返回

ERROR: Invalid date/time/datetime constant ""d

我已经处理了一些可以在项目中的所有代码之前插入的代码(工具 -> 选项 -> 自定义代码 -> 在任务和查询代码之前插入自定义 SAS 代码)。我已经尝试过了,但它不起作用。

data _null_;
   if not(%symexist(my_date)) 
   then %let my_date='01jan01'd;
run;

你知道如何处理这个问题吗?

4

2 回答 2

2

问题是您试图将宏代码用作开放代码的一部分。这不是 SAS 中宏的工作方式——它们在任何开放代码之前执行,通常用于生成后者。

在您的情况下,您实际上不需要生成任何开放代码,但无论如何您需要将宏语句包装到 %MACRO-block 中,然后作为一个整体执行它来调用这个宏:

%macro mymacro;
    %if not (%symexist(my_date)) %then %let my_date='01jan01'd;
%mend mymacro;

%mymacro
于 2014-06-03T14:23:19.373 回答
0

德米特里,谢谢你的回答。它仍然无法按照我想要的方式工作......现在我知道为什么了。

我发现(我相信如果有人更擅长 SAS,他会比我更好地解释它)当提示框出现时会创建提示变量。所以,问题是它们是空的,并且出现了上面显示的问题。

以下是我想要的答案。

data _null_;
 tmp = symget("my_date");  /* Need to assign my_date value to temp variable. */

 if tmp eq '' then /* because my_date eq '' doesn't work */
      do;
            call symput("my_date", '01jan01' ); /* assigning target variable */
      end;
      else call symput ("my_date", '01jan14'); /* assigning other value */
run;
于 2014-06-04T06:04:33.137 回答