Hi: The issue is that you need the controlling statements and can't get rid of them. I don't know how you're using SAS -- it almost sounds like you're using Enterprise Guide or one of the solution interfaces in which case, the default output that EG is creating could be the issue. Your SAS Administrator should be able to identify a location on the server where you can write output. ODS LAYOUT and ODS REGION have to be supported by the destination, including the default destination that your interface is using. The ODS Sandwich is needed in order to be sure you are sending the output to a destination that supports ODS LAYOUT and ODS REGION. Have you talked to your SAS Administrator about getting a location that you can write to? Otherwise, you could try to write the output to your WORK location and then navigate to your WORK location to find the output: %let wpath=%sysfunc(pathname(WORK)); %put path to work location is: &wpath; ods html(id=1) path="&wpath" (url=none) file='wpath_layout.html'; %makereport(wantapp=APP_A, wantconn=CONN1) %makereport(wantapp=APP_A, wantconn=CONN2) %makereport(wantapp=APP_B, wantconn=CONN1)
** more invocations for macro program; ods html(id=1) close;
And this shows that I got the 2 column output and the file is in my WORK location specified by the &WPATH macro variable:
I can show you an example of using CALL EXECUTE for the macro program. However, you need to figure out how to use the "full control" method of the ODS HTML sandwich in order to create your output.
My code works with ODS HTML, ODS HTML5, and ODS PDF to make 2 columns with the graph on the left and the table on the right. The code will NOT work in ODS RTF or ODS EXCEL (destinations that don't support ODS LAYOUT). The code also will not work in ODS LISTING or ODS CSV, which are also destinations that don't support ODS LAYOUT. If you look in your log, you should see a warning if the default destination does not support ODS LAYOUT:
As another example of how I would run this code in a server environment like SAS OnDemand for Academics, I would make an output folder under my Files (Home) directory in the OnDemand server and then do this:
ods html5(id=2) path='/home/<userid>/output/' (url=none) file='soda_layout.html'; %makereport(wantapp=APP_A, wantconn=CONN1) %makereport(wantapp=APP_A, wantconn=CONN2) %makereport(wantapp=APP_B, wantconn=CONN1)
** more invocations for macro program; ods html5(id=2) close;
Then I could use SAS Studio to go to the output folder to download the HTML file:
Cynthia
Example of Macro Program to invoke dynamically using CALL EXECUTE:
** need to run this PROC FREQ to create WORK.OWLIST from work.char_table_sort;
ods output list=work.owlist(drop=table f_app f_conn);
proc freq data=char_table_sort;
tables app*conn/nocum nopercent list;
run;
title; footnote;
ods html(id=2) path='c:\temp' (url=none)
file='dynamic_layout.html' gtitle;
data _null_;
length arg $100;
set work.owlist(keep=app conn);
arg = catt('%nrstr(%makereport(wantapp=',app, ', wantconn=',conn,'))') ;
call execute(arg);
run;
ods html(id=2) close;
Using CALL EXECUTE is fairly advanced Macro programming, so you would really need to work on understanding Macro programming if you were going to use a method like CALL EXECUTE. There are other methods you could use, but you really need to resolve the server issue and file creation issue first.
... View more