2016-09-21 9 views
3

私はSASのPROC FCMPを使用して、記録用の関数を書き出しています。これらは共有ディレクトリのデータセットに保存されるため、私の同僚はそれらを使用できます。ほとんどの場合、関数は同じディレクトリ内のルックアップテーブルをハッシュする単なるラッパーです。PROC FCMPでデータをハッシュするときにlibnameが保証されない

簡体例:

Libname OurStuff "path/to/shared/data"; 

DATA OurStuff.foobar; 
    foo = 1; 
    bar = 2; 
Run; 

PROC FCMP outlib = OurStuff.functions.lookup; 
    Function recode_foo(foo); 
     Length bar 8; 
     Declare hash foobar(dataset: "OurStuff.foobar"); 
     rc = foobar.defineKey("foo"); 
     rc = foobar.defineData("bar"); 
     rc = foobar.defineDone(); 
     rc = foobar.find(); 
     Return(bar); 
    Endsub; 
Run; 

関数は、元のlibnameにして動作します:

Options cmplib = OurStuff.functions; 
DATA _NULL_; 
    result = recode_foo(1); 
    Put result =; 
Run; 

しかし、誰かが異なるlibnameをを使用している場合、それはしません:

Libname OurStuff clear; 
Libname WildName "path/to/shared/data"; 
Options cmplib = WildName.functions; 

/* Results in "ERROR: Libref OURSTUFF is not assigned" */ 
DATA _NULL_; 
    result = recode_foo(1); 
Run; 

です誰もが同じlibnamesを使用することを主張する以外に、これらの関数が常に機能することを確認する方法がありますか?

答えて

3

datasetは文字列なので、実行時に決定できます。したがって、それを関数のパラメータとして渡すことができます。libnameかデータセット文字列全体のどちらかです。

PROC FCMP outlib = OurStuff.functions.lookup; 
    Function recode_foo(foo,dset $); 
     Length bar 8; 
     Declare hash foobar(dataset: dset); 
     rc = foobar.defineKey("foo"); 
     rc = foobar.defineData("bar"); 
     rc = foobar.defineDone(); 
     rc = foobar.find(); 
     Return(bar); 
    Endsub; 
Run; 
+1

FUNCTION文でDSET後に$が必要です。 – Tom

+0

@Tom良いキャッチ - 私は実行可能な例を好む理由の1つ(私は秒を持っているときに私は1つを作るでしょう) – Joe

+0

@ジョーその答えはうまくいくでしょうが、私はもっとルックアップ関数に余分な引数を追加するよりエレガントなものを望んでいた。 データセット名は信頼できるので、データ格納のライブラリを提供すれば十分です: '関数recode_foo(foo、lib $)'。このようにして、ライブラリをネストされた関数に渡すこともできます。ネストされた関数には、どこから見えるかを知る必要があります。 –

関連する問題