<?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: Loops and Macros in SAS Enterprise Guide</title>
    <link>https://communities.sas.com/t5/SAS-Enterprise-Guide/Loops-and-Macros/m-p/564302#M33922</link>
    <description>&lt;P&gt;MIN(MONTHLY_DATE) and MAX(MONTHLY_DATE) would be the minimum and maximum dates in the entire data set.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The date variable in question is an official SAS formatted date field.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The attachment just contained the tables I had typed out in my original question.&lt;/P&gt;</description>
    <pubDate>Thu, 06 Jun 2019 20:45:27 GMT</pubDate>
    <dc:creator>ChaseA</dc:creator>
    <dc:date>2019-06-06T20:45:27Z</dc:date>
    <item>
      <title>Loops and Macros</title>
      <link>https://communities.sas.com/t5/SAS-Enterprise-Guide/Loops-and-Macros/m-p/564184#M33920</link>
      <description>&lt;P&gt;I'm fairly new to the idea of macro variables and I think it is the best option I'm looking for right now. I'm working with a data set to track gains and losses in membership rolls. I have my data set sorted by MEMBER_ID and want to look at the beginning and ending dates for each member. We get this data snapshot monthly at the end of the month thus having a field called MONTHLY_DATE containing values like 2018-04-30, 2018-05-31, 2018-06-30, etc. The data starts at 2012-09-31 and currently ends at 2019-04-30. However, there is a possibility that we could get more data prior to 2012-09-31 and we will definitely be receiving data after 2019-04-30. Attached is a spreadsheet with an example data set containing the original data set as well as the two tables I wish to create.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I think I need a few DO statements. First it will look at the MEMBER_ID then look at the MONTHLY_DATE field. If the MONTHLY_DATE field of the first record of the MEMBER_ID (in the data set 'A123B78') is not equal to the MIN(MONTHLY_DATE) then it will write that record to the GAINS table. It will keep cycling through the first MEMBER_ID until it gets to the last record of MEMBER_ID, 'A123B78' at which point it will compare MONTHLY_DATE to the MAX(MONTHLY_DATE). If MONTHLY_DATE is not equal to&amp;nbsp;MAX(MONTHLY_DATE) then it will be written to the LOSSES table. It then repeats this process for the next MEMBER_ID, 'J800K99' and so on and so forth.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;What I'm not sure about is how to effectively do this loop and if macro variables are need in the code at all. I know this is vague and I'm not sure where to start with the code. Any and all help is greatly appreciated.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Starter Data Set&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;MEMBER_ID&lt;/TD&gt;&lt;TD&gt;MONTHLY_DATE&lt;/TD&gt;&lt;TD&gt;CONTRIBUTION&lt;/TD&gt;&lt;TD&gt;LOCATION&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A123B78&lt;/TD&gt;&lt;TD&gt;9/30/2012&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A123B78&lt;/TD&gt;&lt;TD&gt;10/31/2012&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A123B78&lt;/TD&gt;&lt;TD&gt;11/30/2012&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A123B78&lt;/TD&gt;&lt;TD&gt;12/31/2012&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A123B78&lt;/TD&gt;&lt;TD&gt;1/31/2012&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A123B78&lt;/TD&gt;&lt;TD&gt;2/29/2012&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;J800K99&lt;/TD&gt;&lt;TD&gt;5/31/2015&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;J800K99&lt;/TD&gt;&lt;TD&gt;6/30/2015&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;J800K99&lt;/TD&gt;&lt;TD&gt;7/31/2015&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;J800K99&lt;/TD&gt;&lt;TD&gt;8/31/2015&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;R675T90&lt;/TD&gt;&lt;TD&gt;6/30/2013&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;NY&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;R675T90&lt;/TD&gt;&lt;TD&gt;7/31/2013&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;NY&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;R675T90&lt;/TD&gt;&lt;TD&gt;8/31/2013&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;NY&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;R675T90&lt;/TD&gt;&lt;TD&gt;9/30/2013&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;NY&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;W786L13&lt;/TD&gt;&lt;TD&gt;2/28/2019&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;W786L13&lt;/TD&gt;&lt;TD&gt;3/31/2019&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;W786L13&lt;/TD&gt;&lt;TD&gt;4/30/2019&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Y889F45&lt;/TD&gt;&lt;TD&gt;8/31/2018&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Y889F45&lt;/TD&gt;&lt;TD&gt;9/30/2018&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Y889F45&lt;/TD&gt;&lt;TD&gt;10/31/2018&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Y889F45&lt;/TD&gt;&lt;TD&gt;11/30/2018&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Y889F45&lt;/TD&gt;&lt;TD&gt;12/31/2018&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Y889F45&lt;/TD&gt;&lt;TD&gt;1/31/2019&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Y889F45&lt;/TD&gt;&lt;TD&gt;2/28/2019&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Y889F45&lt;/TD&gt;&lt;TD&gt;3/31/2019&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Y889F45&lt;/TD&gt;&lt;TD&gt;4/30/2019&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;LOSSES&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;MEMBER_ID&lt;/TD&gt;&lt;TD&gt;MONTHLY_DATE&lt;/TD&gt;&lt;TD&gt;CONTRIBUTION&lt;/TD&gt;&lt;TD&gt;LOCATION&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;A123B78&lt;/TD&gt;&lt;TD&gt;2/29/2012&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;J800K99&lt;/TD&gt;&lt;TD&gt;8/31/2015&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;R675T90&lt;/TD&gt;&lt;TD&gt;9/30/2013&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;&lt;P&gt;NY&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;GAINS&lt;/P&gt;&lt;TABLE&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD&gt;MEMBER_ID&lt;/TD&gt;&lt;TD&gt;MONTHLY_DATE&lt;/TD&gt;&lt;TD&gt;CONTRIBUTION&lt;/TD&gt;&lt;TD&gt;LOCATION&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;J800K99&lt;/TD&gt;&lt;TD&gt;5/31/2015&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;PA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;R675T90&lt;/TD&gt;&lt;TD&gt;6/30/2013&lt;/TD&gt;&lt;TD&gt;15&lt;/TD&gt;&lt;TD&gt;NY&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;W786L13&lt;/TD&gt;&lt;TD&gt;2/28/2019&lt;/TD&gt;&lt;TD&gt;25&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD&gt;Y889F45&lt;/TD&gt;&lt;TD&gt;8/31/2018&lt;/TD&gt;&lt;TD&gt;40&lt;/TD&gt;&lt;TD&gt;CA&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;</description>
      <pubDate>Thu, 06 Jun 2019 16:12:56 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Enterprise-Guide/Loops-and-Macros/m-p/564184#M33920</guid>
      <dc:creator>ChaseA</dc:creator>
      <dc:date>2019-06-06T16:12:56Z</dc:date>
    </item>
    <item>
      <title>Re: Loops and Macros</title>
      <link>https://communities.sas.com/t5/SAS-Enterprise-Guide/Loops-and-Macros/m-p/564275#M33921</link>
      <description>&lt;P&gt;You need to provide a cleaner definition of what MIN(MONTHLY_DATE)&amp;nbsp;and MAX (MONTHLY_DATE)&amp;nbsp; mean. Are they the single smalles/largest dates included in the entire data set? Within a specific period of interest? Specified somewhere? If so, where or how?&lt;/P&gt;
&lt;P&gt;The definition needs clarification because each member_id will have their own min and max date. And it not clear which actual value you are comparing the "desired result" dates to.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Also please clarify that the date variable in question is actually as SAS date value, not a character value.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Your attachment didn't make it. But since this is SAS providing SAS data sets is much better as that answers all the questions about data types and such.&lt;/P&gt;
&lt;P&gt;Instructions here: &lt;A href="https://communities.sas.com/t5/SAS-Communities-Library/How-to-create-a-data-step-version-of-your-data-AKA-generate/ta-p/258712" target="_blank"&gt;https://communities.sas.com/t5/SAS-Communities-Library/How-to-create-a-data-step-version-of-your-data-AKA-generate/ta-p/258712&lt;/A&gt; will show how to turn an existing SAS data set into data step code that can be pasted into a forum code box using the {i} icon or attached as text to show exactly what you have and that we can test code against.&lt;/P&gt;</description>
      <pubDate>Thu, 06 Jun 2019 19:27:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Enterprise-Guide/Loops-and-Macros/m-p/564275#M33921</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2019-06-06T19:27:28Z</dc:date>
    </item>
    <item>
      <title>Re: Loops and Macros</title>
      <link>https://communities.sas.com/t5/SAS-Enterprise-Guide/Loops-and-Macros/m-p/564302#M33922</link>
      <description>&lt;P&gt;MIN(MONTHLY_DATE) and MAX(MONTHLY_DATE) would be the minimum and maximum dates in the entire data set.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The date variable in question is an official SAS formatted date field.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The attachment just contained the tables I had typed out in my original question.&lt;/P&gt;</description>
      <pubDate>Thu, 06 Jun 2019 20:45:27 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Enterprise-Guide/Loops-and-Macros/m-p/564302#M33922</guid>
      <dc:creator>ChaseA</dc:creator>
      <dc:date>2019-06-06T20:45:27Z</dc:date>
    </item>
    <item>
      <title>Re: Loops and Macros</title>
      <link>https://communities.sas.com/t5/SAS-Enterprise-Guide/Loops-and-Macros/m-p/564585#M33941</link>
      <description>&lt;P&gt;Here's a way to FLAG records for gain or loss that uses a SAS supplied data set you should have available since you haven't provided example data in a form useable for code.&lt;/P&gt;
&lt;PRE&gt;proc summary data=sashelp.stocks;
   var date;
   output out=work.datesum max= min=/autoname;
run;

proc sql noprint;
   select min(date), max(date) into :mindate, :maxdate
   from sashelp.stocks
   ;
quit;

/* sort the data as not in stock, date order
   remove some records to have different date
   ranges as the same for the stocks
   in the base data
*/
proc sort data=sashelp.stocks
    out=work.stocks (where= ( (stock='IBM' and date&amp;lt;'01JUL2005'd)
                            or (stock='Microsoft' and date&amp;gt;'01JUN1987'd)
                            )
                    );
   by stock date;
run;

data example;
  set work.stocks;
  by stock;
  if first.stock and date ne &amp;amp;mindate. then GainFlag=1;
  if last.stock and date ne &amp;amp;maxdate. then LossFlag =1;
run;

&lt;/PRE&gt;
&lt;P&gt;If the proper values are flagged then it is a trivial exercise to OUTPUT the flagged records to a data set, separate data sets or write&amp;nbsp; reports with the information of which records are gains and losses.&lt;/P&gt;</description>
      <pubDate>Fri, 07 Jun 2019 21:44:01 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Enterprise-Guide/Loops-and-Macros/m-p/564585#M33941</guid>
      <dc:creator>ballardw</dc:creator>
      <dc:date>2019-06-07T21:44:01Z</dc:date>
    </item>
  </channel>
</rss>

