2016年2月10日水曜日

REPORTプロシジャ入門9:特定セルの書式設定【CALL DEFINE】




前回 「書式の設定【STYLE=】」 の応用。
「CALL DEFINE」 で、特定の行または列だけ書式を設定する事ができます。



基本構文

COMPUTE  対象変数;
           CALL DEFINE( "対象変数", "STYLE", "STYLE=[スタイル設定]");
ENDCOMP;


諸注意
  • STYLE=は、ODS LISTGNG出力先には対応していないので、ご注意下さい。
  • CALL DEFINEを複数定義すると、うまく適用できない場合があります(記事の最後に関連記事のリンク貼ってます)



では、例をみていきます。



列の書式設定 ①

proc report data=SASHELP.CLASS nowd;
    column NAME AGE ;
    define   NAME  / display;
    define   AGE    / display;
    compute AGE;
       call define( "AGE", "style", "style=[color=blue]" );
    endcomp;
run;


以下のように「_COL_」と書いてもOK

    compute AGE;
       call define( _COL_ , "style", "style=[color=blue]" );
    endcomp;

(こう書くと、COMPUTEステートメントに書かれた変数AGEが対象になる。)




列の書式設定 ②

proc report data=SASHELP.CLASS nowd;
    column NAME AGE HEIGHT;
    define   NAME    / display;
    define   AGE       / display;
    define   HEIGHT  / display;
    compute AGE;
       if AGE > 13 then call define("NAME","style","style=[color=blue]");
    endcomp;
run;


ここで注意!
NAMEに対する書式設定ですが、「compute NAME;」 ではなく 「compute AGE;」と指定しています。
なぜかというと、、以下ルールに従っているからです。


①  COMPUTEステートメント内で使われている変数はAGEとNAMEです。
②  このAGEとNAMEのうち、COLUMNステートメントで一番後ろに指定されている変数はAGEです。
③  よって 「compute AGE;」 とする。

ちなみに「compute HEIGHT;」としてもOK。
(COLUMNステートメントでHEIGHTの方がNAMEやAGEより後ろに指定されているから)




行の書式設定

proc report data=SASHELP.CLASS nowd;
    column NAME AGE HEIGHT;
    define   NAME    / display;
    define   AGE       / display;
    define   HEIGHT  / display;
    compute AGE;
       if AGE > 13 then call define( _ROW_, "style", "style=[color=blue]" );
    endcomp;
run;

_ROW_」で該当の行全体に対して書式設定を行います。



📝ちなみに、、

CALL DEFINEを複数定義すると、うまく適用できない場合があります。
【PROC REPORT】1つの項目に複数のCALL DEFINEを定義したい


インラインフォーマットを組み合わせると、更に自由度の高い書式設定が行えます。
ODS出力時に文字の書式設定をする【インラインフォーマット】


最後にCOMPUTEステートメントを使う上で超重要&ありがちな落とし穴もあるので、ちょっと前提知識必要になるけど、是非ご覧ください。
「PROC REPORT」の「COMPUTE」がうまく動かないんだけど
「PROC REPORT」の「COMPUTE」がうまく動かないんだけど②



REPORTプロシジャ入門記事一覧

1.基本構文【COLUMN, DEFINE】
2.ヘッダーの設定
3.並べ替え・グループ化【ORDER, GROUP】
4.集計【ANALYSIS】
5.転置集計【ACROSS】

0 件のコメント:

コメントを投稿