2016-04-27 44 views
1

我想使用proc fcmp在SAS9.3中定義我自己的功能。 操作系統是aix 64位。 這裏是我的代碼(reg_func.sas):SAS9.3 PROC FCMP無法保存用戶定義的功能

proc fcmp outlib=mylib.funcs.rule; 
function gen_sub_rule(); 
put "this is a test function"; 
return (0); 
endsub; 
run; 
quit; 

但之後運行SAS reg_func.sas,我得到了一些警告

WARNING:Cannot wirte model to data set mylib.funcs because it is curently opened or already exists as a standart data set.Will revert to V8 CATALOG instread. WARNING:Failed to save function gen_sub_rule to mylib.funcs.rule.

誰能幫助謝謝!

+0

您已經嘗試了不同的outlib選項? – Reeza

+0

@Reeza,謝謝,我試過這種方式,在我的proc fcmp代碼之前添加[libname mylib'/ home/ap/sas/mydir';]。它的工作原理。但還有另外一個問題,當我使用deletefunc時,sas會告訴你這種減少:SUBROUTINE'GEN_SUB_RULE'找不到刪除。 –

+0

發佈您嘗試刪除它的方式。沒有看到代碼只有假設是你做錯了:) – Reeza

回答

1

解決! Referrring到https://communities.sas.com/t5/Base-SAS-Programming/Irritating-warning-in-Proc-FCMP/td-p/16216
的關鍵是cmplib選項,這裏是我的代碼:

libname mylib 'H:\saslib\testlib'; 
    proc fcmp outlib=mylib.funcs.rule; 
     function calc(var); 
     newvar=log(var); 
     return(newvar); 
     endsub; 
    function gen_str(var1 $, var2 $, var3 $) $100; 
     length newvar $100; 
     newvar=catx('#', var1, var2, var3); 
     return(newvar); 
     endsub; 
    Run; 

    /*list the source code*/ 
    Options cmplib=_null_; 
    proc fcmp library=mylib.funcs; 
     listfunc calc gen_str; 
     run; 
    Quit; 

    /*using func*/ 
    options cmplib=mylib.funcs; 
     data _null_; 
     numret=calc(20); 
     charret=gen_str('what', 'is', 'your'); 
     put numret= charret=; 
    run; 

    /*delete the func*/ 
    options cmplib=mylib.funcs; 
    proc fcmp outlib=mylib.funcs.rule; 
    deletefunc calc; 
    run; 
    quit;