The SAS Interface to REXX

Similar documents
Storing and Reusing Macros

QUEST Procedure Reference

APPENDIX 2 Customizing SAS/ASSIST Software

Customizing Your SAS Session

Alternative ODS HTML Statements for Running Examples in Different Operating Environments

Using Dynamic Data Exchange

Changes and Enhancements

Executing SAS/AF Applications

CHAPTER 7 Using Other SAS Software Products

Using MDP Extensions. What Is the Multidimensional Data Provider? CHAPTER 3

Macro Facility. About the Macro Facility. Automatic Macro Variables CHAPTER 14

Defining Your Data Sources

Using the SQL Editor. Overview CHAPTER 11

Introduction. Understanding SAS/ACCESS Descriptor Files. CHAPTER 3 Defining SAS/ACCESS Descriptor Files

Using Data Transfer Services

Chapter 28 Saving and Printing Tables. Chapter Table of Contents SAVING AND PRINTING TABLES AS OUTPUT OBJECTS OUTPUT OBJECTS...

Changes and Enhancements

Introduction. LOCK Statement. CHAPTER 11 The LOCK Statement and the LOCK Command

APPENDIX 4 Migrating from QMF to SAS/ ASSIST Software. Each of these steps can be executed independently.

Using Cross-Environment Data Access (CEDA)

Introduction. Getting Started with the Macro Facility CHAPTER 1

Graphics. Chapter Overview CHAPTER 4

DATA Step Debugger APPENDIX 3

SAS/ASSIST Software Setup

Introduction. CHAPTER 3 Working in the SAS Windowing Environment

WKn Chapter. Note to UNIX and OS/390 Users. Import/Export Facility CHAPTER 9

The EXPLODE Procedure

Permission Program. Support for Version 6 Only. Allowing SAS/SHARE Client Access to SAS Libraries or Files CHAPTER 40

Chapter 3 Managing Results in Projects. Chapter Table of Contents

DBLOAD Procedure Reference

Data Representation. Variable Precision and Storage Information. Numeric Variables in the Alpha Environment CHAPTER 9

Changes and Enhancements

Creating and Executing Stored Compiled DATA Step Programs

CHAPTER 13 Importing and Exporting External Data

Formats. SAS Formats under OS/2. Writing Binary Data CHAPTER 13

CHAPTER 7 Examples of Combining Compute Services and Data Transfer Services

SAS Support for TELNET on Windows

Formats. Formats Under UNIX. HEXw. format. $HEXw. format. Details CHAPTER 11

Overview. CHAPTER 2 Using the SAS System and SAS/ ASSIST Software

Chapter 2 User Interface Features. networks Window. Drawing Panel

The TRANTAB Procedure

External Files. Definition CHAPTER 38

Functions and CALL Routines

SAS Interfaces to ISPF and REXX

Informats. Informats Under UNIX. HEXw. informat. $HEXw. informat. Details CHAPTER 13

Introduction to Using Groupware with the SAS System

The correct bibliographic citation for this manual is as follows: SAS Institute Inc Proc EXPLODE. Cary, NC: SAS Institute Inc.

SAS I/O Engines. Definition. Specifying a Different Engine. How Engines Work with SAS Files CHAPTER 36

OS/2: SPX Access Method

SAS Data Libraries. Definition CHAPTER 26

Chapter 6 Creating Reports. Chapter Table of Contents

Examples That Use Remote Objecting

Locking SAS Data Objects

Windows: SPX Access Method

SAS File Management. Improving Performance CHAPTER 37

Data Set Options. Specify a data set option in parentheses after a SAS data set name. To specify several data set options, separate them with spaces.

CV2ODBC Procedure. Overview. CV2ODBC Procedure Syntax APPENDIX 4

SAS/FSP 9.2. Procedures Guide

from the source host, use the FTP put command to copy a file from the source host to the target host.

Informats. Informats in the CMS Environment. Considerations for Using Informats under CMS. EBCDIC and Character Data CHAPTER 15

Routing the SAS Log and SAS Procedure Output

Introduction to MDDBs

Allocating External Files

Tasks Menu Reference. Introduction. Data Management APPENDIX 1

Batch Importing. Overview CHAPTER 4

SAS Strategy Management 5.2 Batch Maintenance Facility

SAS Catalogs. Definition. Catalog Names. Parts of a Catalog Name CHAPTER 32

SCL Arrays. Introduction. Declaring Arrays CHAPTER 4

The SERVER Procedure. Introduction. Syntax CHAPTER 8

Chapter 25 PROC PARETO Statement. Chapter Table of Contents. OVERVIEW SYNTAX SummaryofOptions DictionaryofOptions...

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

OpenVMS Operating Environment

CHAPTER 5 Macintosh: TCP/IP Access Method

Chapter 27 Saving and Printing Graphics

What Is a Communications Access Method? CHAPTER 1 Using Communications Access Methods

Chapter 23 Introduction to the OPTEX Procedure

UNIX Platform Error Messages

The GSLIDE Procedure. Overview. About Text Slides CHAPTER 27

UNIX Spawner Program. Starting the UNIX Spawner Program CHAPTER 36

Chapter 23 Animating Graphs. Chapter Table of Contents ANIMATING SELECTION OF OBSERVATIONS ANIMATING SELECTED GRAPHS...347

Handling Exceptions. Introduction. Using the Program Halt Handler CHAPTER 10

10 The First Steps 4 Chapter 2

Introduction to the OpenVMS Operating Environment

The TIMEPLOT Procedure

Submitting SAS Code On The Side

Using SAS Files. Introduction CHAPTER 5

SAS Drug Development. SAS Macro API 1.3 User s Guide

The GIMPORT Procedure

SAS/ACCESS Interface to R/3

Scheduling in SAS 9.2

Choosing the Right Procedure

Chapter 14 Introduction to the FACTEX Procedure

Loading Data. Introduction. Understanding the Volume Grid CHAPTER 2

SAS Drug Development SAS API Macros 1.1 User s Guide

The G4GRID Procedure. Introduction APPENDIX 1

Scheduling in SAS 9.4, Second Edition

Optimizing System Performance

SAS/C Debugger User s Guide and Reference, Release 7.00

Using Unnamed and Named Pipes

OS/390 Platform Examples

Transcription:

95 CHAPTER 9 The SAS Interface to REXX Overview 95 The Subcommand Environment 96 Retrieving and Assigning the Values of REXX Variables in a SAS Program 97 Using the GETEXEC DATA Step Function 97 Using the PUTEXEC CALL Routine 98 Routing Messages to the SAS Log 98 Return Codes from SAS Statements Submitted by a SASMACRO 99 RC Variable 99 RC Values 99 Return Codes from SASMACROs 101 Mode Switching 101 Productivity Aids for Interactive SAS Sessions under CMS 102 Invoking a SASMACRO from the Windowing Environment Command Line 103 Overview REXX is a general purpose, high-level procedural language that is well known for combining powerful programming features with ease of use. REXX is also well known for its strengths as a macro language, most commonly with XEDIT. The SAS REXX macro facility enables you to use REXX as a macro language with SAS. This expands the programming possibilities available to you with SAS under CMS. The REXX macro facility can be used to do the following things that the SAS macro facility can do: 3 dynamically create and submit SAS statements 3 communicate information between SAS steps 3 route messages to the SAS log 3 issue commands to CMS 3 pass information between SAS and CMS using GLOBALV variables. You can also use the REXX macro facility to 3 pass information between SAS and CMS using REXX variables 3 temporarily transfer control from an executing macro back to an interactive SAS session 3 create pseudo SAS windowing environment commands 3 transfer control to a CMS application (for example, XEDIT or FILELIST), and invoke SAS commands from within them. To use the SAS REXX macro facility, write a REXX macro program and submit it from within a SAS session. A SAS REXX macro (SASMACRO) is a REXX program with

96 The Subcommand Environment 4 Chapter 9 a filetype of SASMACRO and a filename that you choose. A SASMACRO can contain SAS statements in addition to REXX code. When a SASMACRO is running, any instruction that REXX interprets as an external command is submitted to SAS for execution. For example, the following program, TRYIT SASMACRO (a version of which is shipped with SAS), submits a DATA step and a PROC step to SAS: /* TRYIT SASMACRO - a SAS REXX macro */ /* process arguments, establish defaults */ parse arg dname argname. if dname = then dname = a if argname = then argname = x /* Pass a DATA step and PROC step into SAS */ data dname ; argname =1; run; proc contents; run; exit /* Return to SAS */ To run a SASMACRO, submit its CMS filename and any arguments as if it were a SAS statement. This effectively makes the SASMACRO an extension of the SAS language. A statement that invokes a SASMACRO may be placed anywhere in a SAS program. When SAS encounters a statement that it does not recognize, it passes the statement to the SAS REXX macro facility for execution. If there is no SASMACRO by the specified name, SAS flags the statement as invalid and prints an error message in the log. Note: A SASMACRO cannot have a name that is the same as a valid SAS statement or its abbreviation. 4 To invoke the TRYIT SASMACRO example with two arguments, submit the following statement to SAS: TRYIT A B; This creates SAS data set A that contains one observation with one variable B, which has a value of 1. A SASMACRO is invoked when SAS encounters it, just as any other global SAS statement in that location would be. A SASMACRO that is invoked within a DATA step is executed only one time, when the DATA step is compiled. It is not executed for each observation in the DATA step. Any SAS statements that are submitted from the SASMACRO are processed before subsequent statements are processed in the SAS program that invokes the SASMACRO. The Subcommand Environment When a SASMACRO receives control, the default subcommand environment is SAS. This causes REXX to pass external commands to SAS. You can use the REXX ADDRESS instruction, followed by the name of an environment, to change to a different default subcommand environment. For example: address command address xedit address sas A SASMACRO is analogous to an XEDIT macro in its structure and invocation: 3 A SASMACRO is a REXX program. It is submitted as part of a SAS program in the same way as any other global SAS statement. A SASMACRO submits SAS

The SAS Interface to REXX 4 Using the GETEXEC DATA Step Function 97 statements through the SAS subcommand environment by specifying or defaulting to SAS as its "address." 3 An XEDIT macro is a REXX program. It is executed from the XEDIT command line in the same way as any other XEDIT subcommand. An XEDIT macro submits XEDIT subcommands through the XEDIT subcommand environment by specifying or defaulting to XEDIT as its "address." From the time a SASMACRO is invoked until it is terminated, the SAS subcommand environment is available. For example, a SASMACRO can invoke a REXX exec that issues the following instruction and submits SAS statements: address sas You can use a REXX exec in this way to layer and reuse the code in a SASMACRO. Although SASMACROs and EXECs can be nested, the SAS subcommand environment itself is not re-entrant; that is, it cannot accept a new SAS statement while a previous statement that is submitted via ADDRESS SAS is still running. The limitation that this imposes is that a SASMACRO cannot use the X statement or the CMS statement to execute a command that, in turn, issues SAS statements via ADDRESS SAS. Instead, use the ADDRESS command or ADDRESS CMS to execute such a command. Each command string that is submitted to the SAS subcommand environment is limited to a maximum length of 132 characters. This limit is on the final length of the string that results from the completion of all interpretation by REXX. Retrieving and Assigning the Values of REXX Variables in a SAS Program Using the GETEXEC DATA Step Function During the execution of a SASMACRO you can retrieve the value of any exposed REXX variable from the current REXX program into a DATA step by using the GETEXEC function. The GETEXEC function is analogous to the SYMGET function in the SAS macro facility. The following SASMACRO submits a DATA step that uses the GETEXEC function to retrieve the value of the REXX variable DATALINE. It then prints the value of DATALINE in the SAS log. Note that the REXX variable name must be specified in uppercase letters. /* GETLINE SASMACRO - a SAS REXX macro */ dataline= This data will be placed into the SAS, data set A /* Pass a DATA step to SAS */ "data a;" "x=getexec( DATALINE );" "put x;" "run;" exit For more information about the syntax and usage of GETEXEC, see GETEXEC on page 155.

98 Using the PUTEXEC CALL Routine 4 Chapter 9 Using the PUTEXEC CALL Routine During the execution of a SASMACRO, you can assign a value to a REXX variable in the current REXX program from a DATA step by using the PUTEXEC call routine. The PUTEXEC call routine is analogous to the SYMPUT routine in the SAS macro facility. The following SASMACRO submits a DATA step that assigns the value of a SAS variable to the REXX variable SASTIME. The SASMACRO then displays the value of the REXX variable on the console. Note that the REXX variable name must be specified in uppercase letters. /* PUTTIME SASMACRO - a SAS REXX macro */ "data _null_;" "time=symget( SYSTIME );" "call PUTEXEC( SASTIME,time);" "run;" say SAStime is sastime exit For more information about the syntax and usage of PUTEXEC, see CALL PUTEXEC on page 138. Routing Messages to the SAS Log A set of directives is available to SASMACRO programs to control printing to the SAS log. SASMACRO directives use a leading ++ sequence to differentiate them from normal SAS language statements. The directives must be specified in uppercase letters and cannot end in a semicolon. They must also be submitted on a separate line from other SAS statements. Three directives are available for controlling printing to the SAS log: ++SASLOG causes subsequent SAS statements submitted from the SASMACRO to be printed in the SAS log. ++NOLOG causes subsequent SAS statements submitted from the SASMACRO not to be printed in the SAS log. This is the default setting. ++SASLOG message-text prints message-text in the SAS log and causes subsequent SAS statements that are submitted from the SASMACRO to be printed in the SAS log. The following example uses the ++SASLOG directive to place text and subsequent SAS statements in the SAS log: /* An extended version of TRYIT SASMACRO */ /* process arguments, establish defaults */ parse arg dname argname. if dname = then dname = a if argname = then argname = x /* Place text into SAS log */ /* and subsequent SAS statements */ ++SASLOG Running the TRYIT macro.

The SAS Interface to REXX 4 RC Values 99 /* Pass a DATA step and PROC step into SAS */ data dname ; argname =1; run; proc contents; run; exit /* Return to SAS */ Output 9.1 on page 99 shows the resulting SAS log: Output 9.1 SAS Log for TRYIT SASMACRO 1 tryit; ++++ Running the TRYIT macro. ++++ data a; x=1; run; NOTE: The data set WORK.A has 1 observations and 1 variables. ++++ proc contents; run; Return Codes from SAS Statements Submitted by a SASMACRO RC Variable In a REXX program, the special variable RC is always set when any command string is submitted to an external environment. Ordinary execs submit CMS commands. When the CMS command completes and control is returned to REXX, the RC variable is set to the return code from the CMS command. The RC variable is set in a slightly different way for a SASMACRO. The strings that are submitted to SAS are not necessarily complete execution units. SAS collects SAS language elements until it encounters a RUN statement, at which point it runs the SAS step. The RC variable is set to 0 when partial program fragments are submitted. The SAS return code is assigned to the REXX variable RC only for the string that contains the RUN statement. RC Values The value of the REXX RC variable is set to the value of the &SYSERR automatic SAS macro variable in all but four cases: 3 when an attempt is made to enter the SAS subcommand environment recursively. In this case, the statement is ignored and the RC value is set to 2. 3 when a SASMACRO is active and the SAS session is terminated with a BYE command, or with an ENDSAS command or statement. In this case, the SAS

100 RC Values 4 Chapter 9 session returns control to the SASMACRO. SAS statements that are subsequently submitted by the SASMACRO cannot be executed, and the RC value is set to 3 for each. 3 when a SASMACRO is active and SAS is interrupted with an attention and the SAS task is cancelled. In this case SAS statements that are subsequently submitted by the SASMACRO are not executed, and the RC value is set to 4 for each. 3 when an attempt is made to submit a command string that is longer than 132 characters. In this case, the statement is ignored and the RC value is set to 5. An error message and the first 132 characters of the string are written to the SAS log. The following RCTEST SASMACRO demonstrates when the REXX variable RC gets set: /* RCTEST SASMACRO - a SAS REXX macro */ /* Show SAS statements in the log */ ++SASLOG data x; do i = 1 to 10; output; /* show rc in the SAS log */ ++SASLOG The RC value is: rc run; /* show rc in the SAS log */ ++SASLOG The RC value is: rc exit Output 9.2 on page 100 shows the resulting SAS log. Output 9.2 SAS Log for RCTEST 1 rctest; ++++ data x; ++++ do i = 1 to 10; ++++ output; ++++ The RC value is: 0 ++++ run; 5 run; -- 117 ERROR 117-185: There were 1 unclosed DO blocks. NOTE: The SAS System stopped processing this step because of errors. WARNING: The data set WORK.X may be incomplete. When this step was stopped, there were 0 observations and 1 variables. ++++ The RC value is: 1012

The SAS Interface to REXX 4 Mode Switching 101 Return Codes from SASMACROs The return code from a SASMACRO is not automatically available to SAS. To pass information like a return code from a SASMACRO back to SAS, you can use the GETEXEC DATA step function that is described in Using the GETEXEC DATA Step Function on page 97. Mode Switching In addition to submitting SAS language statements from a SASMACRO, you can use a SASMACRO to temporarily pass interactive control to the SAS session. This environment, called SAS SUBSET, is similar in concept to CMS SUBSET. A SASMACRO (or any REXX program that is executed while a SASMACRO is running that has ADDRESS SAS in effect), can pass control to SAS SUBSET by issuing the following directive: ++SAS To exit SAS SUBSET and return to the suspended exec, submit the following SAS statement: cmsreturn; CMSRETURN is accepted as a valid SAS statement only when SAS SUBSET is in effect, and it cannot be submitted from a SASMACRO. The following example demonstrates switching from a SAS session to an XEDIT session to SAS SUBSET and back again by using a SASMACRO and an XEDIT macro. The program named SASXEDIT SASMACRO shows how to temporarily pass control to XEDIT: /* SASXEDIT SASMACRO - a SAS REXX macro */ /* that invokes XEDIT */ parse upper arg argstring address command XEDIT argstring exit The following program named SASSUB XEDIT shows how to temporarily pass control to SAS SUBSET: /* SASSUB XEDIT - an XEDIT macro */ /* that enters SAS SUBSET */ address sas ++SAS /* use CMSRETURN; to get back to XEDIT */ exit rc From the Program Editor window, submit the following statement: sasxedit FILENAME FILETYPE FILEMODE; This invokes SASXEDIT SASMACRO, which invokes an XEDIT session. At the XEDIT command line type: sassub This invokes SASSUB XEDIT, which in turn invokes SAS SUBSET in the Program Editor window as a continuation of your SAS session. Next submit this SAS statement: cmsreturn;

102 Productivity Aids for Interactive SAS Sessions under CMS 4 Chapter 9 This ends SAS SUBSET and resumes XEDIT, which runs the remaining portion of SASSUB XEDIT and then resumes your XEDIT session. Ending the XEDIT session (using FILE or QUIT) passes control back to the original SAS session, which runs the remaining portion of SASXEDIT SASMACRO and then returns to the Program Editor window. Figure 9.1 on page 102 illustrates the flow of control among the original SAS session, the XEDIT session, and the SAS SUBSET session. Figure 9.1 Flow of Control original SAS session SASMACRO program XEDIT session ++SAS directive SAS SUBSET session EXIT RC statement CMSRETURN statement Productivity Aids for Interactive SAS Sessions under CMS A set of sample execs is provided with SAS to show how the SAS interface to REXX can be used to improve productivity by integrating CMS commands such as FILELIST. Each of the following sample SASMACROs issues the corresponding CMS command: DIRLIST SASMACRO FILELIST SASMACRO MACLIST SASMACRO RDRLIST SASMACRO XEDIT SASMACRO Like other SASMACROs, these commands can be issued as SAS statements without the prefix of X or CMS. To issue autocall macros as SAS statements, specify the SAS system option MAUTOSOURCE. To invoke SASMACROs from the windowing environment command line, see Invoking a SASMACRO from the Windowing Environment Command Line on page 103. In addition, you can issue commands from within CMS applications to interact directly with the SAS session. While any of the preceding SASMACROs are active, the following special commands are supported from within CMS applications: DM <command> is used on an XEDIT command line or an xxxlist command line to switch the mode to the SAS windowing environment in a SAS subset and to execute a command. For example, DM KEYS switches to the KEYS window. When you submit the CMSRETURN statement, control returns to the XEDIT session or to the xxxlist menu. This command is implemented by the SAS$DM exec. INCLUDE is used on a FILELIST file line to include the specified FILELIST file into the Program Editor window. Control returns to the FILELIST menu. This command is implemented by the SAS$INCL exec.

The SAS Interface to REXX 4 Invoking a SASMACRO from the Windowing Environment Command Line 103 PGM is used on an XEDIT command line or an xxx LIST command line to switch the mode to the Program Editor window as a SAS subset. When you submit the CMSRETURN statement, control returns to the XEDIT session or to the xxxlist menu. This command is implemented by the SAS$PGM exec. SUBMIT is used on an XEDIT command line or a FILELIST file line to submit to SAS the current XEDIT file or specified FILELIST file. Control returns to the XEDIT session or to the FILELIST menu. This command is implemented by the SAS$SUB exec. Invoking a SASMACRO from the Windowing Environment Command Line Any SASMACRO can be invoked as a SAS statement, but not directly as a windowing environment command. A SASMACRO can be indirectly invoked from the windowing environment command line by using a command-style SAS macro as an interface. A command-style SAS macro that invokes a SASMACRO should have the following form: %macro TRYIT/cmd parmbuff; pgm; submit "TRYIT &syspbuff;" %mend; In the example, the first line begins the definition of a command-style SAS macro named TRYIT whose arguments are assigned as the value of the automatic macro variable SYSPBUFF. The second and third lines specify the execution of TRYIT SASMACRO from within the TRYIT SAS macro, by using the original arguments. You can store this macro as you would any other SAS macro, in SAS code or in an autocall library for example, as described in the SAS Macro Language: Reference. Once the macro is defined in your SAS session, you can issue the command TRYIT on the windowing environment command line to execute the TRYIT SASMACRO. Note: The SAS system option CMDMAC must be in effect for SAS to recognize command-stye macros. 4 Autocall macros that invoke the Productivity Aid SASMACROs (see Productivity Aids for Interactive SAS Sessions under CMS on page 102) are already provided for you so only the CMDMAC system option is required to use them as windowing environment commands. Note: The SAS system option MAUTOSOURCE must be in effect in order for you to use the autocall facility. 4

104 Invoking a SASMACRO from the Windowing Environment Command Line 4 Chapter 9

The correct bibliographic citation for this manual is as follows: SAS Institute Inc., SAS Companion for the CMS Environment, Version 8,Cary,NC: SAS Institute Inc., 1999. SAS Companion for the CMS Environment, Version 8 Copyright 1999 by SAS Institute Inc., Cary,NC, USA. ISBN 1 58025 481 0 All rights reserved. Printed in the United States of America. No part of this publication may be reproduced, stored in aretrieval system, or transmitted, by any form or by any means, electronic, mechanical, photocopying, or otherwise, without the prior written permission of the publisher,sas Institute, Inc. U.S. Government Restricted Rights Notice. Use, duplication, or disclosure of the software by the government is subject to restrictions as set forth in FAR 52.227 19 Commercial Computer Software-Restricted Rights (June 1987). SAS Institute Inc., SAS Campus Drive, Cary,North Carolina 27513. 1st printing, October 1999 SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. indicates USA registration. IBM and DB2 are registered trademarks or trademarks of International Business Machines Corporation. indicates USA registration. Other brand and product names are registered trademarks or trademarks of their respective companies. The Institute is aprivate company devoted to the support and further development of its software and related services.