![Page 2: Copyright © 2006, SAS Institute Inc. All rights reserved. Proc FCMP – Data Step Functions Denise.Poll@sas.com](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/2.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/3.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/4.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/5.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/6.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/7.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/8.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/9.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/10.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/11.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/12.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/13.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/14.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/15.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/16.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/17.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/18.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/19.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/20.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/21.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/22.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/23.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/24.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/25.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/26.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/27.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/28.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/29.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/30.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/31.jpg)
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](https://reader035.vdocument.in/reader035/viewer/2022062304/56649c725503460f94924874/html5/thumbnails/32.jpg)
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