dear SAS experts,
I have this:
* Jahr1 = aktuelles Jahr, Jahr2 = Vorjahr ;
%let Jahr1=%year(&Auswertungstag.);
%let Jahr2=%eval(&Jahr1.-1);
%put &Jahr1.;
%put &Jahr2.;
data ORB_Select_&Jahr2.;
set MUC_PROD.ORB_&Jahr2. (keep= ZSRID ANZAHL MONAT KW PLATTFORM MBRBEZ_BT MARKTREGION_BT
NLBEZ_BT MR_KOMPAKT_BT);
jahr=&Jahr2.;
run;
data ORB_Select_&Jahr1.;
set MUC_PROD.ORB_&Jahr1. (keep= ZSRID ANZAHL MONAT KW PLATTFORM MBRBEZ_BT MARKTREGION_BT
NLBEZ_BT MR_KOMPAKT_BT);
jahr=&Jahr1.;
run;
I get the following errors:
25 GOPTIONS ACCESSIBLE;
26 data ORB_Select_&Jahr2.;
27 set MUC_PROD.ORB_&Jahr2. (keep= ZSRID ANZAHL MONAT KW PLATTFORM MBRBEZ_BT MARKTREGION_BT
28 NLBEZ_BT MR_KOMPAKT_BT);
29 jahr=&Jahr2.;
30 run;
NOTE: There were 410737 observations read from the data set MUC_PROD.ORB_2020.
NOTE: The data set WORK.ORB_SELECT_2020 has 410737 observations and 10 variables.
NOTE: Compressing data set WORK.ORB_SELECT_2020 decreased size by 42.23 percent.
Compressed is 669 pages; un-compressed would require 1158 pages.
NOTE: DATA statement used (Total process time):
real time 1.74 seconds
cpu time 0.75 seconds
31 data ORB_Select_&Jahr1.;
NOTE: Line generated by the macro variable "JAHR1".
31 ORB_Select_2021
____
22
____
200
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, (, /, ;, _DATA_, _LAST_, _NULL_.
ERROR 200-322: The symbol is not recognized and will be ignored.
32 set MUC_PROD.ORB_&Jahr1. (keep= ZSRID ANZAHL MONAT KW PLATTFORM MBRBEZ_BT MARKTREGION_BT
NOTE: Line generated by the macro variable "JAHR1".
32 MUC_PROD.ORB_2021
____
22
____
2 The SAS System 09:12 Friday, February 26, 2021
200
ERROR 22-322: Syntax error, expecting one of the following: a name, a quoted string, (, -, :, ;, CUROBS, END, INDSNAME, KEY,
KEYRESET, KEYS, NOBS, OPEN, POINT, _DATA_, _LAST_, _NULL_.
ERROR 200-322: The symbol is not recognized and will be ignored.
33 NLBEZ_BT MR_KOMPAKT_BT);
ERROR: File MUC_PROD.ORB_.DATA does not exist.
ERROR: The metadata for the table/view MUC_PROD.ORB_ does not exist.
34 jahr=&Jahr1.;
35 run;
NOTE: Compression was disabled for data set WORK.ORB_SELECT_ because compression overhead would increase the size of the data set.
NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.ORB_SELECT_ may be incomplete. When this step was stopped there were 0 observations and 1 variables.
WARNING: Data set WORK.ORB_SELECT_ was not replaced because this step was stopped.
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds
I can't understand what's wrong, as the datastep text is exactly the same and works for the first one.
How can I correct this?
thx in advance
regards
PY
If the %YEAR macro does nothing else than the data step YEAR function, then I would (for reasons of maintainability) always use the data step function with %sysfunc.
The same holds true for every case where there already is a SAS function available.
And IF you absolutely want to shorten your typing, the %YEAR macro should be defined like this:
%let auswertungstag = %sysfunc(today());
%macro year(datum);
%sysfunc(year(&datum.));
%mend;
%let jahr1 = %year(&auswertungstag.);
data test&jahr1.;
set sashelp.class;
run;
No fancy processing, no quoting.
I assume %year is a predefined macro, unknown to me.
What is the result of next test code:
%let Jahr1=%year(&Auswertungstag.);
%put *&Jahr1*
are there blanks or special characters in the PUT result?
Hello @PierreYvesILY,
To me this looks like a macro quoting issue.
Change the definition of macro variable Jahr1 to
%let Jahr1=%unquote(%year(&Auswertungstag.));
%YEAR is not a standard SAS macro function, so it is of interest to see the code of that macro.
But why don't you use the SAS function (assuming AUSWERTUNGSTAG contains a SAS date value)?
%let auswertungstag=%sysfunc(today());
%let jahr1=%sysfunc(year(&auswertungstag.));
%put &=jahr1.;
data ORB_Select_&Jahr1.;
set sashelp.class;
run;
Log:
73 %let auswertungstag=%sysfunc(today());
74 %let jahr1=%sysfunc(year(&auswertungstag.));
75 %put &=jahr1.;
JAHR1=2021
76
77 data ORB_Select_&Jahr1.;
78 set sashelp.class;
79 run;
NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: The data set WORK.ORB_SELECT_2021 has 19 observations and 5 variables.
NOTE: Verwendet wurde: DATA statement - (Gesamtverarbeitungszeit):
real time 0.01 seconds
cpu time 0.01 seconds
I actually solved the problem writing this:
* Jahr1 = aktuelles Jahr, Jahr2 = Vorjahr ;
%let Jahr1=%eval(%year(&Auswertungstag.));
%let Jahr2=%eval(&Jahr1.-1);
%put &Jahr1.;
%put &Jahr2.;
I don't know if it's worse than the solutions you proposed.
If the %YEAR macro does nothing else than the data step YEAR function, then I would (for reasons of maintainability) always use the data step function with %sysfunc.
The same holds true for every case where there already is a SAS function available.
And IF you absolutely want to shorten your typing, the %YEAR macro should be defined like this:
%let auswertungstag = %sysfunc(today());
%macro year(datum);
%sysfunc(year(&datum.));
%mend;
%let jahr1 = %year(&auswertungstag.);
data test&jahr1.;
set sashelp.class;
run;
No fancy processing, no quoting.
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!
SAS' Charu Shankar shares her PROC SQL expertise by showing you how to master the WHERE clause using real winter weather data.
Find more tutorials on the SAS Users YouTube channel.