- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi
Using SAS 7.1. A beginner in SAS.
For the below solution, why do we need " %let month = %sysfunc(putn(&month,z2.));"? I understand that it is to convert the format to 2 length: 01, 02,...,12.
But why can't we do
"%do month = 01 %to 12;"
Thank you
%macro iterate;
%do year = 2010 %to 2015;
%do month = 1 %to 12;
/* assuming you want to zero fill the month */
%let month = %sysfunc(putn(&month,z2.));
%filecr(DE&YEAR.&MONTH.,&YEAR.,&MONTH.);
%end;
%end;
%mend;
%iterate
Accepted Solutions
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
The iterated %do loop only understands numeric values. So even if you attempt %do i = 01 %to 10 the processor only uses the numeric value 1 not the character value 01. So using the %sysfunc creates a character 01 from the numeric 1 for use in your macro.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
I'm allways surprised when people ask "can/can't you do this", when they clearly have the possibility to try it on their own.
111 %macro iterate;
112 %do year = 2010 %to 2015;
113 %do month = 01 %to 12;
114 /* assuming you want to zero fill the month */
115 %let month = %sysfunc(putn(&month,z2.));
116 %put %nrstr(%filecr)(DE&YEAR.&MONTH.,&YEAR.,&MONTH.);
117 %end;
118 %end;
119 %mend;
120
121 %iterate
%filecr(DE201001,2010,01)
%filecr(DE201002,2010,02)
%filecr(DE201003,2010,03)
%filecr(DE201004,2010,04)
%filecr(DE201005,2010,05)
%filecr(DE201006,2010,06)
%filecr(DE201007,2010,07)
%filecr(DE201008,2010,08)
%filecr(DE201009,2010,09)
%filecr(DE201010,2010,10)
%filecr(DE201011,2010,11)
%filecr(DE201012,2010,12)
%filecr(DE201101,2011,01)
%filecr(DE201102,2011,02)
%filecr(DE201103,2011,03)
%filecr(DE201104,2011,04)
%filecr(DE201105,2011,05)
%filecr(DE201106,2011,06)
%filecr(DE201107,2011,07)
%filecr(DE201108,2011,08)
%filecr(DE201109,2011,09)
%filecr(DE201110,2011,10)
%filecr(DE201111,2011,11)
%filecr(DE201112,2011,12)
%filecr(DE201201,2012,01)
%filecr(DE201202,2012,02)
%filecr(DE201203,2012,03)
%filecr(DE201204,2012,04)
%filecr(DE201205,2012,05)
%filecr(DE201206,2012,06)
%filecr(DE201207,2012,07)
%filecr(DE201208,2012,08)
%filecr(DE201209,2012,09)
%filecr(DE201210,2012,10)
%filecr(DE201211,2012,11)
%filecr(DE201212,2012,12)
%filecr(DE201301,2013,01)
%filecr(DE201302,2013,02)
%filecr(DE201303,2013,03)
%filecr(DE201304,2013,04)
%filecr(DE201305,2013,05)
%filecr(DE201306,2013,06)
%filecr(DE201307,2013,07)
%filecr(DE201308,2013,08)
%filecr(DE201309,2013,09)
%filecr(DE201310,2013,10)
%filecr(DE201311,2013,11)
%filecr(DE201312,2013,12)
%filecr(DE201401,2014,01)
%filecr(DE201402,2014,02)
%filecr(DE201403,2014,03)
%filecr(DE201404,2014,04)
%filecr(DE201405,2014,05)
%filecr(DE201406,2014,06)
%filecr(DE201407,2014,07)
%filecr(DE201408,2014,08)
%filecr(DE201409,2014,09)
%filecr(DE201410,2014,10)
%filecr(DE201411,2014,11)
%filecr(DE201412,2014,12)
%filecr(DE201501,2015,01)
%filecr(DE201502,2015,02)
%filecr(DE201503,2015,03)
%filecr(DE201504,2015,04)
%filecr(DE201505,2015,05)
%filecr(DE201506,2015,06)
%filecr(DE201507,2015,07)
%filecr(DE201508,2015,08)
%filecr(DE201509,2015,09)
%filecr(DE201510,2015,10)
%filecr(DE201511,2015,11)
%filecr(DE201512,2015,12)
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi LinusH,
Please be polite.
I am trying to ask why I have to put month
%let month = %sysfunc(putn(&month,z2.));
If you look at the year variable, we don't have to do that.
Thank you
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Answer is simple . You can not generate 01 02 ..... if you are using %do month = 01 %to 12;
%macro iterate;
%do year = 2010 %to 2015;
%do month = 01 %to 12;
%put &month ;
%end;
%end;
%mend;
%iterate
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
The iterated %do loop only understands numeric values. So even if you attempt %do i = 01 %to 10 the processor only uses the numeric value 1 not the character value 01. So using the %sysfunc creates a character 01 from the numeric 1 for use in your macro.
- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content
Hi ballardw,
Thank you for the reply. But I read https://support.sas.com/documentation/cdl/en/lefunctionsref/67960/HTML/default/viewer.htm#p12zqzvwx4...
that
PUTN Function
Enables you to specify a numeric format at run time.
Hence does it change a numeric variable to a character variable?
Thank you