17
1 bt006 USING ODS Ban Chuan Cheah, Westat, Rockville, MD Abstract This paper will guide you, step by step, through some easy and not-so-easy ways to enhance your SAS® output using the Output Delivery System (ODS). It first uses a PROC REPORT example with the RTF and HTML destinations to illustrate some basic ODS statements and simple output enhancements. It then shows how to modify your output using PROC TEMPLATE, change the size of your fonts, and control the title and links in the HTML table of contents. Finally, it presents a drill-down graph as a more advanced use of ODS. USING ODS ODS or Output Delivery System is mainly a way to produce enhanced reports. There are several ways to harness the capabilities of ODS and they are explored here. 1. Syntax 1.1. Examples 2. Example: Enhanced Proc Report or Proc Tabulate 2.1. Why use ODS? 3. Example: Creating Excel Spreadsheets 3.1. Changing the default HTML output style 4. Finding ODS objects (datasets) - using ODS trace 5. Modifying the appearance of the output 5.1. Changing font sizes using PROC TEMPLATE 5.2. Other ways to change the appearance of your output 5.2.1. Modifying the title in the table of contents and removing redundant items 5.2.2. Modifying the link in the table of contents 6. Drill-down HTML documents with SAS/GRAPH All the examples here were produced using SAS Version 8.2. 1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE, PROC FREQ, etc.) with the statements: ods file specification options; insert procedures here ods file specification close; 1.1. Example ods html file="Reports.html" frame="ReportsFrame.html" contents="ReportsContents.html" style=ods.FixByContents; ods rtf file="Reports.rtf"; Beginning Tutorials NESUG 16

NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

1

bt006

USING ODS

Ban Chuan Cheah, Westat, Rockville, MD

Abstract

This paper will guide you, step by step, through some easy and not-so-easy ways to enhance your SAS® output using the Output Delivery System (ODS). It first uses a PROC REPORT example with the RTF and HTML destinations to illustrate some basic ODS statements and simple output enhancements. It then shows how to modify your output using PROC TEMPLATE, change the size of your fonts, and control the title and links in the HTML table of contents. Finally, it presents a drill-down graph as a more advanced use of ODS.

USING ODS

ODS or Output Delivery System is mainly a way to produce enhanced reports. There are several ways to harness the capabilities of ODS and they are explored here.

1. Syntax 1.1. Examples

2. Example: Enhanced Proc Report or Proc Tabulate 2.1. Why use ODS?

3. Example: Creating Excel Spreadsheets 3.1. Changing the default HTML output style

4. Finding ODS objects (datasets) - using ODS trace5. Modifying the appearance of the output

5.1. Changing font sizes using PROC TEMPLATE 5.2. Other ways to change the appearance of your output

5.2.1. Modifying the title in the table of contents and removing redundant items 5.2.2. Modifying the link in the table of contents

6. Drill-down HTML documents with SAS/GRAPH

All the examples here were produced using SAS Version 8.2.

1. Syntax

The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE, PROC FREQ, etc.) with the statements:

ods file specification options;

insert procedures here

ods file specification close;

1.1. Example

ods html file="Reports.html"

frame="ReportsFrame.html"

contents="ReportsContents.html"

style=ods.FixByContents;

ods rtf file="Reports.rtf";

Beginning TutorialsNESUG 16

Page 2: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

2

ods pdf body="Reports.pdf";

ods proclabel="Totals";

proc tabulate data=TestData format=8. contents="" missing;

by GID;

class CCollapsedID CID;

var A B C;

table (CCollapsedID="Collapsed CID" * (Center="CID" all="Total this CCollapsed" *

[style=[background=yellow]])) all="Total this GID" * [style=[background=cyan]],

(A="A" B="B" C="C") * sum="" / contents="";

run;

ods html close;

ods rtf close;

ods pdf close;

The ODS file specifications above send the output to HTML, PDF and RTF. The options specify a user defined style FixByContents. This example simultaneously produces three different file types for the PROC TABULATE specified.1 These statements will be covered in detail later. (See Section 5.3)

1. Example: An Enhanced Proc Report of Proc Tabulate

PROC REPORT or PROC TABULATE can be easily enhanced with highlighting. For example, we needed to know the total sales by country (and for Canada) as well as the average sales excluding Canada. The following code provides the report. The average is highlighted in cyan while the total for Canada is highlighted in yellow.

ods rtf file="Country.rtf";

ods html body = "Country.html";

proc report data=report nowindows;

column Country CName group sales94 sales95;

define Country /noprint;

define group /group noprint;

define CName /"Country" display;

define sales94 /"1994 sales" analysis format=comma8.;

define sales95 /"1995 sales" analysis format=comma8.;

compute Country;

if Country in ('CANADA') then call define (_row_,"style","style=[background=yellow]");

else if country="" then call define (_row_,"style","style=[background=cyan]");

endcomp;

run;

ods html close;

ods rtf close;

1 SAS Institute notes (SN-005481) the following when using the PDF destination for ODS: If ODS PRINTER or ODS PDF is used to create a .pdf file, the message 'file is damaged but is being repaired' may be generated in the Acrobat Reader when the file is opened by Adobe Acrobat Reader v.4 or higher. The message occurs because a .pdf file created by ODS PRINTER on the PC platforms contains an extraneous control linefeed character. The file is readable and diplays in Adobe's Acrobat Reader. When the file is closed, Reader will prompt the following "Do you want to save changes to FILE.pdf before closing? " (where FILE is the name of the file), if YES is chosen, the message will not appear the second time the file is opened.

My experience has been that this message is consistently generated regardless of the number of times the file is opened.

Beginning TutorialsNESUG 16

Page 3: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

3

Figure 1

With PROC REPORT, highlighting is achieved using the compute and endcomp block and a style specification, while for PROC TABULATE only a style specification is used (See Example 1.1).2

2.1. Why Use ODS?

Usually, when a programmer receives a request from an analyst, the SAS output that is produced can either be printed out and delivered to the analyst or the SAS listing can be e-mailed. The analyst can then look at the results and request further modifications if necessary. With the e-mail option comes the inevitable questions of how does one view the lst file and then how can one print it and when printing how would all the pages break correctly.

With the ODS RTF destination, the programmer can delegate the printing to the analyst assuming that everyone involved has MSWord or an RTF file viewer. RTF takes care of inserting page breaks and line breaks where appropriate.3 Another good alternative is the ODS PDF destination since the Acrobat Reader is commonly available.

3. Creating Excel Spreadsheets

MSExcel97 and above can read HTML files and the obvious solution would be to produce a HTML file to be read/opened by Excel and then to save it as an Excel workbook. The SAS Institute Tricks and Tips column suggests replacing the HTML extension of the ODS destination file with an XLS extension so that the output can be opened automatically by Excel since the XLS extension is registered to Excel.

When producing HTML files however, the size of the HTML file can become an issue. The default ODS specification produces a HTML file with greyed column and/or row header highlighting similar to Figure 1.4 To suppress the highlighting use the option style=minimal. This will result in a smaller HTML file.

3.1. Changing the default HTML output style

The following code example suppresses the highlighting using style=minimal. Figure 2 shows how it looks in Internet Explorer.

2 For more examples and excellent tutorials, see Haworth (2001, 2003a) and Slaughter and Delwiche (2001).

3 For tips on manipulating the RTF destination, see Hull (2001), Shannon (2002), Hamilton (2003).

4 The ODS HTML destination also uses the 3.2 tagset which allows for data and formatting to reside together instead of the 4.0 specification that separates formating from data. For more tips on creating Excel spreadsheets see Parker (2003).

Beginning TutorialsNESUG 16

Page 4: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

4

ods html body="\reports\ml_PPVTWabl_F_details.html"

style=minimal;

title2 "Details";

proc report data=all(where=(effect2^="")) nowindows missing;

column showgroup vartype effect2 model, (estimate Probt);

define model /"" across order=data;

define effect2 /"Parameters" group order=data;

define showgroup /group noprint;

define vartype /group noprint order=data;

define estimate /analysis;

define Probt/analysis;

break after showgroup /skip;

break after vartype /skip;

compute after showgroup;

line ' ';

endcomp;

compute before vartype;

length text $15;

if vartype="child" then text="Child Level";

else if vartype="prog" then text="Program Level";

else if vartype="class" then text="Class Level";

else text=" ";

line text $15.;

endcomp;

run;

ods html close;

Figure 2

Beginning TutorialsNESUG 16

Page 5: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

5

Figure 3 is an example of using the ODS output datasets to summarize the results of six proc mixed runs. PROC MIXED is an example of a statistical procedure that produces a lot of output, not all of which is always of interest to the analyst. The analyst specified the items of interest and the ODS output datasets that produced these items were selected. They were then concatenated to produce the above report. The analyst never had to look at the lst files -- only the resulting Excel spreadsheets, and could easily compare the results across different runs. The nice feature about using PROC REPORT with ODS HTML for this report is that the output will not wrap around as it might in a lst file5. The ODS Output statements used for each proc mixed run to obtain the relevant statistics for the report were6:

ods output covparms=ml_PPVTWabl_F _covparm;

ods output FitStatistics=ml_PPVTWabl_F _fitStat;

ods output solutionF=ml_PPVTWabl_F _solutionF;

ods output dimensions=ml_PPVTWabl_F _dimensions;

The resulting Excel spreadsheet is shown in Figure 3:

Figure 3

Note that when using the ODS HTML destination, the width of the cell in the first column will take on the width of the title (if there is a title statement) when converted to Excel. Experimental in Version 8.2 is ODS HTMLCSS that can be used to separate the title from the actual data.

5 If the ODS RTF destination were used however, the columns would wrap around.

6 This is the successor to the PROC MIXED specific statement of MAKE to produce the datasets containing the statistics of interest.

Beginning TutorialsNESUG 16

Page 6: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

6

ods htmlcss file="h:\My Documents\test.html"

stylesheet="h:\My Documents\test.css";

(procedure to produce output)

ods htmlcss close;

An alternative to using ODS to produce the same spreadsheet might have been to use DDE. This would require reshaping the dataset, and DDE does not preserve the formatting (unlike ODS).

Also experimental in Version 8.2 of SAS is the ODS CSV destination. The CSV destination does not preserve formatting. The syntax for the CSV destination is similar to the HTML destination, for instance:

ods csv file="h:\My Documents\testcsv.csv";

(procedure to produce output)

ods csv close;

4. Finding ODS objects (datasets) - using ODS trace

All SAS procedures produce their own ODS objects. Sometimes these are documented as in the PROC MIXED example above but sometimes they are not. To find out the the ODS objects that are produced in a procedure, the ods trace statement is used.

For instance,

ods trace on;

proc means data=sashelp.class;

run;

ods trace off;

produces the following statements in the SAS log:

The statements say that an output object named summary was created and has the label "Summary statistics" associated with it. The ODS trace statements also indicate the template that is used to format the output if we were to wrap ODS statements around the proc means. This template can be found in the template location base.summary. (More on templates in Section 5.) To use the summary object, it has to be saved to a dataset using the ods output statement referenced by its name (summary).

ods output summary=means_summary;

proc means data=sashelp.class;

run;

Alternatively, to be more explicit, the path of the object can be used.

Beginning TutorialsNESUG 16

Page 7: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

7

ods output Means.summary=means_summary;

proc means data=sashelp.class;

run;

The above code fragment saves the summary object into a dataset called means_summary. Note, however that this is not the same dataset that one would get using an out= statement.

5. Modifying the appearance of your output

Sometimes it may be necessary to modify the ODS template styles that ship with SAS7. To view the available templates, click on the Results tab on the left pane of the SAS Windows environment and right click on Results as shown in Figure 4 (or click on View and the select Templates).

Figure 4

Select Templates and the available templates will be shown as in Figure 5. The styles that ship with SAS are stored in sashelp.tmplmst. As can be seen, each SAS product (e.g. BASE, ETS), will usually have its own template folder. A template describes how the data will be formatted and presented.

7 Creating a new user defined template will not be covered. For an excellent tutorial, see Haworth (2003b).

Beginning TutorialsNESUG 16

Page 8: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

8

Figure 5

Click on Styles and the available styles definitions (or style templates) will be listed (Figure 6).8

Figure 6

8 A style definition describes the appearance of the output, e.g. fonts, colors, etc. while a table definition describes the structure of the table,

e.g. boxed tables, lines around cells, etc.

Beginning TutorialsNESUG 16

Page 9: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

9

Double click on Default and a window with the definitions for the default template will open. (Figure 7)

Figure 7

In the ODS trace example in section 4, the template used for proc means is the item labeled as template which was base.summary. The location of this template is shown in Figure 8.

Figure 8

Beginning TutorialsNESUG 16

Page 10: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

10

You can use PROC TEMPLATE to modify the existing styles. Some examples are provided below.

5.1. Changing font sizes using PROC TEMPLATE

The following code modifies the default template to create a new template but with smaller fonts.

libname newtemp "\programs";

proc template;

define style Ods.Smallfonts / store = newtemp.TEMPLAT;

parent = styles.default;

replace fonts /

'docFont' = ("Arial, Helvetica, Helv",2)

'headingFont' = ("Arial, Helvetica, Helv",3,Bold)

'headingEmphasisFont' = ("Arial, Helvetica, Helv",3,Bold Italic)

'FixedFont' = ("Courier",1)

'BatchFixedFont' = ("SAS Monospace, Courier",1)

'FixedHeadingFont' = ("Courier",1)

'FixedStrongFont' = ("Courier",1,Bold)

'FixedEmphasisFont' = ("Courier",1,Italic)

'EmphasisFont' = ("Arial, Helvetica, Helv",2,Italic)

'StrongFont' = ("Arial, Helvetica, Helv",3,Bold)

'TitleFont' = ("Arial, Helvetica, Helv",4,Bold Italic)

'TitleFont2' = ("Arial, Helvetica, Helv",3,Bold Italic);

end;

run;

The difference between the default font size and the above code can be seen by comparing Figure 7 with the above. All the font sizes were reduced by 1.

The new template is called smallfonts and is stored in a new folder called ods. By default, all user defined templates will be saved in the the template store called sasuser.templat. A template store is a specific type of SAS file where all the template definitions are kept. The folder ods will be created automatically under the store sasuser.templat. A copy of the template called templat will also be stored in the libref defined by newtemp using the keyword store. This is so that other users can access this template. All templates created and stored in sasuser.templat can only be accessed by the creator of the template. The new template, smallfonts uses as its "parent" style the default, in other words, it inherits all the properties defined by the default style. The keyword replace is used to replace the fonts with the new fonts. All other styles defined by the parent are unchanged.

Figure 9 shows the results of creating several templates. We will use the style template smallfonts in Section 5.2.1.

Figure 9

Beginning TutorialsNESUG 16

Page 11: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

11

5.2. Other ways to change the appearance of your output

We are going to modify the appearance of PROC TABULATE using the example in Section 1.1. We will be working exclusively with the HTML destination although some of the changes will carry over into the RTF and PDF destinations9. Consider the default appearance when run with the following code:

ods html file="Reports.html"

frame="Reportsframe.html"

contents="Reportscontents.html";

ods rtf file="Reports.rtf";

ods pdf body="Reports.pdf";

proc tabulate data=TestData format=8. missing;

by GID;

class CCollapsedID CID;

var A B C;

table (CCollapsedID="CCollapsedID" * (CID="CID" all="Total this CCollapsedID" *

[style=[background=yellow]])) all="Total this GID" * [style=[background=cyan]],

(A="A" B="B" C="C") * sum="";

run;

ods html close;

ods rtf close; ods pdf close;

The HTML destination will produce a navigable frame with the name Reportsframe.html along with the contents for the frame in Reportscontents.html, while the body of the report will be in Reports.html. Double clicking on Reportsframe.html brings up the following screen in Internet Explorer. (Figure 10)

Note that hyperlinks are underlined (and labelled as Table 1) in the Table of Contents frame. Clicking anywhere on the grantee name or the phrase "cross-tabular summary report" collapses/expands the related item. Also note that the RTF destination does not produce a navigable frame whereas the PDF destination does.

Next we will focus on modifying the Table of Contents frame. In particular we will build on the smallfontstemplate that was created earlier. Not all modifications occur through PROC TEMPLATE. The changes that we want to make are as follows:

• Instead of having the procedure be the title on the contents e.g. "The Tabulate Procedure" we want a title. • The item under GID labeled "cross-tabular summary report" is redundant and is to be deleted. • The clickable item labeled "Table 1" is redundant and is to be deleted. • Instead of navigating by clicking on "Table 1", we would like to be able to click on GID instead.

9 Beware that there are differences in presentation among different ODS destinations. One of these is color. Some colors will give a greenish

hue in PDF but not in HTML. See Sas Notes SN-005510 and SN-007525.

Beginning TutorialsNESUG 16

Page 12: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

12

Figure 10

5.2.1. Modifying the title in the table of contents and removing redundant items

A new title is assigned to the output using the ods proclabel statement10. The redundant item under grantee labeled "cross-tabular summary" can be removed by specifying contents="" in the options for PROC TABULATE. These changes are highlighted in grey.

ods html file="Reports.html"

frame="Reportsframe.html"

contents="Reportscontents.html"

style=ods.smallfonts;

ods rtf file="Reports.rtf";

ods pdf body="Reports.pdf";

ods proclabel="Totals by GID/CID";

proc tabulate data=TestData format=8. contents="" missing;

by GID;

class CCollapsedID CID;

var A B C;

table (CCollapsedID="CCollapsedID"*(CID="CID" all="Total this

CCollapsedID"*[style=[background=yellow]] )) all="Total this GID"*[style=[background=cyan]],

(A="A" B="B" C="C")*sum="";

10 Available for the first time in Version 8.2 of SAS.

Beginning TutorialsNESUG 16

Page 13: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

13

run;

ods html close;

ods rtf close;

ods pdf close;

The results of the modifications are shown in Figure 11.

Figure 11

5.2.2. Modifying the link in the table of contents

Now the clickable item labeled as "Table 1" will be removed and GID will be made clickable instead. The item labeled as "Table 1" is removed by specifying contents="" in the table statement of PROC TABULATE. In order to make GID clickable the template will have to be modified. The smallfonts template will be used as the parent.

proc template;

define style ods.ByContents;

parent=ods.smallfonts;

style bycontentfolder from bycontentfolder /

listentryanchor=yes

posthtml='<br>';

end;

run;

The template item bycontentfolder is modified by changing the listentryanchor item from no to yes. A posthtml item is added and assigned the HTML tag <br>. This produces a new line between GIDs.

The code to use these modifications is:

Beginning TutorialsNESUG 16

Page 14: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

14

ods html file="Reports.html"

frame="Reportsframe.html"

contents="Reportscontents.html"

style=ods.ByContents;

ods rtf file="Reports.rtf";

ods pdf body="Reports.pdf";

ods proclabel="Totals by GID/CID";

proc tabulate data=TestData format=8. contents="" missing;

by GID;

class CCollapsedID CID;

var A B C;

table (CCollapsedID="CCollapsedID"*(CID="CID" all="Total this

CCollapsedID"*[style=[background=yellow]] )) all="Total this GID"*[style=[background=cyan]],

(A="A" B="B" C="C")*sum="" / contents="";

run;

ods html close;

ods rtf close;

ods pdf close;

The finished output is shown in Figure 12.11

Figure 12

11 Similar modifications can also be made to the PDF destination. See Delaney (2003).

Beginning TutorialsNESUG 16

Page 15: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

15

6. Drill-down HTML documents with SAS/GRAPH

Using a combination of SAS/GRAPH and ODS it is possible to generate a drill down HTML document. When producing the relevant files for a drill-down document, the programmer has the option of producing separate files for each level or creating HTML anchors within one large document. SAS creates anchors automatically by numbering them -- the convention is that the first anchor is not suffixed but the rest of them are suffixed consecutively beginning with 1.

This example uses a combination of both methods and gif files for the charts. The topmost level is an overview of Sampling Activity (See Figure 13). Clicking on any of the vertical bars will bring the user to another chart that further breaks down Sampling Activity. For instance, in Figure 13, the mouse over the horizontal axis labeled "61-90 days ago" points to a file that further breaks down sampling activity for days 61 through 90 (if any) on a day-by-day basis. (See Figure 14) Alternatively, a user could also navigate to the day-by-day charts using the left frame. Clicking on GID 14916 on the horizontal axis will bring the user to a detailed report for that grantee. (See Figure 15) The programmer can also provide links in the legend. For instance, clicking on the legend from the topmost level (Figure 13), would bring the user to a summary report (not shown).

Figure 13

Beginning TutorialsNESUG 16

Page 16: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

16

Figure 14

Figure 15

8. Conclusion

SAS output can easily be enhanced using ODS. This paper showed how basic ODS statements can enhance output from PROC Report. Then, using PROC Template and other ODS statements it demonstrated the steps required to make changes to the appearance of the output. Simple modifications such as changing font sizes and modifying the title and links in the table of contents of a HTML destination were illustrated.

Beginning TutorialsNESUG 16

Page 17: NESUG 16 Beginning Tutorials1. Syntax The basic syntax for using ODS is straightforward. Simply wrap the output that is to be produced from a PROC (e.g. PROC PRINT, PROC TABULATE,

17

DISCLAIMER: The contents of this paper is the work of the author and does not necessarily represent the opinions, recommendations, or practices of Westat

9. References

1. http://support.sas.com/rnd/base/index-ods-resources.html. This page is the starting point for a list of resources on ODS.

2. http://support.sas.com/rnd/base/topics/templateFAQ/Template.html. This page provides links to various questions on PROC TEMPLATE.

3. http://support.sas.com/rnd/base/topics/templateFAQ/Template_rtf.html. This page is an excellent resource on the RTF destination.

4. Kevin P. Delaney (2003) ODS PDF: It’s not just for printing anymore, Proceedings of the 28th Annual SAS Users Group International Conference. SAS Institute, Cary, NC.

5. Paul Hamilton (2003) ODS to RTF: Tips and Tricks, Proceedings of the 28th Annual SAS Users Group International Conference. SAS Institute, Cary, NC.

6. Lauren Haworth (2001) ODS for PRINT, REPORT and TABULATE, Proceedings of the 26th Annual SAS Users Group International Conference. SAS Institute, Cary, NC.

7. Lauren Haworth (2003a) SAS Reporting 101: REPORT, TABULATE, ODS and Microsoft Office, Proceedings of the 28th Annual SAS Users Group International Conference. SAS Institute, Cary, NC.

8. Laurent Haworth (2003b) SAS with Style: Creating your own ODS Style Templates Proceedings of the 28th

Annual SAS Users Group International Conference. SAS Institute, Cary, NC. 9. Bob Hull (2001) Now There Is An Easy Way to Get to Word, Just Use PROC TEMPLATE, PROC REPORT,

and ODS RTF, Proceedings of the 26th Annual SAS Users Group International Conference. SAS Institute, Cary, NC.

10. Chevell Parker (2003) Generating Custom Excel Spreadsheets Using ODS, Proceedings of the 28th Annual SAS Users Group International Conference. SAS Institute, Cary, NC.

11. David Shannon (2002) To ODS RTF and Beyond, Proceedings of the 27th Annual SAS Users Group International Conference. SAS Institute, Cary, NC.

12. Susan J. Slaughter and Lora D. Delwiche (2001) ODS for Reporting With Style, Proceedings of the 26th

Annual SAS Users Group International Conference. SAS Institute, Cary, NC.

Acknowledgements

I am grateful to Mike Rhoads for detailed comments. All errors and omissions are mine.

Author Contact Information

Ban Chuan Cheah Westat 1650 Research Blvd. Rockville, MD 20850 [email protected]

SAS® and all other SAS Institute Inc. products or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration. Other brand and product names are registered trademark or trademarks of their respective countries.

Beginning TutorialsNESUG 16