The macro CHECK2 produces the same result as the macro CHECK:
var flightid totmiles;
However, in the macro CHECK2, the value assigned to VAL is simply the name PGM,
not the value of PGM. The macro processor resolves &&&VAL into &PGM and then
into the SAS statements contained in the macro variable PGM. Thus, the long value is
stored only once.
Writing Portable Macros
Using Portable SAS Language Functions with %SYSFUNC
If your code runs in two different environments, you have essentially doubled the worth
of your development effort. But portable applications require some planning ahead. For
more details about any host-specific feature of SAS, see the SAS documentation for your
You can use the %SYSFUNC macro function to access SAS language functions to
perform most host-specific operations, such as opening or deleting a file. For more
information, see “%SYSFUNC and %QSYSFUNC Functions” on page 277.
Using %SYSFUNC to access portable SAS language functions can save you a lot of
macro coding (and is therefore not only portable but also more efficient). The following
table lists some common host-specific tasks and the functions that perform those tasks.
Table 11.1 Portable SAS Language Functions and Their Uses
Assign and verify existence of fileref and physical file FILENAME,
Open a file FOPEN, MOPEN
Verify existence of a file FEXIST, FILEEXIST
Get information about a file FINFO,
Write data to a file FAPPEND, FWRITE
Read from a file FPOINT, FREAD,
148 Chapter 11 • Writing Efficient and Portable Macros
Close a file FCLOSE
Delete a file FDELETE
Open a directory DOPEN
Return information about a directory DINFO, DNUM,
Close a directory DCLOSE
Read a host-specific option GETOPTION
Interact with the File Data Buffer (FDB) FCOL, FGET,
Assign and verify librefs LIBNAME, LIBREF,
Get information about executed host environment commands SYSRC
Note: Of course, you can also use other functions, such as ABS, MAX, and
TRANWRD, with %SYSFUNC. A few SAS language functions are not available
with %SYSFUNC. For more information, see “%SYSFUNC and %QSYSFUNC
Functions” on page 277.
Example Using %SYSFUNC
The following program deletes the file identified by the fileref MyFile:
%if &rc = 0 and %sysfunc(fexist(&filrf)) %then
Using Automatic Variables with Host-Specific Values
Macro Variables by Task
The automatic macro variables are available under all host environments, but the values
are determined by each host. The following table lists the macro variables by task. The
Writing Portable Macros 149
“Type” column tells you if the variable can be changed (Read and Write) or can be
inspected (Read Only).
Table 11.2 Automatic Macro Variables with Host-Specific Results
List the name of the current graphics device
SYSDEVIC Read and write
List of the mode of execution (values are
FORE or BACK). Some host environments
allow only one mode, FORE.
List the name of the currently executing
batch job, user ID, or process. For example,
on UNIX, SYSJOBID is the PID.
List the last return code generated by your
host environment, based on commands
executed using the X statement in open code.
The X command in the SAS windowing
environment, or the %SYSEXEC (or %TSO
or %CMS) macro statements.
The default value is 0.
SYSRC Read and write
List the abbreviation of the host environment
that you are using.
List a more detailed abbreviation of the host
environment that you are using.
Retrieve a character string that was passed to
SAS by the SYSPARM= system option.
SYSPARM Read and write
Time zone name based on TIMEZONE
Time zone ID based on TIMEZONE option. SYSTIMEZONEIDENT Read-only
Current time zone offset based on
Examples Using SYSSCP and SYSSCPL
The macro DELFILE uses the value of SYSSCP to determine the platform that is
running SAS and deletes a TMP file. FILEREF is a macro parameter that contains a
filename. Because the filename is host-specific, making it a macro parameter enables the
macro to use whatever filename syntax is necessary for the host environment.
/* Unix */
%if &sysscp=HP 800 or &sysscp=HP 300 %then %do;
X “rm &fileref..TMP”;
150 Chapter 11 • Writing Efficient and Portable Macros