SURVIVING THE SAS MACRO JUNGLE BY USING YOUR OWN PROGRAMMING TOOLKIT

Similar documents
Surviving the SAS Macro Jungle by Using Your Own Programming Toolkit Kevin Russell, SAS Institute Inc., Cary, North Carolina

Foundations and Fundamentals. SAS System Options: The True Heroes of Macro Debugging Kevin Russell and Russ Tyndall, SAS Institute Inc.

Debugging. Where to start? John Ladds, SAS Technology Center, Statistics Canada.

DSCI 325: Handout 15 Introduction to SAS Macro Programming Spring 2017

Storing and Reusing Macros

Tired of CALL EXECUTE? Try DOSUBL

Simplifying Your %DO Loop with CALL EXECUTE Arthur Li, City of Hope National Medical Center, Duarte, CA

SAS Macro. SAS Training Courses. Amadeus Software Ltd

New Macro Features Added in SAS 9.3 and SAS 9.4

title1 "Visits at &string1"; proc print data=hospitalvisits; where sitecode="&string1";

Program Validation: Logging the Log

How Do I.? Some Beginners FAQs. Peter Eberhardt, Fernwood Consulting Group Inc. Toronto, Canada Audrey Yeo, Athene USA, West Des Moines, IA

Working the System: Our Best SAS Options Patrick Thornton, SRI International, Menlo Park, CA Iuliana Barbalau, Adecco, Pleasanton, CA

Efficiency Programming with Macro Variable Arrays

SAS 9 Programming Enhancements Marje Fecht, Prowerk Consulting Ltd Mississauga, Ontario, Canada

Unlock SAS Code Automation with the Power of Macros

A Time Saver for All: A SAS Toolbox Philip Jou, Baylor University, Waco, TX

Base and Advance SAS

An Introduction to Macros Deb Cassidy

Macros are a block of code that can be executed/called on demand

Macro Bugs - How to Create, Avoid and Destroy Them Ian Whitlock, Kennett Square, PA

Functions vs. Macros: A Comparison and Summary

GET A GRIP ON MACROS IN JUST 50 MINUTES! Arthur Li, City of Hope Comprehensive Cancer Center, Duarte, CA

Why & How To Use SAS Macro Language: Easy Ways To Get More Value & Power from Your SAS Software Tools

A Tutorial on the SAS Macro Language

Protecting Macros and Macro Variables: It Is All About Control

Sunoco Global Full Synthetic ATF

SAS Macro Language: Reference

Advanced Macro Topics Steven First, Systems Seminar Consultants, Madison, WI

Seminar Series: CTSI Presents

Sandra Hendren Health Data Institute

Submitting SAS Code On The Side

More About SAS Macros

Get Started Writing SAS Macros Luisa Hartman, Jane Liao, Merck Sharp & Dohme Corp.

Understanding the Concepts and Features of Macro Programming 1

Copy That! Using SAS to Create Directories and Duplicate Files

AN INTRODUCTION TO MACRO VARIABLES AND MACRO PROGRAMS Mike Zdeb, School of Public Health

SAS Institute Exam A SAS Advanced Programming Version: 6.0 [ Total Questions: 184 ]

Autocall Macros A Quick Overview

Introduction. Getting Started with the Macro Facility CHAPTER 1

Going Under the Hood: How Does the Macro Processor Really Work?

SAS Macro Programming Tips and Techniques

Job Security: Using the SAS Macro Language to Full Advantage

Macro Basics. Introduction. Defining and Using Macro Variables. Defining and Using Macros. Macro Parameters. Part 1. Chapter 1. Chapter 2.

PharmaSUG Paper TT03. Kirk Paul Lafler, Software Intelligence Corporation, Spring Valley, California

SAS Certification Handout #11: Adv. Prog. Ch. 9-10

Macro Language Dictionary

SAS Macro Dynamics - From Simple Basics to Powerful Invocations Rick Andrews, Office of the Actuary, CMS, Baltimore, MD

CONQUERING THE DREADED MACRO ERROR

Validation Summary using SYSINFO

Paper CC16. William E Benjamin Jr, Owl Computer Consultancy LLC, Phoenix, AZ

1 Files to download. 3 Macro to list the highest and lowest N data values. 2 Reading in the example data file

Jeff Phillips, ARC Professional Services Group Veronica Walgamotte, ARC Professional Services Group Derek Drummond, ARC Professional Services Group

SAS CURRICULUM. BASE SAS Introduction

Logging the Log Magic: Pulling the Rabbit out of the Hat

Acknowledgments xi Preface xiii About the Author xv About This Book xvii New in the Macro Language xxi

1. INTRODUCTION DTD-CODE USER GUIDE

Using SAS/SCL to Create Flexible Programs... A Super-Sized Macro Ellen Michaliszyn, College of American Pathologists, Northfield, IL

From Carpenter's Complete Guide to the SAS Macro Language, Third Edition. Full book available for purchase here.

Macros from Beginning to Mend A Simple and Practical Approach to the SAS Macro Facility

Tales from the Help Desk 5: Yet More Solutions for Common SAS Mistakes Bruce Gilsen, Federal Reserve Board

Your Own SAS Macros Are as Powerful as You Are Ingenious

A Quick and Gentle Introduction to PROC SQL

The SAS Interface to REXX

The REPORT Procedure: A Primer for the Compute Block

SAS Windowing environment Tips and Tricks

A Macro To Generate a Study Report Hany Aboutaleb, Biogen Idec, Cambridge, MA

Introduction to the SAS Macro Facility

STAT:5400 Computing in Statistics. Other software packages. Microsoft Excel spreadsheet very convenient for entering data in flatfile

Developing Data-Driven SAS Programs Using Proc Contents

Sample Questions. SAS Advanced Programming for SAS 9. Question 1. Question 2

Macro Magic III. SNUG Presentation (30mins)

Precision Tec Diagnostics PO Box 2431 Cartersville, GA

A SAS Macro for Producing Benchmarks for Interpreting School Effect Sizes

PharmaSUG Paper TT11

Reprogram Vehicles Using The EASE Universal Reprogrammer II+ & Your PC

PLA YING WITH MACROS: TAKE THE WORK OUT OF LEARNING TO DO MACROS. Arthur L. Carpenter

SAS Macro Dynamics: from Simple Basics to Powerful Invocations Rick Andrews, Office of Research, Development, and Information, Baltimore, MD

STATION

The Power of PROC SQL Techniques and SAS Dictionary Tables in Handling Data

-----~--- --~c: he what, when, and why-of SAS macros. Overview. Macro variables. ~le 1- I only need one chin&f to run the same program for Math

The %let is a Macro command, which sets a macro variable to the value specified.

&&&, ;;, and Other Hieroglyphics Advanced Macro Topics Chris Yindra, C. Y. Training Associates

Introduction. Keeping Efficiency in Perspective. CHAPTER 11 Writing Efficient and Portable Macros

Using a Control Dataset to Manage Production Compiled Macro Library Curtis E. Reid, Bureau of Labor Statistics, Washington, DC

How to use UNIX commands in SAS code to read SAS logs

Internet, Intranets, and The Web

Macro Internals for the User Developer s Overview. Susan O Connor, SAS Institute Inc., Cary, NC

SAS 101. Based on Learning SAS by Example: A Programmer s Guide Chapter 21, 22, & 23. By Tasha Chapman, Oregon Health Authority

MOBILE MACROS GET UP TO SPEED SOMEWHERE NEW FAST Author: Patricia Hettinger, Data Analyst Consultant Oakbrook Terrace, IL

Using SAS Macro to Include Statistics Output in Clinical Trial Summary Table

Macro Architecture in Pictures Mark Tabladillo PhD, marktab Consulting, Atlanta, GA Associate Faculty, University of Phoenix

The Three I s of SAS Log Messages, IMPORTANT, INTERESTING, and IRRELEVANT William E Benjamin Jr, Owl Computer Consultancy, LLC, Phoenix AZ.

Top-Down Programming with SAS Macros Edward Heaton, Westat, Rockville, MD

Paper SBC-121. %* include start of macro code. %put --- Start of %upcase(&sysmacroname) macro;

Demystifying Inherited Programs

Index. Purchase this book at

PASS4TEST. IT Certification Guaranteed, The Easy Way! We offer free update service for one year

ABSTRACT INTRODUCTION THE GENERAL FORM AND SIMPLE CODE

ABSTRACT INTRODUCTION MACRO. Paper RF

Transcription:

PharmaSUG 2016 Paper BB11 SURVIVING THE SAS MACRO JUNGLE BY USING YOUR OWN PROGRAMMING TOOLKIT KEVIN RUSSELL

Photo credit: Geoff Gallice / CC by 2.0

TOOLS FOR YOUR MACRO PROGRAMMING TOOLKIT The DOSUBL function The stored compiled macro facility Macro debugging system options The CALL SYMPUTX routine Using comments within a macro definition 3

TOOLS FOR YOUR MACRO PROGRAMMING TOOLKIT (continued) The %PUT statement The MFILE system option Read-only macro variables The macro IN operator SASHELP.VMACRO 4

DOSUBL FUNCTION: OVERVIEW Provides you with the ability to move macro variables to and from the calling environment Syntax DOSUBL( x) 5

DOSUBL FUNCTION: ABILITIES Like CALL EXECUTE, DOSUBL gives you the ability to do two things: conditionally execute a macro based on DATA step logic pass in a data set variable s value as the value for a macro parameter DOSUBL gives you the added ability to do the following: import macro variables from and then export macro variables to the calling environment 6

DOSUBL FUNCTION: EXAMPLE 1 CODE %macro tryit(x); %global mymac; data _null_; if &x=1 then mymac=2; else mymac=3; call symputx('mymac', mymac); run; %mend; %let mymac=4; data _null_; rc=dosubl('%tryit(1)'); x=symget('mymac'); put x= '(should be 2)'; run; 7

DOSUBL FUNCTION: EXAMPLE 1 LOG OUTPUT 687 %let mymac=4; 688 data _null_; 689 rc=dosubl('%tryit(1)'); 690 x=symget('mymac'); 691 put x= '(should be 2)'; 692 run; MLOGIC(TRYIT): Beginning execution. MLOGIC(TRYIT): Parameter X has value 1 MLOGIC(TRYIT): %GLOBAL MYMAC MPRINT(TRYIT): data _null_; SYMBOLGEN: Macro variable X resolves to 1 MPRINT(TRYIT): if 1=1 then mymac=2; MPRINT(TRYIT): else mymac=3; MPRINT(TRYIT): call symputx('mymac', mymac); MPRINT(TRYIT): run; NOTE: DATA statement used (Total process time): real time 0.01 seconds cpu time 0.00 seconds MLOGIC(TRYIT): Ending execution. x=2 (should be 2) 8

DOSUBL FUNCTION (continued) if first.id then do; %tryit(x) end; if first.id then do; rc=dosubl(cats( %tryit(,x, ) )); end; 9

DOSUBL FUNCTION: EXAMPLE 2 CODE %macro mymac(hosp_id); title "Data for hospital: &hosp_id"; proc report data=hospitals(where=(hospital_id="&hosp_id")); column hospital_id quarter number_of_patients; define hospital_id / order; run; %mend; data _null_; set hospitals; by hospital_id; if first.hospital_id then do; rc=dosubl(cats('%mymac(',hospital_id,')')); end; run; Macro invocation passed to DOSUBL: %mymac(a100) 10

DOSUBL FUNCTION: EXAMPLE 2 OUTPUT 11

STORED COMPILED MACRO FACILITY: OVERVIEW Compiles macros only once, which saves time with later executions Saves compiled macros in a library that you specify Protects your source code 12

STORED COMPILED MACRO FACILITY: OVERVIEW (continued) The compiled macro is stored in an unreadable machine language The macro cannot be decompiled after it is compiled %MACRO statement option, SECURE 13

STORED COMPILED MACRO FACILITY: EXAMPLE 1 CODE options mprint mlogic; %macro test; %if %sysfunc(exist(work.new))=0 %then %do; data new; set sashelp.cars; run; proc freq data=new; tables make*model / out=outfreq; run; proc print data=outfreq; run; %end; %mend; %test 14

STORED COMPILED MACRO FACILITY: EXAMPLE 1 LOG OUTPUT MLOGIC(TEST): Beginning execution. MLOGIC(TEST): %IF condition %sysfunc(exist(work.new))=0 is TRUE MPRINT(TEST): data new; MPRINT(TEST): set sashelp.cars; MPRINT(TEST): run; NOTE: There were 428 observations read from the data set SASHELP.CARS. NOTE: The data set WORK.NEW has 428 observations and 15 variables. NOTE: DATA statement used (Total process time): real time 0.12 seconds cpu time 0.04 seconds MPRINT(TEST): proc freq data=new; MPRINT(TEST): tables make*model / out=outfreq; MPRINT(TEST): run; NOTE: There were 428 observations read from the data set WORK.NEW. NOTE: The data set WORK.OUTFREQ has 425 observations and 4 variables. NOTE: PROCEDURE FREQ used (Total process time): real time 11.24 seconds cpu time 10.96 seconds MPRINT(TEST): proc print data=outfreq; MPRINT(TEST): run; NOTE: There were 425 observations read from the data set WORK.OUTFREQ. NOTE: PROCEDURE PRINT used (Total process time): real time 0.28 seconds cpu time 0.28 seconds MLOGIC(TEST): Ending execution.

STORED COMPILED MACRO FACILITY: EXAMPLE 2 CODE libname mylib 'c:\dstep\compiled'; options mstored sasmstore=mylib; %macro mytest/store secure; 16

STORED COMPILED MACRO FACILITY: EXAMPLE 3 Code: %mytest Log Output: NOTE: There were 428 observations read from the data set SASHELP.CARS. NOTE: The data set WORK.NEW has 428 observations and 15 variables. NOTE: DATA statement used (Total process time): real time 0.04 seconds cpu time 0.01 seconds NOTE: There were 428 observations read from the data set WORK.NEW. NOTE: The data set WORK.OUTFREQ has 425 observations and 4 variables. NOTE: PROCEDURE FREQ used (Total process time): real time 10.10 seconds cpu time 10.06 seconds NOTE: There were 425 observations read from the data set WORK.OUTFREQ. NOTE: PROCEDURE PRINT used (Total process time): real time 0.21 seconds cpu time 0.21 seconds 17

MACRO DEBUGGING SYSTEM OPTIONS: OVERVIEW SYMBOLGEN MPRINT MLOGIC 18

MACRO DEBUGGING SYSTEM OPTIONS: SYMBOLGEN Writes out the resolved value of a macro variable each time it is referenced (in the SAS log) SYMBOLGEN: Macro variable X resolves to 1 19

MACRO DEBUGGING SYSTEM OPTIONS: MPRINT Writes out all the non-macro SAS statements generated by macro execution (in the SAS log) MPRINT(TEST): proc print data=sashelp.cars; MPRINT(TEST): run; 20

MACRO DEBUGGING SYSTEM OPTIONS: MLOGIC Writes out important information about the macro s execution 718 %macro test(x); 719 %let newx=%eval(&x+1); 720 %if &newx<10 %then %put Hello; 721 %mend; 722 723 options mlogic; 724 %test(5) MLOGIC(TEST): Beginning execution. MLOGIC(TEST): Parameter X has value 5 MLOGIC(TEST): %LET (variable name is NEWX) MLOGIC(TEST): %IF condition &newx<10 is TRUE MLOGIC(TEST): %PUT Hello Hello MLOGIC(TEST): Ending execution. 21

MACRO DEBUGGING SYSTEM OPTIONS: EXAMPLE CODE Options mautosource sasautos=('c:\dstep') nosymbolgen nomprint nomlogic; %macro test; %keepnums(sashelp.cars) %mend; %test 22

MACRO DEBUGGING SYSTEM OPTIONS: EXAMPLE LOG OUTPUT options mautosource sasautos=('c:\dstep') NOsymbolgen NOmprint NOmlogic ; 58 59 %macro test; 60 %keepnums(sashelp.cars) 61 62 %mend; 63 %test NOTE: There were 428 observations read from the data set SASHELP.CARS. NOTE: DATA statement used (Total process time): real time 0.73 seconds cpu time 0.73 seconds ERROR: "MSRPINVOICEENGINESIZECYLINDERSHORSEPOWERMPG_CITYMPG_HIGHWAYWEIGHTWHEELBASELENGTH" contains more than 32 characters. NOTE: The SAS System stopped processing this step because of errors. NOTE: PROCEDURE PRINT used (Total process time): real time 0.00 seconds cpu time 0.00 seconds 23

MACRO DEBUGGING SYSTEM OPTIONS: EXAMPLE LOG OUTPUT MLOGIC(TEST): Beginning execution. MLOGIC(KEEPNUMS): Beginning execution. MLOGIC(KEEPNUMS): This macro was compiled from the autocall file c:\dstep\keepnums.sas MLOGIC(KEEPNUMS): Parameter DSN has value sashelp.cars MPRINT(KEEPNUMS): data _null_; SYMBOLGEN: Macro variable DSN resolves to sashelp.cars MPRINT(KEEPNUMS): set sashelp.cars; MPRINT(KEEPNUMS): length numnames $ 32767 name $ 32; MPRINT(KEEPNUMS): array nums(*) _numeric_; MPRINT(KEEPNUMS): do i=1 to dim(nums); MPRINT(KEEPNUMS): call vname(nums(i),name); MPRINT(KEEPNUMS): if name ne 'I' then numnames=cats(numnames,name); MPRINT(KEEPNUMS): call symputx('numnames',numnames); MPRINT(KEEPNUMS): end; MPRINT(KEEPNUMS): run; NOTE: There were 428 observations read from the data set SASHELP.CARS. NOTE: DATA statement used (Total process time): real time 1.25 seconds cpu time 0.93 seconds SYMBOLGEN: Macro variable DSN resolves to sashelp.cars MPRINT(KEEPNUMS): proc print data=sashelp.cars; SYMBOLGEN: Macro variable NUMNAMES resolves to MSRPInvoiceEngineSizeCylindersHorsepowerMPG_CityMPG_Hi ghwayweightwheelbaselength ERROR: "MSRPINVOICEENGINESIZECYLINDERSHORSEPOWERMPG_CITYMPG_H IGHWAYWEIGHTWHEELBASELENGTH" contains more than 32 characters. MPRINT(KEEPNUMS): var MSRPInvoiceEngineSizeCylindersHorsepowerMPG_CityMPG_Hi ghwayweightwheelbaselength; MPRINT(KEEPNUMS): run; NOTE: The SAS System stopped processing this step because of errors. 24

CALL SYMPUTX ROUTINE: OVERVIEW Includes all the functionality of the CALL SYMPUT routine with a few improvements Syntax CALL SYMPUTX(macro-variable,value<,symbol-table>); 25

CALL SYMPUT ROUTINE: EXAMPLE 1 CODE data total; set sales_data end=last; total_sales+sales; if last then call symput("total_sales",strip(total_sales)); run; %put &=total_sales; TOTAL_SALES=17240 proc print data=total; title "Total sales for this region: $&total_sales"; run; 26

CALL SYMPUTX ROUTINE: TWO MOST USEFUL IMPROVEMENTS Left-justifies arguments and trims any resulting trailing blanks Gives you the ability to specify which symbol table the macro variable is stored in 27

CALL SYMPUT ROUTINE: EXAMPLE 1 CODE (continued) data total; set sales_data end=last; total_sales+sales; if last then call symput("total_sales",strip(total_sales)); run;

CALL SYMPUT ROUTINE: EXAMPLE 2 CODE data total; set sales_data end=last; total_sales+sales; if last then call symput("total_sales",total_sales); run; proc print data=total; title "Total sales for this region: $&total_sales"; run; 29

CALL SYMPUTX ROUTINE: IF STATEMENT if last then call symputx("total_sales",total_sales); 30

CALL SYMPUTX ROUTINE: EXAMPLE CALL ROUTINE %global x; call symputx(cats('var',_n_),x,'g'); 31

CALL SYMPUTX ROUTINE: OPTIONAL ARGUMENTS call symputx('x',x,'g'); G: specifies the global symbol table L: specifies the most local symbol table that exists 32

CALL SYMPUTX ROUTINE: EXAMPLE 3 call symputx(cats( var,_n_),x,'g ); 33

USING COMMENTS WITHIN A MACRO DEFINITION: Overview Asterisk-style comments * this is my comment; Macro-style comments %* this is my comment; PL/1-style comments /* this is my comment */ 34

COMMENTS: EXAMPLE 1 CODE *asterisk style comment; %macro one; %let x=10; data new; * The %let x = value in the above section is used to set the lower limit; set one; if x>=&x; run; %mend; %one

COMMENTS: EXAMPLE 1 CODE *asterisk style comment; %macro one; %let x=10; data new; * The %let x = value in the above section is used to set the lower limit; set one; if x>=&x; run; %mend; %one 36

COMMENTS: EXAMPLE 1 LOG * The %let x = value in the above section is used to set the lower limit; 377 %one MLOGIC(ONE): Beginning execution. MPRINT(ONE): data new; MLOGIC(ONE): %LET (variable name is X) MPRINT(ONE): * The set one; NOTE: Line generated by the macro variable "X". 377 value in the above section is used set the lower limit ----- 22 76 ERROR: The right-hand operand must be an array name or a constant value list. The specified name the, is not an array. MPRINT(ONE): if x>=value in the above section is used to set the lower limit; MPRINT(ONE): run; 37

COMMENTS: EXAMPLE 2 CODE %* macro style comment; %macro test; %* The rest of the developer's comments in this section discuss the metadata; proc contents data=sashelp.cars out=chars noprint; run; %*subset the data to look at only the character variables.; data chars; set chars(where=(type=2)); run; %mend; %test(test) 38

COMMENTS: EXAMPLE 2 LOG 82 %macro test; 83 %* The rest of the developer's comments in this section discuss the metadata; 84 proc contents data=sashelp.cars out=chars noprint; 85 run; 86 %*subset the data to look at only the character variables.; 87 data chars; 88 set chars(where=(type=2)); 89 run; 90 91 %mend; 92 93 %test 39

COMMENTS: EXAMPLE 3 CODE /* PL/1 style comment */ /* The following special characters can all be safely used within this type comment: % ; */

%PUT STATEMENT: OVERVIEW Writes out the value of the macro variable and other macro variable information Syntax %PUT <text _ALL_ _AUTOMATIC_ _GLOBAL_ _LOCAL_ _READONLY_ _USER_ _WRITABLE_>; 41

%PUT STATEMENT: EXAMPLE 1 Code: data new; set sashelp.cars; if make='honda'; run; Log Output: NOTE: There were 428 observations read from the data set SASHELP.CARS. NOTE: The data set WORK.NEW has 0 observations and 15 variables. data new; set sashelp.cars; put make=; if make= HONDA ; run; data new; set sashelp.cars; if upcase(make)= HONDA ; run; 2066 Data new; 2067 set sashelp.cars; 2068 put make=; 2069 if make='honda'; 2070 run; Make=Acura Make=Acura Make=Acura Make=Acura Make=Audi Make=Audi 42

%PUT STATEMENT: EXAMPLE 1 Log Output: 2077 data total; 2078 set sales_data end=last; 2079 total_sales+sales; 2080 if last then call symputx('total_sales',total_sales); 2081 run; NOTE: There were 8 observations read from the data set WORK.SALES_DATA. NOTE: The data set WORK.TOTAL has 8 observations and 3 variables. NOTE: DATA statement used (Total process time): real time 0.02 seconds cpu time 0.01 seconds SYMBOLGEN: Macro variable TOTAL_SALES resolves to 17240 2082 %put &=total_sales; TOTAL_SALES=17240 43

%PUT STATEMENT: EXAMPLE 2 CODE options nosymbolgen nomlogic; %macro test; %do i=1 %to 5; %let x=%sysevalf(%sysfunc(ranuni(100))*100,floor); %let y=%sysevalf(%sysfunc(ranuni(100))*100,floor); %put &=i; %put &=x; %put &=y; %put ----------------------; %end; %mend; %test 44

%PUT STATEMENT: EXAMPLE 2 LOG OUTPUT 2167 2168 %test I=1 X=83 Y=66 ---------------------- I=2 X=12 Y=91 ---------------------- I=3 X=96 Y=72 ---------------------- I=4 X=10 Y=24 ---------------------- I=5 X=95 Y=80 ---------------------- 45

%PUT STATEMENT: ARGUMENTS _ALL AUTOMATIC GLOBAL LOCAL READONLY USER_ Shows all of the user-generated global and local macro variables. _WRITABLE_

%PUT STATEMENT: EXAMPLE ARGUMENT Code: %put _user_; Log Output: GLOBAL TOTAL_SALES 17240 GLOBAL VAR1 1 GLOBAL VAR10 10 GLOBAL VAR100 100 GLOBAL VAR11 11 GLOBAL VAR12 12 GLOBAL VAR13 13 GLOBAL VAR14 14 GLOBAL VAR15 15 GLOBAL VAR16 16 GLOBAL VAR17 17 GLOBAL VAR18 18 47

MFILE SYSTEM OPTION: OVERVIEW Enables you to route the non-macro code generated by your macro (MPRINT output) to an external file Syntax MFILE NOMFILE 48

MFILE SYSTEM OPTION: EXAMPLE 1 LOG OUTPUT 837 data a; 838 set sashelp.cars; 839 target=input(make,8.); 840 run; NOTE: Invalid argument to function INPUT at line 839 column 10. 49

MFILE SYSTEM OPTION: EXAMPLE 1 LOG OUTPUT (continued) %macro test; 844 data a; 845 set sashelp.cars; 846 target=input(make,8.); 847 run; 848 %mend; 849 %test MLOGIC(TEST): Beginning execution. MPRINT(TEST): data a; MPRINT(TEST): set sashelp.cars; MPRINT(TEST): target=input(make,8.); MPRINT(TEST): run; NOTE: Invalid argument to function INPUT at line 849 column 39. 50

MFILE SYSTEM OPTION: EXAMPLE 2 CODE filename mprint 'c:\dstep\mycode.sas'; options mprint mfile; %macro test(var); data a; set sashelp.cars; target=input(&var,8.); run; %mend; %test(make) 51

MFILE SYSTEM OPTION: EXAMPLE 3 Contents of MyCode.sas: data a; set sashelp.cars; target=input(make,8.); run; Log Output: data a; 864 set sashelp.cars; 865 target=input(make,8.); 866 867 run; NOTE: Invalid argument to function INPUT at line 865 column 10. 52

READ-ONLY MACRO VARIABLES: OVERVIEW Syntax %GLOBAL / READONLY macro-variable=value; Or %LOCAL / READONLY macro-variable=value; 53

READ-ONLY MACRO VARIABLES: EXAMPLE CODE %let date=%sysfunc(intnx(month,%sysfunc(today()),0)); Set salesdata(where=(date<&date)); 54

READ-ONLY MACRO VARIABLES: EXAMPLE PROTECTED Code: %global / readonly date=%sysfunc(intnx(month,%sysfunc(today()),0)); Log Output: ERROR: The variable DATE was previously declared as READONLY and cannot be re-declared. 55

MACRO IN OPERATOR: OVERVIEW Gives you the ability to determine whether a single value is contained in a specified list of values 56

MACRO IN OPERATOR: DATA STEP EXAMPLE data new; set sashelp.cars; if make in('acura' 'Audi' 'Lexus' 'Infiniti' 'Mercedes-Benz') then cartype='luxury'; run;

MACRO IN OPERATOR: EXAMPLE 1 CODE /* before SAS 9.3 */ options mlogic sgen mprint; %macro test(make); %if %bquote(&make)=acura or %bquote(&make)=audi or %bquote(&make)=lexus or %bquote(&make)=infiniti or %bquote(&make)=%str(mercedes-benz) %then %do; data new; set sashelp.cars(where=(make="&make")); run; proc print;run; %end; %mend; %test(mercedes-benz) 58

MACRO IN OPERATOR: EXAMPLE 2 CODE /* SAS 9.3 and later */ options mlogic sgen mprint minoperator mindelimiter=','; %macro test(make); %if %bquote(&make) in (Acura,Audi,Lexus,Infiniti,%str(Mercedes-Benz)) %then %do; data new; set sashelp.cars(where=(make="&make")); run; proc print;run; %end; %mend; %test(mercedes-benz) 59

MACRO IN OPERATOR: EXAMPLE 3 CODE options minoperator; options minoperator mindelimiter=, ; %macro test(make)/minoperator mindelimiter=','; 60

SASHELP.VMACRO: OVERVIEW Contains a list of all the macro variables that currently exist in your SAS session Includes all the macro variables that have been defined by you and by the SAS system 61

SASHELP.VMACRO: CONTENTS SCOPE NAME OFFSET VALUE GLOBAL MAKE1 0 Acura GLOBAL MAKE10 0 GMC GLOBAL MAKE11 0 Honda GLOBAL MAKE12 0 Hummer GLOBAL MAKE13 0 Hyundai GLOBAL MAKE14 0 Infiniti GLOBAL MAKE15 0 Isuzu GLOBAL MAKE16 0 Jaguar GLOBAL MAKE17 0 Jeep GLOBAL MAKE18 0 Kia GLOBAL MAKE19 0 Land Rover GLOBAL MAKE2 0 Audi GLOBAL MAKE20 0 Lexus GLOBAL MAKE21 0 Lincoln GLOBAL MAKE22 0 MINI GLOBAL MAKE23 0 Mazda GLOBAL MAKE24 0 Mercedes-Benz GLOBAL MAKE25 0 Mercury

SASHELP.VMACRO: EXAMPLE 1 CODE proc print data=sashelp.vmacro(where=(name=: MAKE')); run; 63

SASHELP.VMACRO: EXAMPLE 2 CODE %macro delvars; data vars; set sashelp.vmacro; run; data _null_; set vars; temp=lag(name); if scope='global' and substr(name,1,3) ne 'SYS' and temp ne name then rc=dosubl('%symdel ' trim(left(name)) ';'); run; %mend; %delvars 64

SASHELP.VMACRO: EXAMPLE 2 LOG OUTPUT 69 %let x=1; 70 %let y=2; 71 %let z=3; 72 %put &=x &=y &=z; X=1 Y=2 Z=3 73 74 %delvars NOTE: There were 71 observations read from the data set SASHELP.VMACRO. NOTE: The data set WORK.VARS has 71 observations and 4 variables. NOTE: DATA statement used (Total process time): real time 0.04 seconds cpu time 0.04 seconds NOTE: There were 71 observations read from the data set WORK.VARS. NOTE: DATA statement used (Total process time): real time 0.17 seconds cpu time 0.03 seconds WARNING: Apparent symbolic reference X not resolved. WARNING: Apparent symbolic reference Y not resolved. WARNING: Apparent symbolic reference Z not resolved. 75 76 %put &=x &=y &=z; 65

CONTACT INFORMATION Kevin Russell SAS Institute Inc. Email: support@sas.com Web: support.sas.com 66

IT S POP QUIZ TIME!!!

QUESTION 1 CALL SYMPUT is a new and improved version of CALL SYMPUTX. True? False?

QUESTION 2 Which style of comment is the recommend style comment to use within a macro definition? A) An asterisk-style comment B) A macro-style comment C) A PL/1 style comment

QUESTION 3 Which system option will show you if your %IF condition was true or false? A) SYMBOLGEN B) MPRINT C) MLOGIC

QUESTION 4 This is the correct syntax needed to use the macro IN operator? options minoperator mindelimiter=, ; %macro test(make); %if &make in(acura BMW Infiniti Lexus %str(mercedes Benz)) %then %let cartype=luxury; %put &=cartype; %mend; %test(bmw) True? False? Bonus Question: What s wrong with this syntax?

QUESTION 5 This syntax will create a read-only macro variable: %let x=i love fishing! / readonly; True? False? Bonus question: How would I create a read-only macro variable?

QUESTION 6 Which system option do I have to set to enable the stored compiled macro facility? A) MAUTOSOURCE B) MFILE C) MSTORED D) MLOGIC

QUESTION 7 The following is the correct syntax needed to use the MFILE system option? Filename myfile c:\mycode\code.sas ; Options mprint mfile; %macro test; data new; set sashelp.cars; run; %mend; %test True? Bonus question: What s wrong with this syntax? False?

QUESTION 8 Which line of syntax is incorrect? A) %put _user_; B) %put &=x; C) %put the value of the macro variable x is: x; D) They are all syntactically correct