<?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: Assign and Retain Values to Variable inside a macro in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/430054#M106274</link>
    <description>&lt;P&gt;What you are describing is part macros, part arrays.&amp;nbsp; For example:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="token procnames"&gt;Data&lt;/SPAN&gt; WORK&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;CCC&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;SPAN class="token keyword"&gt;SET&lt;/SPAN&gt; work&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;AAA&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;SPAN class="token statement"&gt;BY&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;ID&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;array counts {&amp;amp;startmonth:&amp;amp;stopmonth} Trans_CNT_&amp;amp;startmonth - Trans_CNT_&amp;amp;stopmonth;&lt;BR /&gt; &lt;SPAN class="token keyword"&gt;IF&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;FIRST&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;ID&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;1&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;THEN&lt;/SPAN&gt; DO k=&amp;amp;startmonth to &amp;amp;stopmonth;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; counts{k}&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token number"&gt;0&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; END&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;if GRP='A' and (&amp;amp;startmonth &amp;lt;= month &amp;lt;= &amp;amp;stopmonth) then count&lt;SPAN class="token function"&gt;s{month} + 1;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;drop k;&lt;/P&gt;
&lt;P&gt;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This way, you only need to process work.AAA once.&amp;nbsp; If you process the data separately for each month, that will multiply the time it takes your program to run.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
    <pubDate>Tue, 23 Jan 2018 16:48:12 GMT</pubDate>
    <dc:creator>Astounding</dc:creator>
    <dc:date>2018-01-23T16:48:12Z</dc:date>
    <item>
      <title>Assign and Retain Values to Variable inside a macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/430036#M106269</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Hi all,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I am trying to create a macro to dynamically compute cumulative returns across variables in my dataset.&lt;/P&gt;&lt;P&gt;And my problem is: the macro below is overwriting the results obtained for the prior variable instead of creating separate columns in each iteration.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Here is my sample dataset:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE class="language-sas lia-code-sample"&gt;&lt;CODE class=" language-sas"&gt;&lt;SPAN class="token procnames"&gt;data&lt;/SPAN&gt; &lt;SPAN class="token procnames"&gt;work.AAA&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt; 
&lt;SPAN class="token keyword"&gt;input&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;id&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;$&lt;/SPAN&gt; GRP &lt;SPAN class="token punctuation"&gt;$&lt;/SPAN&gt; &lt;SPAN class="token procnames"&gt;month txn&lt;/SPAN&gt; &lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt; 
&lt;SPAN class="token datalines"&gt;&lt;SPAN class="token keyword"&gt;datalines&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;BR /&gt;&lt;/SPAN&gt;&lt;SPAN class="token data string"&gt;ID1 A 1 100&lt;BR /&gt;ID1 A 1 200&lt;BR /&gt;ID1 A 2 300&lt;BR /&gt;ID2 A 1 200&lt;BR /&gt;ID2 B 2 300&lt;BR /&gt;ID2 A 3 400&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;My SAS code is as follows:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro multmn(startmonth,stopmonth);
	%do mvalue=&amp;amp;startmonth %to &amp;amp;stopmonth;
		Data WORK.CCC;
		SET work.AAA;
		BY ID;
		IF FIRST.ID = 1 THEN DO;
		Trans_CNT_&amp;amp;mvalue=0;
		END;
		Retain Trans_CNT_&amp;amp;mvalue;
		IF (GRP='A' and MONTH=&amp;amp;mvalue) then Trans_CNT_&amp;amp;mvalue = SUM(Trans_CNT_&amp;amp;mvalue+1) ;
		run;
	%end;
%mend multmn;
%multmn(1,3)&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;In fact, I want to convert the code below into macro method.&lt;SPAN&gt;​&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;Data WORK.BBB;
SET work.AAA;
BY ID;
IF FIRST.ID = 1 THEN DO;
Trans_CNT_1=0;Trans_CNT_2=0;Trans_CNT_3=0;
END;
Retain Trans_CNT_1 Trans_CNT_2 Trans_CNT_3;
IF (GRP='A' and MONTH=1) THEN Trans_CNT_1 = SUM(Trans_CNT_1+1);
IF (GRP='A' and MONTH=2) THEN Trans_CNT_2 = SUM(Trans_CNT_2+1);
IF (GRP='A' and MONTH=3) THEN Trans_CNT_3 = SUM(Trans_CNT_3+1);
run;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;If you have any ideas, please advise me. Much thanks. ^_^&lt;SPAN&gt;​&lt;/SPAN&gt;&lt;SPAN&gt;​&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 23 Jan 2018 15:41:02 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/430036#M106269</guid>
      <dc:creator>wenzli25</dc:creator>
      <dc:date>2018-01-23T15:41:02Z</dc:date>
    </item>
    <item>
      <title>Re: Assign and Retain Values to Variable inside a macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/430040#M106270</link>
      <description>&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;		Data WORK.CCC;
		SET work.AA&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The lines above are the issue. Since you're always starting from data set AA, you lose the previous run of data. You need to start from the same data set each time to add it on. But why not move your loop into the macro instead?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you have SAS/ETS then PROC EXPAND will also do this a lot easier.&lt;/P&gt;
&lt;P&gt;The following modification should make your program work.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro multmn(startmonth,stopmonth);

data ccc;
set aaa;
run;


	%do mvalue=&amp;amp;startmonth %to &amp;amp;stopmonth;
		Data WORK.CCC;
		SET work.ccc;
		BY ID;
		IF FIRST.ID = 1 THEN DO;
		Trans_CNT_&amp;amp;mvalue=0;
		END;
		Retain Trans_CNT_&amp;amp;mvalue;
		IF (GRP1='A' and MONTH=&amp;amp;mvalue) then Trans_CNT_&amp;amp;mvalue = SUM(Trans_CNT_&amp;amp;mvalue+1) ;
		run;
	%end;
%mend multmn;
%multmn(1,3)&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Tue, 23 Jan 2018 15:43:16 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/430040#M106270</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2018-01-23T15:43:16Z</dc:date>
    </item>
    <item>
      <title>Re: Assign and Retain Values to Variable inside a macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/430054#M106274</link>
      <description>&lt;P&gt;What you are describing is part macros, part arrays.&amp;nbsp; For example:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="token procnames"&gt;Data&lt;/SPAN&gt; WORK&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;CCC&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;SPAN class="token keyword"&gt;SET&lt;/SPAN&gt; work&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;AAA&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; &lt;SPAN class="token statement"&gt;BY&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;ID&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;array counts {&amp;amp;startmonth:&amp;amp;stopmonth} Trans_CNT_&amp;amp;startmonth - Trans_CNT_&amp;amp;stopmonth;&lt;BR /&gt; &lt;SPAN class="token keyword"&gt;IF&lt;/SPAN&gt; &lt;SPAN class="token function"&gt;FIRST&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;.&lt;/SPAN&gt;&lt;SPAN class="token keyword"&gt;ID&lt;/SPAN&gt; &lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt; &lt;SPAN class="token number"&gt;1&lt;/SPAN&gt; &lt;SPAN class="token keyword"&gt;THEN&lt;/SPAN&gt; DO k=&amp;amp;startmonth to &amp;amp;stopmonth;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; counts{k}&lt;SPAN class="token operator"&gt;=&lt;/SPAN&gt;&lt;SPAN class="token number"&gt;0&lt;/SPAN&gt;&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;BR /&gt; END&lt;SPAN class="token punctuation"&gt;;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;if GRP='A' and (&amp;amp;startmonth &amp;lt;= month &amp;lt;= &amp;amp;stopmonth) then count&lt;SPAN class="token function"&gt;s{month} + 1;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;drop k;&lt;/P&gt;
&lt;P&gt;run;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This way, you only need to process work.AAA once.&amp;nbsp; If you process the data separately for each month, that will multiply the time it takes your program to run.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 23 Jan 2018 16:48:12 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/430054#M106274</guid>
      <dc:creator>Astounding</dc:creator>
      <dc:date>2018-01-23T16:48:12Z</dc:date>
    </item>
    <item>
      <title>Re: Assign and Retain Values to Variable inside a macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/430055#M106275</link>
      <description>&lt;P&gt;Thank you for your quick reply. ^_^&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I have two problems:&lt;/P&gt;&lt;P&gt;1. &lt;SPAN class="short_text"&gt;&lt;SPAN class=""&gt;I don't understand the meaning of the sentence below:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="short_text"&gt;&lt;SPAN class=""&gt;"But why not move your loop into the macro instead?"&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="short_text"&gt;&lt;SPAN class=""&gt;2. So I just take the same dataset to another iteration, then the problem solved, right? &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;PRE&gt;&lt;CODE class="language-sas"&gt;		Data work.ccc;
		SET work.ccc;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;SPAN class="short_text"&gt;&lt;SPAN class=""&gt;Much Thanks.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 23 Jan 2018 16:04:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/430055#M106275</guid>
      <dc:creator>wenzli25</dc:creator>
      <dc:date>2018-01-23T16:04:29Z</dc:date>
    </item>
    <item>
      <title>Re: Assign and Retain Values to Variable inside a macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/431327#M106675</link>
      <description>&lt;BLOCKQUOTE&gt;&lt;HR /&gt;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/181600"&gt;@wenzli25&lt;/a&gt; wrote:&lt;BR /&gt;
&lt;P&gt;Thank you for your quick reply. ^_^&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;I have two problems:&lt;/P&gt;
&lt;P&gt;1. &lt;SPAN class="short_text"&gt;&lt;SPAN class=""&gt;I don't understand the meaning of the sentence below:&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="short_text"&gt;&lt;SPAN class=""&gt;"But why not move your loop into the macro instead?"&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="short_text"&gt;&lt;SPAN class=""&gt;2. So I just take the same dataset to another iteration, then the problem solved, right? &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="language-sas"&gt;		Data work.ccc;
		SET work.ccc;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN class="short_text"&gt;&lt;SPAN class=""&gt;Much Thanks.&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;HR /&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;1. You're looping the data step, when you really should be looping within the data step. Otherwise you're recreating that data set multiple times with additions/changes that doesn't make sense. You should&amp;nbsp;likely be using an array instead of a macro here.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;2. Only way to know, is to test it.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 26 Jan 2018 16:09:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Assign-and-Retain-Values-to-Variable-inside-a-macro/m-p/431327#M106675</guid>
      <dc:creator>Reeza</dc:creator>
      <dc:date>2018-01-26T16:09:01Z</dc:date>
    </item>
  </channel>
</rss>

