语法
OPTIONS CMPLIB=libref.table | (libref.table-1...libref.table-n)
PROC FCMP OUTLIB=libref.table.package;
FUNCTION function-name(arguments <$>)<$><length>;
. . .
programming statements
. . .
RETURN(expression);
ENDSUB;
QUIT;
选项CMPLIB:指定存储函数包的表。是一个全局选项,设置此选项后,它将一直有效,直到取消、更改或退出SAS会话。
选项OUTLIB:指定存储编译函数的表和包。这是必须在PROC FCMP语句中指定的参数
FUNCTION语句:指定了函数名和函数参数,以及函数返回的是字符值还是数值
arguments:指定函数的一个或多个参数。通过在参数名称后面放置一个美元符号($)来指定字符参数。
<$>:指定函数返回一个字符值。如果未指定$,则函数返回一个数值。
————————————————
/************************************************************************************************************************/
dm ' log; clear; odsresult;clear; output; clear; ';
/* 改变工作路径 change the working directory to the current file folder. */
%macro cd_currfile_path;
%let currfile_path = %qsubstr(%sysget(SAS_EXECFILEPATH), 1, %length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILEname)) );
x "cd &currfile_path.";
%mend cd_currfile_path;
%cd_currfile_path;
libname dlglib '../data';
/************************************************************************************************************************/
proc fcmp outlib=dlglib.functions.dat;
function MyQuarter(month);
if month in(2,3,4) then myqtr=1;
else if month in(5,6,7) then myqtr=2;
else if month in (8,9,10) then myqtr=3;
else myqtr=4;
return(myqtr);
endsub;
run;
options cmplib=dlglib.functions;
data work.dates;
do Dates='15JAN2019'd to '31DEC2021'd by 30;
MonNum=month(Dates);
FiscalQuarter=MyQuarter(MonNum);
output;
end;
run;
proc print data=work.dates;
format Dates mmddyy10.;
run;
/************************************************************************************************************************/