Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions...

32
Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions [email protected]

Transcript of Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions...

Page 1: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Proc FCMP – Data Step [email protected]

Page 2: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

What is Proc FCMP?

“SAS Function Compiler”

Build functions using DATA step syntax

Store the functions in a data set

Call the functions from the DATA step just as you would any other SAS function

Lots more capabilities, just not covered today

Page 3: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Proc FCMP - History

Prior to Version 9.2 – Limited to Product Procs• SAS/STAT• SAS/ETS• SAS/OR

Post 9.2 available – Data step syntax

Page 4: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Advantages of Writing Your Own Functions

Function makes a program easier to read, write and modify

Reuse and quality control• Test once use many times

Program/function independence

Page 5: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Syntax to Create a Function - 3 level name

Proc FCMP outlib = << Ids where to store

sasuser.MySubs.MathFncs; << DS and package

function day_date( indate, type $);

if type = "DAYS" then wkday = weekday(indate);

if type = "YEARS" then wkday = weekday(indate*365);

return(wkday);

endsub;

run;

Page 6: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Outlib – 3 Level Name - Package

Proc FCMP outlib =

sasuser.MySubs.MathFncs;

Library

Dataset

Package – collection of related functions• Could be by organized by application or by corporate

department

Page 7: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Pieces and Parts

4 parts between FUNCTION statement

ENDSUB keyword• Function name

− day_date• One or more parameters

− ( indate, type $);• A body of code• A RETURN statement

− return(wkday);

Page 8: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Syntax to Create a Function – Statement & Name

Proc FCMP outlib =

sasuser.MySubs.MathFncs;

function day_date( indate, type $); << stmt & name

if type = "DAYS" then wkday = weekday(indate);

if type = "YEARS" then wkday = weekday(indate*365);

return(wkday);

endsub;

run;

Page 9: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Syntax to Create a Function – Naming

function day_date( indate, type $); << stmt & name

Cannot have a function name that collides with a built-in SAS function name. An error message is generated if an attempt is made.

Name must be unique in the package

2 packages with the same name – qualify name when calling• MathFncs.day_date

Page 10: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Syntax to Create a Function - Arguments

function day_date( indate, type $); << arguments

function coffee_deal() $ ; << no argument

Can have one or more arguments for a function.

Specify character arguments by placing a dollar sign ($) after the argument name.

In the above example:

indate is numeric and type is a character argument

Page 11: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Syntax to Create a Function – Logic

The DAY_DATE function converts a date to a numeric day of the week

if type = "DAYS" then wkday = weekday(indate);

if type = "YEARS" then wkday = weekday(indate*365);

Page 12: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Usage of SAS Function - weekday

Proc FCMP outlib =

sasuser.MySubs.MathFncs;

function day_date( indate, type $);

if type = "DAYS" then wkday = weekday(indate);

if type = "YEARS" then wkday = weekday(indate*365);

return(wkday);

endsub;

run;

Page 13: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Syntax to Create a Function – Return

Proc FCMP outlib =

sasuser.MySubs.MathFncs;

function day_date( indate, type $);

if type = "DAYS" then wkday = weekday(indate);

if type = "YEARS" then wkday = weekday(indate*365);

return(wkday); <<Returns a numeric value

endsub;

run;

Page 14: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Calling the Function

Options cmplib = sasuser.mysubs;

Data work.usefunc;

Numdays = day_date(‘13sep2011’d,”DAYS”);

Put numdays=; run;

Numdays = 3

Page 15: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Options CMPLIB =

Options cmplib = sasuser.mysubs;

CMPLIB is a SAS option that supports usage with INSERT and APPEND

Options insert=(cmplib=sasuser.meFirst) ;

Options append=(cmplib=sasuser.meLast);

Page 16: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Page 17: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Page 18: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Page 19: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Nesting and Scope

Page 20: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Nesting and Scope

DATAStep

funAfunB

Page 21: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Scope – Independent “x” Variablefunction funB(value); x = value * 100; put 'In funB:' x=; return (x);endsub;

function funA(value); x = value; put 'In funA:' x=; y = funB(x); return (y*10);endsub;

data _null_; x = funA(5); put 'In DATA Step: ' x=;run;

Page 22: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Scope – Usage

data _null_; x = funA(5); put 'In DATA Step:‘ x=;run;

Output to the SAS Log: In funA: x=5

In funB: x=500

In DATA Step: x=5000

Page 23: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Function Management

Protecting Functions

Listing the Source

Adding a Function

Removing a Function

Replacing a Function

Page 24: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Protecting Functions

Operating System File Permissions• Unix: chmod• Windows: attrib• z/OS: RACF

libname perm "\\shared\perm" access=readonly;

SAS/Share Read-Only Library

Page 25: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Listing the Function Source

proc fcmp outlib=sasuser.funcs.trial;

listfunc study_day;

Page 26: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Adding a Function

proc fcmp outlib=sasuser.funcs.trial;

function study_day(start, event);

n = event – start;

if n >= 0 then

n = n + 1;

return(n);

endsub;

Page 27: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Removing a Function

proc fcmp outlib=sasuser.funcs.trial;

deletefunc study_day;

Page 28: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Replacing a Function

proc fcmp outlib=sasuser.funcs.trial;

deletefunc study_day;

function study_day(start, event);

...

Page 29: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Replacing a Function

Page 30: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Proc FCMP - Data Step Statements Not Supported

Data

Set

Merge

Update

Modify

Input

Infile (thru functions OPEN-FETCH, …)

Page 31: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Proc FCMP – Power of Put

Use Put for debugging

Results of a Put statement can go to the PRINT (default) and LOG destinations

FILE log;

Put variable ;

Page 32: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com.

Copyright © 2006, SAS Institute Inc. All rights reserved.

Acknowledgements and Questions

Thanks to GASUG for the invitation to present!

Thanks to Jason Secosky who provided a subset of the material for this presentation