【问题标题】:Prompt: Date, %Sysfunc(year(&myvar.));提示:日期,%Sysfunc(year(&myvar.));
【发布时间】:2018-10-19 17:08:31
【问题描述】:

我有一个每月生成报告的 SAS EG 7.1 程序。旧流程非常手动,除其他事项外,用户被要求使用当前月末(Date9.)更新宏变量(&date.)。

    %let Date = '28feb2018'd; /* <--- Input the date to be reported  */

    /* Generate the year and the month based on the input date */
    %let year = %sysfunc(year(&date.)); 
    %let month = %sysfunc(month(&date.));

&year(4 位数字)和 &month。 (1 位或 2 位,取决于月份)稍后在代码中用作文件名的组成部分,以获取当前月份的表格:

    FROM lib.great_table_loc_&year._&month.;

我试图通过提示用户选择当前月末日期来使程序动态化。 提示正在运行,并输出 date9。格式。

然后我尝试使用宏变量 &Prompt_date。在 %sysfunc 中:

    %let Date = '&prompt_date.'; 
    %let year = %sysfunc(year(&prompt_date.)); 
    %let month = %sysfunc(month(&prompt_date.));

当我执行时,我收到以下错误消息:

1)

    35         %let year = %sysfunc(year(&prompt_date.));
    ERROR: Argument 1 to function YEAR referenced by the %SYSFUNC or 
    %QSYSFUNC macro function is not a number.
    ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC 
    argument list.  Execution of %SYSCALL statement or %SYSFUNC 
           or %QSYSFUNC function reference is terminated.
    36         %let month = %sysfunc(month(&prompt_date.));
    ERROR: Argument 1 to function MONTH referenced by the %SYSFUNC or 
    %QSYSFUNC macro function is not a number.
    ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC 
    argument list.  Execution of %SYSCALL statement or %SYSFUNC 
           or %QSYSFUNC function reference is terminated. 

2)

    118         lib.great_table_loc_._.
                                    _
                                    22
                                    200
    ERROR 22-322: Syntax error, expecting one of the following: a name, ;, 
    (, ',', ANSIMISS, AS, CROSS, EXCEPT, FULL, GROUP, HAVING, 
          INNER, INTERSECT, JOIN, LEFT, NATURAL, NOMISS, ORDER, OUTER, 
    RIGHT, UNION, WHERE.  

    ERROR 200-322: The symbol is not recognized and will be ignored.

我尝试为月份和年份创建一个单独的字段,格式为 YYMMN6。,输入 &prompt_date。然后 put(,n.) 使值变为数字 - 仍然没有。

有没有人遇到过类似的问题? 关于如何获得我想要的任何提示?

谢谢!

【问题讨论】:

  • 创建提示时,您选择了什么提示类型?您可能选择了日期、日期范围或时间戳。您选择了哪种填充方法?
  • PROMPT_DATE 实际上有什么价值?将 %put &amp;prompt_date. ; 添加到您的程序中,让 SAS 将其写入日志。
  • 嗨!它输出: 26 %put &prompt_date.; 31Mar2018 与之前的手动输入格式相同(即 28feb2018)。提示值为日期,提示指定必须输入的值。他们从提示符处的“日历”弹出窗口中进行选择。
  • 所以它不是一个有效的日期值。但可以通过添加引号和尾随字母 d 将其转换为日期文字(如硬编码示例中)。 "&amp;prompt_date"d

标签: date variables macros sas prompt


【解决方案1】:

你有:

%let Date = '&prompt_date.'; 
%let year = %sysfunc(year(&prompt_date.)); 
%let month = %sysfunc(month(&prompt_date.));

两个问题。

  1. 您指定 &Date 但不使用它。
  2. 提示日期为 DDMONYYYY (date9.)。 SAS 会将其视为字符串。您需要引号和 d 才能确定日期。

试试

%let year = %sysfunc(year("&prompt_date."d)); 
%let month = %sysfunc(month("&prompt_date."d));

【讨论】:

  • 现在运行,似乎工作正常!会告诉你的,谢谢!
  • 您好!有效!谢谢! RE:日期,它用作报表表中字段(数据日期)的输入。再次感谢您!
  • 太棒了!如果解决了你的问题,请采纳。
  • 完成了,先生! :)
  • 如果您希望月份在 Jan 到 Sep 之间具有前导零,则使用 Z 格式生成宏变量。 %let month = %sysfunc(month("&amp;prompt_date."d),Z2);
猜你喜欢
  • 1970-01-01
  • 2022-11-11
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
  • 2021-01-15
  • 1970-01-01
相关资源
最近更新 更多