<?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: A macro behaving as it is not supposed to in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214577#M39607</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;What is a good place to read more about this distinction, between what counts as code generation and what can/cannot be controlled by logic flow in a data step?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks and kind regards &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 31 Jul 2015 00:52:00 GMT</pubDate>
    <dc:creator>RDzh</dc:creator>
    <dc:date>2015-07-31T00:52:00Z</dc:date>
    <item>
      <title>A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214567#M39597</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello everyone!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;As a practice exercise I've been writing a macro that does this: substitutes the n-th occurrence of a substring within a string with another string. Thus, if I have the string &lt;EM&gt;KingRobertKingGeorgeKingAdamKing &lt;/EM&gt;and I will use the macro to substitute, say, the 2nd occurrence of &lt;EM&gt;King&lt;/EM&gt; with, say, Queen, and have&lt;SPAN style="font-size: 13.3333330154419px;"&gt;&lt;EM&gt;KingRobertQueenGeorgeKingAdamKing.&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&lt;SPAN style="font-size: 13.3333330154419px;"&gt;&lt;EM&gt;&lt;BR /&gt;&lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;Now I've written a fairly successful macro to do this, except that it shows some behaviour it is not supposed to; here is the code (but don't read it line by line; just focus on where the problem arises, as explained in the red text and after the code). I provide the code as well as the data-set I use it with if you want to run it for yourself and see the issue first-hand. So...&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;%macro auxm(ds, col, str1, str2, n_occurr);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;%let ds_id = %sysfunc(open(&amp;amp;ds));&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;%let colVarnum = %sysfunc(varnum(&amp;amp;ds_id, &amp;amp;col));&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;%let colVartype = %sysfunc(vartype(&amp;amp;ds_id, &amp;amp;colVarnum));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;/* Check */ %put Check: vartype for the column is &amp;amp;colVartype;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;%if &amp;amp;colVartype ne C %then %put The column is not character;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;%else %do;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; %put The column is character;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; %let lstr1 = %length(&amp;amp;str1);&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;/* Check */ %put Length of the string to be changed is &amp;amp;lstr1;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; data &amp;amp;ds.2;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; set &amp;amp;ds;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; temp = &amp;amp;col;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; if &amp;amp;n_occurr = 1 then do;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; if index(temp, "&amp;amp;str1") = 1 then temp = "&amp;amp;str2"||substr(temp, &amp;amp;lstr1 + 1);&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; else temp = substr(temp, 1, index(temp, "&amp;amp;str1") - 1) || "&amp;amp;str2" || substr(temp, index(temp, "&amp;amp;str1") + &amp;amp;lstr1);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; else do;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="color: #ff0000;"&gt;Problem arises here: the code in green below is not supposed to be hit when n_occurr&amp;nbsp; = 1, but it does get hit! Why?&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp; do i = 1 to (&amp;amp;n_occurr - 1);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp; if index(temp, "&amp;amp;str1") = 1 then temp = substr(temp, &amp;amp;lstr1 + 1);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp; else temp = substr(temp, 1, index(temp, "&amp;amp;str1") - 1) || substr(temp, index(temp, "&amp;amp;str1") + &amp;amp;lstr1);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp; end;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp; drop i;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp; pos = index(temp, "&amp;amp;str1") + (&amp;amp;n_occurr - 1)*(&amp;amp;lstr1);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp; col3 = &amp;amp;col;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp; col3 = substr(col3, 1, pos - 1)||"&amp;amp;str2"||substr(col3, pos + &amp;amp;lstr1);&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp; drop age temp pos;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="color: #339966;"&gt;&amp;nbsp; end;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;%end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;%mend auxm;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;In more detail, my problem is this: since I work with two cases, based on whether n_occurr = 1 or n_occurr &amp;gt; 1 (i.e., whether I want to change the first or any subsequent occurrence of a given substring), when I have n_occurr = 1 for some reason my code also hits the &lt;EM&gt;else do &lt;/EM&gt;condition.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;I test this code with the dataset&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;data test;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;input Name $25. age;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;datalines;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;RadoslavRadossRado&amp;nbsp;&amp;nbsp; 12&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;IvanRadowwRadollRados&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;SimonRadoseRadosseqRadok&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 31&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;and with&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;%auxm(test, Name, Rado, XXX, 1), which works as supposed only when I put in comments the else-do part above;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;or&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;%auxm(test, Name, Rado, XXX, 2), which works fine.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;Any idea will be much appreciated!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 30 Jul 2015 18:54:31 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214567#M39597</guid>
      <dc:creator>RDzh</dc:creator>
      <dc:date>2015-07-30T18:54:31Z</dc:date>
    </item>
    <item>
      <title>Re: A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214568#M39598</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Please explicitly indicate which code is not supposed to run when n_occurr=1. Highlight all the lines.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 30 Jul 2015 19:23:08 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214568#M39598</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2015-07-30T19:23:08Z</dc:date>
    </item>
    <item>
      <title>Re: A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214569#M39599</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks for your feedback and interest, ballardw!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;See, issue is: I work with two cases, when n_occurr = 1 and when it is &amp;gt; 1 (that is, when I want to change the first occurrence of the substring and when I want to change some further occurrence). Consequently, I use &lt;EM style="color: #333333; font-size: 12px; background-color: #ffffff; font-family: Arial, Helvetica, sans-serif;"&gt;if &amp;amp;n_occurr = 1 then do&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/EM&gt;&lt;SPAN style="color: #333333; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff;"&gt;and then&amp;nbsp; &lt;EM&gt;else do ; &lt;/EM&gt;but somehow the statements in the else-do block also get hit when n_occurr = 1. When I put them in /*&amp;nbsp; */ the macro works fine for n_occurr = 1.&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks and kind regards&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 30 Jul 2015 19:33:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214569#M39599</guid>
      <dc:creator>RDzh</dc:creator>
      <dc:date>2015-07-30T19:33:23Z</dc:date>
    </item>
    <item>
      <title>Re: A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214570#M39600</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Change this:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; drop i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; pos = index(temp, "&amp;amp;str1") + (&amp;amp;n_occurr - 1)*(&amp;amp;lstr1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; col3 = &amp;amp;col;&lt;/P&gt;&lt;P&gt;&amp;nbsp; col3 = substr(col3, 1, pos - 1)||"&amp;amp;str2"||substr(col3, pos + &amp;amp;lstr1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; drop age temp pos;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;To:&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; drop i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; pos = index(temp, "&amp;amp;str1") + (&amp;amp;n_occurr - 1)*(&amp;amp;lstr1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; col3 = &amp;amp;col;&lt;/P&gt;&lt;P&gt;&amp;nbsp; col3 = substr(col3, 1, pos - 1)||"&amp;amp;str2"||substr(col3, pos + &amp;amp;lstr1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; drop age temp pos;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The reassignments were only in the "else do" loop. Which was not executing when n_occur =1.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 30 Jul 2015 20:19:13 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214570#M39600</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2015-07-30T20:19:13Z</dc:date>
    </item>
    <item>
      <title>Re: A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214571#M39601</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;This example is adapted from the SAS documentation example for POSNEXT&lt;/P&gt;&lt;DIV style="font-family: Courier New; font-size: 11pt;"&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; o=2; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; background-color: #ffffff;"&gt;/*Which occurrence to replace.*/&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; t=rado; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; background-color: #ffffff;"&gt;/*target*/&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;%let&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; r=-Replacement-; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; background-color: #ffffff;"&gt;/*String to replace it with*/&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;data&lt;/STRONG&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; test;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;retain&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; ExpressionId;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; _n_ eq &lt;/SPAN&gt;&lt;STRONG style="color: #008080; background-color: #ffffff;"&gt;1&lt;/STRONG&gt; &lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;then&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; ExpressionID = prxparse(&lt;/SPAN&gt;&lt;SPAN style="color: #800080; background-color: #ffffff;"&gt;"/&amp;amp;t/i"&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;input&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; text :&lt;/SPAN&gt;&lt;SPAN style="color: #008080; background-color: #ffffff;"&gt;$25.&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; age;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;retain&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; r &lt;/SPAN&gt;&lt;SPAN style="color: #800080; background-color: #ffffff;"&gt;"&amp;amp;r"&lt;/SPAN&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; start = &lt;/SPAN&gt;&lt;STRONG style="color: #008080; background-color: #ffffff;"&gt;1&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;stop&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp; = length(text);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; i = &lt;/SPAN&gt;&lt;STRONG style="color: #008080; background-color: #ffffff;"&gt;0&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;call&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; prxnext(ExpressionID, start, stop, text, position, length);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;do&lt;/SPAN&gt; &lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;while&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; (position &amp;gt; &lt;/SPAN&gt;&lt;STRONG style="color: #008080; background-color: #ffffff;"&gt;0&lt;/STRONG&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; i + &lt;/SPAN&gt;&lt;STRONG style="color: #008080; background-color: #ffffff;"&gt;1&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; found = substr(text, position, length);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #008000; background-color: #ffffff;"&gt;*put found= position= length=;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; &amp;amp;o eq i &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;then&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; leave;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;call&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; prxnext(ExpressionID, start, stop, text, position, length);&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;end&lt;/SPAN&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;length&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; new $&lt;/SPAN&gt;&lt;STRONG style="color: #008080; background-color: #ffffff;"&gt;60&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;if&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; &amp;amp;o eq i &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;then&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; new = cats(substrn(text,&lt;/SPAN&gt;&lt;STRONG style="color: #008080; background-color: #ffffff;"&gt;1&lt;/STRONG&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;,position-&lt;/SPAN&gt;&lt;STRONG style="color: #008080; background-color: #ffffff;"&gt;1&lt;/STRONG&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;),r,substrn(text,position+length));&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;put&lt;/SPAN&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;put&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; text;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;put&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt; new;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;put&lt;/SPAN&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;SPAN style="color: #0000ff; background-color: #ffffff;"&gt;datalines&lt;/SPAN&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffc0;"&gt;RadoslavRadossRado&amp;nbsp;&amp;nbsp; 12&lt;BR /&gt;IvanRadowwRadollRados&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&lt;BR /&gt;SimonRadoseRadosseqRadok&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 31&lt;BR /&gt;SimonRados&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; 33&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;;;;;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;run&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;proc&lt;/STRONG&gt; &lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;print&lt;/STRONG&gt;; &lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &lt;/SPAN&gt;&lt;STRONG style="color: #000080; background-color: #ffffff;"&gt;run&lt;/STRONG&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV style="font-family: Courier New; font-size: 11pt;"&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;BR /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;DIV style="font-family: Courier New; font-size: 11pt;"&gt;&lt;SPAN style="color: #000000; background-color: #ffffff;"&gt;&lt;IMG alt="Capture.PNG" class="jive-image-thumbnail jive-image" src="https://communities.sas.com/legacyfs/online/11288_Capture.PNG" width="450" /&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 30 Jul 2015 21:47:57 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214571#M39601</guid>
      <dc:creator>data_null__</dc:creator>
      <dc:date>2015-07-30T21:47:57Z</dc:date>
    </item>
    <item>
      <title>Re: A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214572#M39602</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;No, it seems you got that wrong, ballardw, or I get your explanation wrong &lt;img id="smileyhappy" class="emoticon emoticon-smileyhappy" src="https://communities.sas.com/i/smilies/16x16_smiley-happy.png" alt="Smiley Happy" title="Smiley Happy" /&gt;&lt;/P&gt;&lt;P&gt;My problem is precisely that the code inside the else-do &lt;EM&gt;does &lt;/EM&gt;execute when n_occurr = 1, and I don't want it to,&amp;nbsp; nor do I think it should. I'm interested also why it does; this seems to me like a bug or something about SAS I don't understand.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;If you want, try my code in SAS to see what I mean.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks and kind regards!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 30 Jul 2015 23:01:22 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214572#M39602</guid>
      <dc:creator>RDzh</dc:creator>
      <dc:date>2015-07-30T23:01:22Z</dc:date>
    </item>
    <item>
      <title>Re: A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214573#M39603</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks for this, data _null_; it will be interesting to study this solution.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But I'm still keen to understand what goes wrong with my own.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Kind regards&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 30 Jul 2015 23:03:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214573#M39603</guid>
      <dc:creator>RDzh</dc:creator>
      <dc:date>2015-07-30T23:03:02Z</dc:date>
    </item>
    <item>
      <title>Re: A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214574#M39604</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I can't replicate what you describe. Your code works as you want it to. Run below cut-down version of your macro and you'll see.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%macro auxm(ds, col, str1, str2, n_occurr);&lt;/P&gt;&lt;P&gt;&amp;nbsp; %let ds_id = %sysfunc(open(&amp;amp;ds));&lt;/P&gt;&lt;P&gt;&amp;nbsp; %let colVarnum = %sysfunc(varnum(&amp;amp;ds_id, &amp;amp;col));&lt;/P&gt;&lt;P&gt;&amp;nbsp; %let colVartype = %sysfunc(vartype(&amp;amp;ds_id, &amp;amp;colVarnum));&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Check */&lt;/P&gt;&lt;P&gt;&amp;nbsp; %put Check: vartype for the column is &amp;amp;colVartype;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %if &amp;amp;colVartype ne C %then&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %put The column is not character;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %else&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %put The column is character;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %let lstr1 = %length(&amp;amp;str1);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Check */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %put Length of the string to be changed is &amp;amp;lstr1;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data _NULL_;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; set &amp;amp;ds;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; temp = &amp;amp;col;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if &amp;amp;n_occurr = 1 then&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; do;&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; put "XXXXXXX&amp;nbsp; part 1";&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 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; do;&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; put "XXXXXXX&amp;nbsp; part 2";&amp;nbsp; &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %end;&lt;/P&gt;&lt;P&gt;%mend auxm;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;%auxm(sashelp.class, Name, Rado, XXX, 1)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;You could of course check the value of "&amp;amp;n_occur" on macro level and then only generate the SAS code block you actually want to execute. This wouldn't change the result though.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 30 Jul 2015 23:42:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214574#M39604</guid>
      <dc:creator>Patrick</dc:creator>
      <dc:date>2015-07-30T23:42:12Z</dc:date>
    </item>
    <item>
      <title>Re: A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214575#M39605</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Sounds like you are confused between using macro logic (%IF ...%THEN ... ) to selectively generate code and data step logic (IF ... THEN ...) to selectively execute statements.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Consider this example.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;data want ;&lt;/P&gt;&lt;P&gt; set sashelp.class;&lt;/P&gt;&lt;P&gt; if 0=1 then do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop NAME ;&lt;/P&gt;&lt;P&gt; end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Versus this example:&lt;/P&gt;&lt;P&gt;%macro example;&lt;/P&gt;&lt;P&gt;data want ;&lt;/P&gt;&lt;P&gt; set sashelp.class ;&lt;/P&gt;&lt;P&gt; %if 0=1 %then %do;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; drop name ;&lt;/P&gt;&lt;P&gt; %end;&lt;/P&gt;&lt;P&gt;run;&lt;/P&gt;&lt;P&gt;%mend example;&lt;/P&gt;&lt;P&gt;%example;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The first data step will drop the variable NAME because a DROP statement is evaluated when the data step is compiled and has no executable component than can be controlled by logic flow.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 30 Jul 2015 23:56:42 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214575#M39605</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2015-07-30T23:56:42Z</dc:date>
    </item>
    <item>
      <title>Re: A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214576#M39606</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I started getting at something like this, because my code worked fine when I changed it this way:&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %if &amp;amp;n_occurr = 1 %then %do;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; data &amp;amp;ds.2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set &amp;amp;ds;&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp = &amp;amp;col;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if index(temp, "&amp;amp;str1") = 1 then temp = "&amp;amp;str2"||substr(temp, &amp;amp;lstr1 + 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; else temp = substr(temp, 1, index(temp, "&amp;amp;str1") - 1) || "&amp;amp;str2" || substr(temp, index(temp, "&amp;amp;str1") + &amp;amp;lstr1); &lt;/P&gt;&lt;P&gt;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %else %do;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; data &amp;amp;ds.2;&lt;/P&gt;&lt;P&gt;&amp;nbsp; set &amp;amp;ds;&lt;/P&gt;&lt;P&gt;&amp;nbsp; temp = &amp;amp;col;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; do i = 1 to (&amp;amp;n_occurr - 1); &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; if index(temp, "&amp;amp;str1") = 1 then temp = substr(temp, &amp;amp;lstr1 + 1);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; else temp = substr(temp, 1, index(temp, "&amp;amp;str1") - 1) || substr(temp, index(temp, "&amp;amp;str1") + &amp;amp;lstr1); &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; drop i;&lt;/P&gt;&lt;P&gt;&amp;nbsp; pos = index(temp, "&amp;amp;str1") + (&amp;amp;n_occurr - 1)*(&amp;amp;lstr1);&lt;/P&gt;&lt;P&gt;&amp;nbsp; col3 = &amp;amp;col;&lt;/P&gt;&lt;P&gt;&amp;nbsp; col3 = substr(col3, 1, pos - 1)||"&amp;amp;str2"||substr(col3, pos + &amp;amp;lstr1); &lt;/P&gt;&lt;P&gt;&amp;nbsp; drop age temp pos;&lt;/P&gt;&lt;P&gt;&amp;nbsp; run;&lt;/P&gt;&lt;P&gt;&amp;nbsp; %end;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But thanks very much for revealing this aspect of SAS to me!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Also, thanks to the rest of you for your participation!&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 31 Jul 2015 00:39:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214576#M39606</guid>
      <dc:creator>RDzh</dc:creator>
      <dc:date>2015-07-31T00:39:19Z</dc:date>
    </item>
    <item>
      <title>Re: A macro behaving as it is not supposed to</title>
      <link>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214577#M39607</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;What is a good place to read more about this distinction, between what counts as code generation and what can/cannot be controlled by logic flow in a data step?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks and kind regards &lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 31 Jul 2015 00:52:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/A-macro-behaving-as-it-is-not-supposed-to/m-p/214577#M39607</guid>
      <dc:creator>RDzh</dc:creator>
      <dc:date>2015-07-31T00:52:00Z</dc:date>
    </item>
  </channel>
</rss>

