BASUG June Meeting + Training (In Person!)
Fri, Jun 27
|Microsoft NERD
Morning meeting with three SAS 9 presentations by three SAS gurus. Afternoon training class by Troy Martin Hughes. Pre-registration by June 24 is required. No on-site registration or walk-ins.
Time & Location
Jun 27, 2025, 8:15 AM – 5:00 PM EDT
Microsoft NERD, 1 Memorial Dr, Cambridge, MA 02142, USA
BASUG is thrilled to announce our IN-PERSON June Meeting + Training Class!
Be sure to click "Read More" to view the full description of both the morning meeting and afternoon training class (separate ticketed events).
Pre-registration by June 24 is required. No on-site registration or walk-ins.
BASUG welcomes students with a 50% discount if they register by Friday, June 13. Please email an image of your current student ID to registrations@basug.org to request the coupon code.
Thank you to Microsoft for providing tech non-profits with access to the beautiful NERD facilities.
MORNING MEETING (8:15am - 12:00pm)
Code Hard and Put away Wet: Replacing Hardcoded SAS® Software Quality Checks with Data-Driven Design and Defensive Programming Techniques That Validate Code and Control Data
Troy Martin Hughes
You wouldn’t ride that pony hard and put her away wet, so why subject your SAS® software to the same ill treatment?! Defensive programming describes a risk management strategy that aims to identify threats to software functionality and/or performance before they occur and, where possible, to identify pathways to programmatically mitigate those risks (or to communicate realized threats to stakeholders). This talk introduces various defensive programming techniques that can be implemented before software executes, such as verifying SAS program file state (i.e., availability, accessibility) and program file metadata (e.g., filename, checksum, create date, version). Data-driven software design further espouses the reality that “software” comprises not only code but also the underlying control data that drive that code’s functionality and flexibility. Thus, defensive data-driven design requires a fuller risk management strategy that evaluates risks not only to code but also to control data, including lookup tables, control tables, configuration files, and other control files. Finally, although not considered to be “software,” domain data sets and other data sources can be no less essential to ensuring software success, so the state and quality of these transactional data can be evaluated as well. Given this more expansive view, this talk further demonstrates defensive programming techniques that evaluate the state and metadata of required input data, be they SAS data sets, spreadsheets, CSV files, XML, JSON, or other interoperable formats. Defensive programming methods should be implemented where robust software must execute reliably, and data-driven software should be designed to incorporate these best practices.
The (ODS) Output of Your Desires: Creating Designer Reports and Data Sets
Louise Hadden
SAS® procedures can convey an enormous amount of information – sometimes more information than is needed. Most SAS procedures generate ODS objects behind the scenes. SAS uses these objects with style templates that have custom buckets for certain types of output to produce the output that we see in all destinations (including the SAS listing). By tracing output objects and ODS templates using ODS TRACE (DOM) and by manipulating procedural output and ODS OUTPUT objects, we can pick and choose just the information that we want to see. We can then harness the power of SAS data management and reporting procedures to coalesce the information collected and present the information accurately and attractively.
Beyond Labels: Mastering PROC FORMAT for Dynamic, Scalable SAS Programming
Michael Salé
PROC FORMAT is one of SAS’s most powerful yet underrated tools, capable of transforming how you label, categorize, and analyze your data. This in-depth session will explore the full breadth of PROC FORMAT, from simple value-label mappings to advanced techniques like dynamic format creation using CNTLIN datasets and multi-label classification for overlapping categories. We'll dive into the use of PICTURE formats for elegant numeric and date display, discuss strategies for maintaining and sharing format catalogs, and examine performance and debugging tips to keep your code clean and efficient. Whether you're building a reusable reporting framework or customizing output for diverse audiences, this session will show you how mastering PROC FORMAT can bring clarity, consistency, and scalability to your SAS programs.
AFTERNOON TRAINING CLASS (1:00pm - 5:00pm)
How to Build User-Defined FCMP Functions and Macro Functions
by Troy Martin Hughes

SAS “User-defined” functions are those functions that are created by SAS users, as contrasted with “built-in” functions that are part of out-of-the-box Base SAS functionality. SAS provides two methods to build user-defined functions, including the SAS macro language and the SAS Function Compiler (aka PROC FCMP). This introductory course demonstrates how to build user-defined functions (and subroutines)—including both macro functions and FCMP functions. No prior experience with the SAS macro language or PROC FCMP syntax is required.
User-defined functions improve software reusability—that is, the ability of code modules to be reused in future software projects, and to be reused by multiple SAS users within a team or organization. Reusability enables a function to be developed once but used repeatedly, which reduces the workload of the SAS users who are writing programs, by enabling us to rely on previously built (and fully tested) code modules. Thus, user-defined functions facilitate more flexible and configurable software, as well as a more productive, efficient team.
This lecture-style class (NOT hands on) provides an introduction to writing functions with both PROC FCMP and the SAS macro language.
FCMP function topics comprise approximately 2/3 of the course, and include:
Gentle introduction to PROC FCMP syntax and the construction of user-defined functions and subroutines (with the FUNCTION and SUBROUTINE statements)
Use of OUTARGS option to modify multiple arguments (within the calling program)
Passing character and numeric data types to functions
Passing arrays to functions, and utilizing arrays within functions
Declaring, initializing, and referencing hash objects within functions
Calling functions and subroutines from the DATA step, and from %SYSFUNC and %SYSCALL
Calling functions from PROC FORMAT
Macro function topics comprise approximately 1/3 of the course, and include:
Gentle introduction to the SAS macro language, including differentiation between SAS macros and SAS macro functions
Differentiation between positional and keyword parameters
Defining optional parameters and default parameter values
Passing macro lists and two-dimensional data structures to functions
Macro function argument validation, exception handling, and use of global macro variables as return values and return codes
Schedule
8:15 AM - 9:00 AM Registration / Breakfast
9:00 AM - 12:00 PM Meeting
12:00 PM - 1 :00 PM Lunch
1:00 PM - 5:00 PM Training Class