<?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 Re: Conditional Macros in SAS Procedures</title>
    <link>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138015#M37085</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;could you please show us the sample data in the rpt dataset. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Jagadish&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Mon, 11 Nov 2013 08:16:24 GMT</pubDate>
    <dc:creator>Jagadishkatam</dc:creator>
    <dc:date>2013-11-11T08:16:24Z</dc:date>
    <item>
      <title>Conditional Macros</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138014#M37084</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am getting an error when doing the below logic&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%MACRO LOOP ;&lt;/P&gt;&lt;P&gt;data cat;&lt;/P&gt;&lt;P&gt;set rpt;&lt;/P&gt;&lt;P&gt;if var = 'x' THEN CALL SYMPUT("var0",trim(name0)); else&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if var = 'y' THEN CALL SYMPUT("var1",trim(NAME1)); else&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if var = 'z' THEN CALL SYMPUT("var2",trim(NAME2)); else&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if var = 'l' THEN CALL SYMPUT("var3",trim(NAME3)); else&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if var = 'k' THEN CALL SYMPUT("var4",trim(NAME4));&lt;/P&gt;&lt;P&gt;RUN;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; %IF "&amp;amp;var0" NE "" %THEN %FTP_LOOP(&amp;amp;var0);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; %IF "&amp;amp;var1" NE "" %THEN %LOOP1(&amp;amp;var1);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; %IF "&amp;amp;var2" NE "" %THEN %LOOP1(&amp;amp;var2);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; %IF "&amp;amp;var3" NE "" %THEN %LOOP1(&amp;amp;var3);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt; %IF "&amp;amp;var4" NE "" %THEN %LOOP1(&amp;amp;var4);&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;&amp;nbsp;&amp;nbsp; &lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;TD&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;%mend loop;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%macro loop1;&lt;/P&gt;&lt;P&gt;''''&lt;/P&gt;&lt;P&gt;'''&lt;/P&gt;&lt;P&gt;%mend loop1;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;I am calling loop1 macro only when there are values in "var" variables,but when i am executing if any one of the var variable is not resolved it is taking the condition as true and running it.&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;This is causing the job to abend.&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;warning &amp;amp;var1 not resolved&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;%IF &amp;amp;var1&amp;nbsp; NE " " is true.&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;How to overcome this situation?&lt;BR /&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 11 Nov 2013 00:29:36 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138014#M37084</guid>
      <dc:creator>JasonNC</dc:creator>
      <dc:date>2013-11-11T00:29:36Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional Macros</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138015#M37085</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;could you please show us the sample data in the rpt dataset. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;&lt;P&gt;Jagadish&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 11 Nov 2013 08:16:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138015#M37085</guid>
      <dc:creator>Jagadishkatam</dc:creator>
      <dc:date>2013-11-11T08:16:24Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional Macros</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138016#M37086</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Generally speaking, macro code is executed before data step code, so this means the macro code:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;%IF "&amp;amp;var0" NE "" %THEN %FTP_LOOP(&amp;amp;var0);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;%IF "&amp;amp;var1" NE "" %THEN %LOOP1(&amp;amp;var1);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;%IF "&amp;amp;var2" NE "" %THEN %LOOP1(&amp;amp;var2);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;%IF "&amp;amp;var3" NE "" %THEN %LOOP1(&amp;amp;var3);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;%IF "&amp;amp;var4" NE "" %THEN %LOOP1(&amp;amp;var4);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;would be executed *before* your data step. As your var variables have *not* been set when the macro code is executing, the var variables will not resolve, making the &lt;SPAN style="font-family: 'courier new', courier;"&gt;%if&lt;/SPAN&gt; test compare an unresolved macro variable name with a blank, which evaluates to true, which is why LOOP1 gets executed.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;An example might help demonstrate:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;%macro test;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;&amp;nbsp; %if "&amp;amp;var1" ne "" %then&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %put var1=*1*&amp;amp;var1*1*;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;&amp;nbsp; %let var1=;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;&amp;nbsp; %if "&amp;amp;var1" ne "" %then&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %put var1=*2*&amp;amp;var1*2*;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;&amp;nbsp; %let var1=value1;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;&amp;nbsp; %if "&amp;amp;var1" ne "" %then&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %put var1=*3*&amp;amp;var1*3*;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;%mend test;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;%test;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;gives:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;WARNING: Apparent symbolic reference VAR1 not resolved.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;WARNING: Apparent symbolic reference VAR1 not resolved.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;var1=*1*&amp;amp;var1*1*&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;var1=*3*value1*3*&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Only the middle &lt;SPAN style="font-family: 'courier new', courier;"&gt;%if&lt;/SPAN&gt; test condition evaluates to false, as the first test resolves to:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;"&amp;amp;var1" ne ""&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;because &lt;SPAN style="font-family: 'courier new', courier;"&gt;&amp;amp;var1&lt;/SPAN&gt; could not be resolved as it has not been set up, and the 3rd test is:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;"value1" ne ""&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;which also evaluates to true.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Hope that helps.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;/P&gt;&lt;P&gt;Amir.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 11 Nov 2013 13:03:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138016#M37086</guid>
      <dc:creator>Amir</dc:creator>
      <dc:date>2013-11-11T13:03:42Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional Macros</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138017#M37087</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Add this line as the first statement within %LOOP:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%local var0 var1 var2 var3 var4;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Otherwise, these variables won't exist.&amp;nbsp; Attempts to resolve them will generate a message, and will generate the original characters (such as '&amp;amp;var1') instead of a resolved value.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 11 Nov 2013 14:08:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138017#M37087</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2013-11-11T14:08:23Z</dc:date>
    </item>
    <item>
      <title>Re: Conditional Macros</title>
      <link>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138018#M37088</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;You are probably getting errors because you did not force the existence of the macro variables. So when you try to use the %IF statements it cannot resolve the macro variable reference.&amp;nbsp; When this happens SAS just uses the original string including the ampersand so you end up with the string "&amp;amp;VAR1" which is not equal to the string "".&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;A simple way to define the macro variables is to list them in a %LOCAL statement at the top of the macro.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Of course for this application you could just use CALL EXECUTE and eliminate the need for the macro variables or even for the macro %LOOP().&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; background-color: #ffffff;"&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;if var = 'x' then call execute(cats('%nrstr(%loop1()',name0,')'));&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="font-family: 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; background-color: #ffffff;"&gt;&lt;SPAN style="font-family: 'courier new', courier;"&gt;else ...&lt;/SPAN&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 11 Nov 2013 14:20:39 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Procedures/Conditional-Macros/m-p/138018#M37088</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2013-11-11T14:20:39Z</dc:date>
    </item>
  </channel>
</rss>

