04-06-2017 12:53 PM
I have a line like this
%LET YEARNOW= %unquote(%str(%'%sysfunc(year(today()), yyyy.)%'));
That throws an error like
ERROR: Required operator not found in expression: today() 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.
What I am trying to do it get the year from a function so I copied this working one
%LET DATENOW= %unquote(%str(%'%sysfunc(today(), yymmdd10.)%'));
And tried to Dr it up
04-06-2017 01:04 PM
You have two functions, Year() and today(). Each requires its own %SYSFUNC.
%let year = %sysfunc(today(), year4.);
%let year = %sysfunc(year(%sysfunc(today()));
04-06-2017 01:25 PM
I think you're overcomplicating this a bit. Try it this way:
%LET YEARNOW= %unquote(%str(%'%sysfunc(today(), year4)%'));
%SYSFUNC lets you control the format of the value it returns.
04-06-2017 01:43 PM
Every datastep function needs a separate %sysfunc.
%let yearnow = %sysfunc(year(%sysfunc(today()))); %put &yearnow;
%let datenow = %sysfunc(putn(%sysfunc(today()),yymmdd10.)); %put &datenow;
Or move to a data step as much data manipulation in macro language becomes very ugly and sometimes fragile.
I find that the need to have something like %unquote(%str is an indication that I may want to rethink things.
04-06-2017 01:48 PM
It's a question of what you want as the final result. You will get:
The added complications that I included will get:
If you want quotes around the final value, you need to jump through the extra hoops. But if you don't want the quotes, it becomes even simpler:
%let yearnow = %sysfunc(today(), year4);