<?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 Dynamic Macro Loop in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Dynamic-Macro-Loop/m-p/346782#M273222</link>
    <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I can't seem to get the piece of code identified below to work.&amp;nbsp; I'm trying to get the maximum # of distinct values for the age_group, urban, and urban_zone variables.&amp;nbsp; Use these numbers to subsequently run a do loop to store each of the disinct values into macros to retrieve later.&amp;nbsp; I'd like to do this dynamically.&amp;nbsp; Hope this makes sense.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Appreciate any help.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;K.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/**************************************************************************************/&lt;BR /&gt;/*store values from macro loops for retrieve in later step to calculate weights &amp;amp; prevalence rates*/&lt;BR /&gt;/**************************************************************************************/&lt;BR /&gt;/*create global macros for the 3 variables of interest*/&lt;BR /&gt;&amp;nbsp;%LET LBL1=age_group;&lt;BR /&gt;&amp;nbsp;%LET LBL2=urban;&lt;BR /&gt;&amp;nbsp;%LET LBL3=urban_zone;&lt;/P&gt;&lt;P&gt;/*obtain list of distinct categories for each of the 3 variables of interest*/&lt;BR /&gt;/*obtain the total number of distinct categories for each of the 3 variables of interest*/&lt;BR /&gt;/*obtain the maximum number of distinct categories for each of the 3 variables of interest*/&lt;BR /&gt;%macro var_for_val(dataset,var);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sql noprint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create table dist_var_&amp;amp;&amp;amp;LBL&amp;amp;k as&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select distinct &amp;amp;var&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from &amp;amp;dataset;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sql noprint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create table dist_var2_&amp;amp;&amp;amp;LBL&amp;amp;k as&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select monotonic() as id, &amp;amp;var&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from dist_var_&amp;amp;&amp;amp;LBL&amp;amp;k;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; quit;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;%global max_var_&amp;amp;&amp;amp;LBL&amp;amp;k;&lt;BR /&gt;&amp;nbsp;proc sql noprint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;select distinct max(id)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;into :max_var_&amp;amp;&amp;amp;LBL&amp;amp;k&lt;BR /&gt;&amp;nbsp;&amp;nbsp;from dist_var2_&amp;amp;&amp;amp;LBL&amp;amp;k;&lt;BR /&gt;&amp;nbsp;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*CANNOT GET THIS PIECE OF CODE TO WORK - seems not to recognize the value but instead the macro name*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;%do i = 1 %to &amp;amp;max_var_&amp;amp;&amp;amp;LBL&amp;amp;k;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %global var_&amp;amp;&amp;amp;LBL&amp;amp;k_&amp;amp;i;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sql noprint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select distinct &amp;amp;var&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; into :var_&amp;amp;&amp;amp;LBL&amp;amp;k_&amp;amp;i&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from dist_var2_&amp;amp;&amp;amp;LBL&amp;amp;k&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where id = &amp;amp;i;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; quit;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %put &amp;amp;&amp;amp;var_&amp;amp;&amp;amp;LBL&amp;amp;k_&amp;amp;i;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %end;&lt;/P&gt;&lt;P&gt;/*THIS PIECE OF CODE NOT WORKING END*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%mend var_for_val;&lt;/P&gt;&lt;P&gt;%macro geo_var;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;%do k=1 %to 3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;%var_for_val (pop,var=&amp;amp;&amp;amp;LBL&amp;amp;k);&lt;BR /&gt;&amp;nbsp;%end;&lt;BR /&gt;%mend geo_var;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*run the geo_var macro to get the distinct values for each of the variables of interest*/&lt;BR /&gt;%geo_var;&lt;BR /&gt;/*display all the macro values*/&lt;BR /&gt;%put _ALL_;&lt;/P&gt;</description>
    <pubDate>Mon, 03 Apr 2017 17:46:29 GMT</pubDate>
    <dc:creator>ka2yee</dc:creator>
    <dc:date>2017-04-03T17:46:29Z</dc:date>
    <item>
      <title>Dynamic Macro Loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Dynamic-Macro-Loop/m-p/346782#M273222</link>
      <description>&lt;P&gt;Hello,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;I can't seem to get the piece of code identified below to work.&amp;nbsp; I'm trying to get the maximum # of distinct values for the age_group, urban, and urban_zone variables.&amp;nbsp; Use these numbers to subsequently run a do loop to store each of the disinct values into macros to retrieve later.&amp;nbsp; I'd like to do this dynamically.&amp;nbsp; Hope this makes sense.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Appreciate any help.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;K.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/**************************************************************************************/&lt;BR /&gt;/*store values from macro loops for retrieve in later step to calculate weights &amp;amp; prevalence rates*/&lt;BR /&gt;/**************************************************************************************/&lt;BR /&gt;/*create global macros for the 3 variables of interest*/&lt;BR /&gt;&amp;nbsp;%LET LBL1=age_group;&lt;BR /&gt;&amp;nbsp;%LET LBL2=urban;&lt;BR /&gt;&amp;nbsp;%LET LBL3=urban_zone;&lt;/P&gt;&lt;P&gt;/*obtain list of distinct categories for each of the 3 variables of interest*/&lt;BR /&gt;/*obtain the total number of distinct categories for each of the 3 variables of interest*/&lt;BR /&gt;/*obtain the maximum number of distinct categories for each of the 3 variables of interest*/&lt;BR /&gt;%macro var_for_val(dataset,var);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sql noprint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create table dist_var_&amp;amp;&amp;amp;LBL&amp;amp;k as&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select distinct &amp;amp;var&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from &amp;amp;dataset;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sql noprint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; create table dist_var2_&amp;amp;&amp;amp;LBL&amp;amp;k as&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select monotonic() as id, &amp;amp;var&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from dist_var_&amp;amp;&amp;amp;LBL&amp;amp;k;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; quit;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;%global max_var_&amp;amp;&amp;amp;LBL&amp;amp;k;&lt;BR /&gt;&amp;nbsp;proc sql noprint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;select distinct max(id)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;into :max_var_&amp;amp;&amp;amp;LBL&amp;amp;k&lt;BR /&gt;&amp;nbsp;&amp;nbsp;from dist_var2_&amp;amp;&amp;amp;LBL&amp;amp;k;&lt;BR /&gt;&amp;nbsp;quit;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*CANNOT GET THIS PIECE OF CODE TO WORK - seems not to recognize the value but instead the macro name*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;%do i = 1 %to &amp;amp;max_var_&amp;amp;&amp;amp;LBL&amp;amp;k;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %global var_&amp;amp;&amp;amp;LBL&amp;amp;k_&amp;amp;i;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proc sql noprint;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select distinct &amp;amp;var&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; into :var_&amp;amp;&amp;amp;LBL&amp;amp;k_&amp;amp;i&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; from dist_var2_&amp;amp;&amp;amp;LBL&amp;amp;k&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; where id = &amp;amp;i;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; quit;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; %put &amp;amp;&amp;amp;var_&amp;amp;&amp;amp;LBL&amp;amp;k_&amp;amp;i;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; %end;&lt;/P&gt;&lt;P&gt;/*THIS PIECE OF CODE NOT WORKING END*/&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;%mend var_for_val;&lt;/P&gt;&lt;P&gt;%macro geo_var;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;&amp;nbsp;%do k=1 %to 3;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;%var_for_val (pop,var=&amp;amp;&amp;amp;LBL&amp;amp;k);&lt;BR /&gt;&amp;nbsp;%end;&lt;BR /&gt;%mend geo_var;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;/*run the geo_var macro to get the distinct values for each of the variables of interest*/&lt;BR /&gt;%geo_var;&lt;BR /&gt;/*display all the macro values*/&lt;BR /&gt;%put _ALL_;&lt;/P&gt;</description>
      <pubDate>Mon, 03 Apr 2017 17:46:29 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Dynamic-Macro-Loop/m-p/346782#M273222</guid>
      <dc:creator>ka2yee</dc:creator>
      <dc:date>2017-04-03T17:46:29Z</dc:date>
    </item>
    <item>
      <title>Re: Dynamic Macro Loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Dynamic-Macro-Loop/m-p/346791#M273223</link>
      <description>&lt;P&gt;Do you just want the number of observations in the table the first step creates?&lt;/P&gt;
&lt;P&gt;If so then just use SQLOBS automatic macro variable. &amp;nbsp;&lt;/P&gt;
&lt;P&gt;To make GLOBAL macro variables it is much easier to use CALL SYMPUTX().&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro var_for_val(dataset,var);
proc sql noprint;
  create table dist_var_&amp;amp;var as
    select distinct &amp;amp;var
    from &amp;amp;dataset
  ;
%global max_var_&amp;amp;var;
%let max_var_&amp;amp;var=&amp;amp;sqlobs;
quit;

data dist_var_&amp;amp;var ;
  id+1;
  set dist_var_&amp;amp;var;
  call symputx(cats("dist_var_&amp;amp;var",id),&amp;amp;var,'G');
run;

%mend var_for_val;&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;Note you should probably re-engineer your process to not require so many macro variables. It is usually better to keep data in datasets rather than forcing it into text strings in macro variables.&lt;/P&gt;</description>
      <pubDate>Mon, 03 Apr 2017 18:20:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Dynamic-Macro-Loop/m-p/346791#M273223</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2017-04-03T18:20:00Z</dc:date>
    </item>
    <item>
      <title>Re: Dynamic Macro Loop</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Dynamic-Macro-Loop/m-p/346803#M273224</link>
      <description>&lt;P&gt;Thanks Tom.&amp;nbsp; Your right its not very efficient what I'm thinking.&amp;nbsp; I'll re-engineer the process.&amp;nbsp; I appreciate your help.&amp;nbsp; Best,&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Karen&lt;/P&gt;</description>
      <pubDate>Mon, 03 Apr 2017 18:54:48 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Dynamic-Macro-Loop/m-p/346803#M273224</guid>
      <dc:creator>ka2yee</dc:creator>
      <dc:date>2017-04-03T18:54:48Z</dc:date>
    </item>
  </channel>
</rss>

