2015年7月26日日曜日

DS2プロシジャ入門7:ユーザー定義メソッド




ユーザー定義メソッドとは、自分で関数を作れるみたいなやつと思ってください。


構文
  method  メソッド名 ( 引数の定義1 , 引数の定義2 ・・・ )  returns 戻り値の型 ;
          return 戻り値 ;
  end;

いきなり構文みてもよく分かんないので、まずは簡単な例から。




簡単な例

proc ds2;
   data _NULL_ ;

     method TEST( double VAR1 ) returns double;
         return VAR1+10;
     end;
   
     method init();
         dcl double OUTVAR;
         OUTVAR = TEST(100);
         put '******' OUTVAR '******';
     end;
   
   enddata;
   run;
quit;

ログ
****** 110 ******


解説
TESTというメソッドを作って、これに数値を放り込むと、10足した値を返してくれる仕組みを作ってます。

まずは仕組み作り
method TEST( double VAR1 ) returns double;
    return VAR1+10;
end;

① 「method TEST」で TEST というメソッドを作ります。
メソッドに放り込まれてくる数値を 「( double VAR1 )」 でdouble型の変数VAR1が受け取れるようにします。
returns double」でメソッドの結果をdouble型で返すよう指定。

② 「return VAR1+10」で、VAR1に10足した値をメソッドの結果として返しています。

これで仕組み作り完了!今度はこのメソッドを使ってみます。


method init();
    dcl double OUTVAR;
    OUTVAR = TEST(100);
    put '******' OUTVAR '******';
end;

メソッドの使い方は普段使ってる関数と同じです。
OUTVAR = TEST(100)」でTESTメソッドに「100」を渡し、返された値を変数OUTVARに入れています。




実践例

以下はBMIを計算するメソッドを作っています。

proc ds2;
   data DT1 (overwrite=yes);
     dcl double VAR1;

     method BMI( double CM , double KG) returns double;
     CM :身長(cm) , KG :体重(kg) ;
        dcl double BMI;
        BMI = round( KG / ((CM/100)**2) ,.1);
        return BMI;
     end;
 
     method init();
        VAR1 = BMI(156,60);
        put VAR1;
     end;

   enddata;
   run;
quit;

DT1
  VAR1  
   24.7

実践例とは言いつつも、あんまりメソッドにする意味のない例かな、、




注意事項

メソッドの引数を CHAR, VARCHAR, NVARCHAR などの文字変数にする場合、必ずlengthも設定しましょう。

× method TEST( char X ) ・・・;
○ method TEST( char(20) X ) ・・・;

何故かというと、
引数が文字変数でlengthが設定されていないと自動で「length=8」に設定されます。
なので、メソッドを実行するときに、引数に8バイト以上の文字を指定しても、8バイトで切っちゃいます。




DS2プロシジャ入門記事

1: 基本構文
: 変数の宣言
3: 変数属性と配列の定義
4: データ型①

0 件のコメント:

コメントを投稿