BookmarkSubscribeRSS Feed
mmurph15
Fluorite | Level 6

I have 3 proc report statements that I need to run 25 times to get my desired result (one time for each "grantee"). I know there is a simple way to do this with a macro(?), but my experience with macros is limited and I'm struggling. 

 

I want to run the following reports 25 times (1 for each value of the variable "grantee") - i.e., run the reports through once on a subset of data where grantee =grantee1, then run it through again where grantee=grantee2, etc. I have it set up in the code below with a %let statement - this works when i type the grantee name in, one by one, and run it 25 times.  I'm sure there's a faster way where it automatically runs through each value of grantee without having to change the %let statement. Any advice? (I feel like i'm missing something obvious and simple - thank you in advance!)

 

**********************;

%let Q=2021 Q2;  *MUST CHANGE EVERY QUARTER - reporting quarter;

%let D=11/30/2021; *MUST CHANGE EVERY QUARTER - end of the current quarter;

%let G=GRANTEE1; *would need to run for each grantee, 25 total - how to omit this statement and instead use a macro ?;

**********************;

 

*incorporate a macro so these 7 reports will run 25 times - once per value of grantee - without typing in the values of the grantee;

%macro granteereport (??);

*******************************************************************************************;

*REPORT 1 of 7 - Strategy 1  Activities, Training, Outcomes;

ods rtf file = "P:\Shared\Reports\&G._&Q..rtf" startpage=no;

Title1 "2021-2026 &G Report";

Title2 "6/1/2021 - &D";

**1a.;

proc report data=convert;

where grantee="&G" and FW_Idname ne '';

column ("Site Level Activities, Training and Technical Assistance" FW_IDname ("Key Activities" nFWA_B01-nFWA_B03) ("Training and Technical Assistance - Year 1" ("Nutrition" nFWT_N11-nFWT_N14 ) ("Physical Activity" nFWT_P11-nFWT_P14) ));

define FW_idname / group display  "Worksite ID|Name"; 

      define nFWA_B01 / analysis sum "Recruited, ID'd Partners" center format=check.;

      define nFWA_B02 / analysis sum "Assessed" center format=check.;

      define nFWA_B03 / analysis sum "ID'd Areas for Improvement" center format=check.;

      define nFWT_N11 / analysis sum "Cafeterias" center format=check.;

      define nFWT_N12 / analysis sum "Vending" center format=check.;

      define nFWT_N13 / analysis sum "Snack Bars" center format=check.;

      define nFWT_N14 / analysis sum "Behavioral Design" center format=check.;

      define nFWT_P11 / analysis sum "Policy" center format=check.;

      define nFWT_P12 / analysis sum "Environmental Supports" center format=check.;

      define nFWT_P13 / analysis sum "Walking Program" center format=check.; 

      define nFWT_P14 / analysis sum "Activity Friendly Routes" center format=check.;

       rbreak after /summarize  dol ;

      compute after ;

      FW_idname='Total';

      call define  (_row_, "style", "STYLE=[font_weight=bold]")  ;

  call define (2,"format","3.");

  call define (3,"format","3.");

  call define (4,"format","3.");

  call define (5,"format","3.");

  call define (6,"format","3.");

  call define (7,"format","3.");

  call define (8,"format","3.");

  call define (9,"format","3.");

  call define (10,"format","3.");

  call define (11,"format","3.");

  call define (12,"format","3.");

  endcomp;

run;

 

** 1b.OUTCOMES;

proc report data=convert;

where grantee="&G" and FW_idname ne '';

column ("Site Level Outcomes" FW_IDname ("Nutrition Outcomes" nFWO_N05 ("FSGs Implemented in" nFWO_N02-nFWO_N04) ) ("Physical Activity Outcomes" nFWO_P01 ("Practice Implemented" nFWO_P02-nFWO_P04)));

define FW_idname / group display "Worksite ID|Name" center;

      define nFWO_N02 / analysis sum "Cafeterias" center format=check.; 

      define nFWO_N03 / analysis sum "Vending Machines" center format=check.;

      define nFWO_N04 / analysis sum "Snack Bars" center format=check.;

      define nFWO_N05 / analysis sum "Behavioral Design Practice Implemented" center format=check.;

      define nFWO_P01   / analysis sum "Policy Adopted/Improved" center format=check.;

      define nFWO_P02/ analysis sum "Environmental Support" center format=check.;

      define nFWO_P03 / analysis sum "Walking Program" center format=check.;

      define nFWO_P04 / analysis sum "Activity Friendly Route" center format=check.;

rbreak after/summarize  dol ;

      compute after;

      FW_idname='Total';

      call define (_row_, "style", "STYLE=[font_weight=bold]");

  call define (2,"format","3.");

  call define (3,"format","3.");

  call define (4,"format","3.");

  call define (5,"format","3.");

  call define (6,"format","3.");

  call define (7,"format","3.");

  call define (8,"format","3.");

  call define (9,"format","3.");

      endcomp;

run;

 

**1c.NARRATIVE;

proc report data=convert;

column  FW_nar;

define FW_nar / display "&Q Narrative";

where FW_Nar ne "" and grantee="&G";

*where quarter= "&Q";

run;

*ods rtf close;

 

%mend granteereport;

 

%granteereport (??)

2 REPLIES 2
AMSAS
SAS Super FREQ

At a high level you are going to need to know about 

 

Referencing Macro Variables Indirectly

%do statement


Then you are going to do something like this:

/* create macro to run reports */
/* runs parameter passes the number of runs */
%macro multiRep(runs) ;
	/* do loop to loop through the runs */
	%do i=1 %to &runs ;
		/* msg for the log */
		%put Run Report &i ;
		/* simple PROC PRINT example */
		proc print data=sashelp.class (obs=&i) ;
			title "Run Report &i" ;
		run ;
	%end ;
%mend ;

/* Run macro with 5 runs */
%multiRep(5) ;

Start simple and build up the macro little by little.

sas-innovate-white.png

Special offer for SAS Communities members

Save $250 on SAS Innovate and get a free advance copy of the new SAS For Dummies book! Use the code "SASforDummies" to register. Don't miss out, May 6-9, in Orlando, Florida.

 

View the full agenda.

Register now!

Mastering the WHERE Clause in PROC SQL

SAS' Charu Shankar shares her PROC SQL expertise by showing you how to master the WHERE clause using real winter weather data.

Find more tutorials on the SAS Users YouTube channel.

Discussion stats
  • 2 replies
  • 691 views
  • 2 likes
  • 3 in conversation