<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic SAS Macro Operator Not Found in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759347#M239964</link>
    <description>&lt;P&gt;Hi All,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is my code, I want to make sure that when its a leap year, I add one to the month of February.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%MACRO LEAPYEAR;
%IF MOD(&amp;amp;Year,4) = 0 AND ((MOD(&amp;amp;Year,100) ne 0) OR (MOD(&amp;amp;Year,400) = 0)) %THEN %DO;
%IF SUBSTR(&amp;amp;Inc_End, 5, 4) = '0228' %THEN &amp;amp;Inc_End = %EVAL(&amp;amp;Inc_End + 1);
%IF SUBSTR(&amp;amp;Paid_End, 5, 4) = '0228' %THEN &amp;amp;Paid_End = %EVAL(&amp;amp;Paid_End + 1);
%END;
%MEND LEAPYEAR;
%LEAPYEAR&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;But I keep getting this error in the log:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;25         GOPTIONS ACCESSIBLE;
26         %MACRO LEAPYEAR;
27         %IF MOD(&amp;amp;Year,4) = 0 AND (MOD(&amp;amp;Year,100) ne 0 OR MOD(&amp;amp;Year,400) = 0) %THEN %DO;
28         	%IF SUBSTR(&amp;amp;Inc_End, 5, 4) = '0228' %THEN &amp;amp;Inc_End = %EVAL(&amp;amp;Inc_End + 1);
29         	%IF SUBSTR(&amp;amp;Paid_End, 5, 4) = '0228' %THEN &amp;amp;Paid_End = %EVAL(&amp;amp;Paid_End + 1);
30         %END;
31         %MEND LEAPYEAR;
32         %LEAPYEAR
SYMBOLGEN:  Macro variable YEAR resolves to 2021
ERROR: Required operator not found in expression: MOD(&amp;amp;Year,4) = 0 AND (MOD(&amp;amp;Year,100) ne 0 OR MOD(&amp;amp;Year,400) = 0) 
SYMBOLGEN:  Macro variable YEAR resolves to 2021
SYMBOLGEN:  Macro variable YEAR resolves to 2021
ERROR: The macro LEAPYEAR will stop executing.&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Any idea why? I thought my If And statement looks okay but I must be doing something wrong!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks in advance!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Wed, 04 Aug 2021 14:29:37 GMT</pubDate>
    <dc:creator>mhoward2</dc:creator>
    <dc:date>2021-08-04T14:29:37Z</dc:date>
    <item>
      <title>SAS Macro Operator Not Found</title>
      <link>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759347#M239964</link>
      <description>&lt;P&gt;Hi All,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here is my code, I want to make sure that when its a leap year, I add one to the month of February.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%MACRO LEAPYEAR;
%IF MOD(&amp;amp;Year,4) = 0 AND ((MOD(&amp;amp;Year,100) ne 0) OR (MOD(&amp;amp;Year,400) = 0)) %THEN %DO;
%IF SUBSTR(&amp;amp;Inc_End, 5, 4) = '0228' %THEN &amp;amp;Inc_End = %EVAL(&amp;amp;Inc_End + 1);
%IF SUBSTR(&amp;amp;Paid_End, 5, 4) = '0228' %THEN &amp;amp;Paid_End = %EVAL(&amp;amp;Paid_End + 1);
%END;
%MEND LEAPYEAR;
%LEAPYEAR&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;But I keep getting this error in the log:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;25         GOPTIONS ACCESSIBLE;
26         %MACRO LEAPYEAR;
27         %IF MOD(&amp;amp;Year,4) = 0 AND (MOD(&amp;amp;Year,100) ne 0 OR MOD(&amp;amp;Year,400) = 0) %THEN %DO;
28         	%IF SUBSTR(&amp;amp;Inc_End, 5, 4) = '0228' %THEN &amp;amp;Inc_End = %EVAL(&amp;amp;Inc_End + 1);
29         	%IF SUBSTR(&amp;amp;Paid_End, 5, 4) = '0228' %THEN &amp;amp;Paid_End = %EVAL(&amp;amp;Paid_End + 1);
30         %END;
31         %MEND LEAPYEAR;
32         %LEAPYEAR
SYMBOLGEN:  Macro variable YEAR resolves to 2021
ERROR: Required operator not found in expression: MOD(&amp;amp;Year,4) = 0 AND (MOD(&amp;amp;Year,100) ne 0 OR MOD(&amp;amp;Year,400) = 0) 
SYMBOLGEN:  Macro variable YEAR resolves to 2021
SYMBOLGEN:  Macro variable YEAR resolves to 2021
ERROR: The macro LEAPYEAR will stop executing.&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Any idea why? I thought my If And statement looks okay but I must be doing something wrong!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks in advance!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 04 Aug 2021 14:29:37 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759347#M239964</guid>
      <dc:creator>mhoward2</dc:creator>
      <dc:date>2021-08-04T14:29:37Z</dc:date>
    </item>
    <item>
      <title>Re: SAS Macro Operator Not Found</title>
      <link>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759356#M239970</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%IF %sysfunc(MOD(&amp;amp;Year,4)) = 0 AND (%sysfunc(MOD(&amp;amp;Year,100)) ne 0 OR %sysfunc(MOD(&amp;amp;Year,400)) = 0) %THEN %DO&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;You can't use data step functions in an %IF statement. You must enclose them in %SYSFUNC.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Of course, there is a simpler way&lt;/P&gt;
&lt;P&gt;&lt;A href="https://blogs.sas.com/content/sasdummy/2016/02/19/calculate-leap-year-in-sas/" target="_blank"&gt;https://blogs.sas.com/content/sasdummy/2016/02/19/calculate-leap-year-in-sas/&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;which you could have found using a simple internet search for&amp;nbsp;&lt;/P&gt;
&lt;P&gt;leap year SAS&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 04 Aug 2021 14:42:20 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759356#M239970</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2021-08-04T14:42:20Z</dc:date>
    </item>
    <item>
      <title>Re: SAS Macro Operator Not Found</title>
      <link>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759359#M239972</link>
      <description>Thank you very much! I greatly appreciate you stopping to help!</description>
      <pubDate>Wed, 04 Aug 2021 14:55:32 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759359#M239972</guid>
      <dc:creator>mhoward2</dc:creator>
      <dc:date>2021-08-04T14:55:32Z</dc:date>
    </item>
    <item>
      <title>Re: SAS Macro Operator Not Found</title>
      <link>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759369#M239974</link>
      <description>&lt;P&gt;So the MDY() trick in the linked blog post does not work well in macro code.&amp;nbsp; It generates error messages when the date is invalid.&lt;/P&gt;
&lt;PRE&gt;2116  %let year=2100;
2117  %if %sysfunc(mdy(2,29,&amp;amp;year)) %then %do;
WARNING: An argument to the function MDY referenced by the %SYSFUNC or %QSYSFUNC macro function is out of range.
NOTE: Mathematical operations could not be performed during %SYSFUNC function execution. The result of the operations have been set
      to a missing value.
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was:
       .
ERROR: Skipping to next %END statement.
2118    %put &amp;amp;=year is leap year ;
2119  %end;
&lt;/PRE&gt;
&lt;P&gt;You could instead use INTNX() to find the last day in February for that year and then check if it is 29 or not.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let year=2100;
%if 29=%sysfunc(intnx(month,"01FEB&amp;amp;year"d,0,e),day.) %then %do;
  %put &amp;amp;=year is leap year ;
%end;
%else %do;
  %put &amp;amp;=year is not leap year;
%end;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Or just use the DAY() function on the day before March first.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%let year=2000;
%if 29=%sysfunc(day("01MAR&amp;amp;year"d-1)) %then %do;
  %put &amp;amp;=year is leap year ;
%end;
%else %do;
  %put &amp;amp;=year is not leap year;
%end;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Wed, 04 Aug 2021 15:32:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759369#M239974</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2021-08-04T15:32:36Z</dc:date>
    </item>
    <item>
      <title>Re: SAS Macro Operator Not Found</title>
      <link>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759386#M239984</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/159"&gt;@Tom&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;So the MDY() trick in the linked blog post does not work well in macro code.&amp;nbsp; It generates error messages when the date is invalid.&lt;CODE class=" language-sas"&gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;But in my opinion, I don't really see a need for doing this in macro code.&lt;/P&gt;</description>
      <pubDate>Wed, 04 Aug 2021 16:37:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759386#M239984</guid>
      <dc:creator>PaigeMiller</dc:creator>
      <dc:date>2021-08-04T16:37:36Z</dc:date>
    </item>
    <item>
      <title>Re: SAS Macro Operator Not Found</title>
      <link>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759414#M239996</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/10892"&gt;@PaigeMiller&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/159"&gt;@Tom&lt;/a&gt;&amp;nbsp;wrote:&lt;BR /&gt;
&lt;P&gt;So the MDY() trick in the linked blog post does not work well in macro code.&amp;nbsp; It generates error messages when the date is invalid.&lt;CODE class=" language-sas"&gt;&lt;/CODE&gt;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;But in my opinion, I don't really see a need for doing this in macro code.&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I agree, but also the data step code from the blog creates &amp;gt;100 lines of ugly notes (about "invalid arguments" and other issues) in the log, which is not ideal. I was really surprised to see that none of the fairly obvious clean alternatives like&amp;nbsp;(using&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/159"&gt;@Tom&lt;/a&gt;'s suggestion)&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data leap_years;
do year=2000 to 2200;
  if day(mdy(3,1,year)-1)=29 then output;
end;
run;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;was proposed in the blog post (or its comments section).&lt;/P&gt;</description>
      <pubDate>Wed, 04 Aug 2021 17:35:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/SAS-Macro-Operator-Not-Found/m-p/759414#M239996</guid>
      <dc:creator>FreelanceReinh</dc:creator>
      <dc:date>2021-08-04T17:35:59Z</dc:date>
    </item>
  </channel>
</rss>

