プログラミング
逆引き
クライアントとの通信
VisMでの通信
Factoryでの通信
WebServiceでの通信
CSP (Cache' Server Pages)
Cache'SQL
設定・性能


【広告】









マクロを使ってプログラミングを効率化する

Use macro.

Cache' Object Scriptではマクロを使用することができます。
マクロとは簡単に言うと、コンパイル時にプログラムを整形する機能です。コンパイル時に処理されるので、実行の際に性能は低下しません。

#defineによる置き換え

マクロの中で最も使われるものが、#defineと$$$による文字列の置き換えです。
他の言語でいうCONSTと同じイメージです。

#define  宣言名  置換文字          で宣言し
$$$宣言名               をコンパイル時に置換文字に置き換えます。
// 次の行で TaxRate を宣言し、その値は1.08としている
// 消費税率 8%

#define 
TaxRate 1.08

getTaxPrice(val) Public {
    Quit val * $$$TaxRate  // この行は置き換えにより Quit val * 1.08 としてコンパイルされる
}
このプログラムをtest.macという名前で保存したとすると、プログラムは次のように動作します。
USER> Write $$getTaxPrice^test(1000)
1080
getTaxPrice関数に1000を渡すと、TaxRateの倍率1.05倍した値となる、1080が返されました。

消費税率が10%に変わった場合は、#defineの値を 1.08 から 1.10 に変更してから、ルーチンをコンパイルする必要があります。



#defineは定数の置き換えだけではなく、関数の呼出をすることができます。
#; $H形式をYYYYMMDD形式に変換する
#define 
Horo2YYYYMMDD(%horo) $ZDate(%horo,8)

test() Public {
  Set h = $H
  Write $$$Horo2YYYYMMDD(h) // この行はコンパイル時に Write $ZDate(h,8) に置換される
}
関数を置換対象とする場合、引数は%horoのように%付きで宣言する必要があります



さらに、#defineは定数や関数に限らず、コマンドまで含めて置換することができます。
#; CConsolelogに指定された重大度(%lv)でログ(%msg)を記録する
#define 
WriteCConsoleLog(%lv,%msg) Do $ZU(9,"",%msg,0,%lv)

test() Public {
    $$$WriteCConsoleLog(1,"書込みテスト")
}
これらを上手く使うと、プログラムの記述が効率化されると思います。

インクルードファイルの作成と使用

マクロを利用してプログラミングを行うと、複数のプログラムで同じマクロの宣言を行う場面が数多く出てきます。
こういった場合にはインクルードファイルと呼ばれるものを作成し、そこに共通で使用する宣言を記述すると便利です。

インクルードファイルは、次のような手順で作成します。
    1. Cache'スタジオのファイル→新規作成
    2. 一般タブのCache ObjectScriptルーチンを選択しOK
    3. ファイル→名前を付けて保存
    4. ファイル名欄に ファイル名.inc  ファイルの種類に インクルードファイル(*.inc) を選択し保存を実行する。

インクルードファイルの例


インクルードファイル AAA.inc を各プログラムで参照するには、次のように記述します。
MAC形式 #include AAA
CLS形式 Include AAA
CSP形式 <csp:class includes="AAA">
いずれも .inc は必要ありません。
記述する場所は各ファイルの先頭です。

システムのマクロ

ドキュメントを参照していると、クラスの戻り値が正常かどうか判定している部分で$$$OKというマクロを使用していることがよくあります。
これは%occStatus.incというシステム・インクルードファイルで定義されています。
%occSatus.incは%occInclude.incファイルから呼び出されています。
%occIncludeはclsでは自動的にインクルードされるもののようです。
mac形式では自動的にインクルードされないので、必要であれば #define %occInclude とファイル先頭に書くとよいでしょう。

そのほかのマクロ

#Define以外にも多くのマクロが用意されています。マニュアルへ
個人的には以下のものをよく使います。
#; コメント行。コンパイル時に明示的に除去されるのでコードをより小さくできる。
#if   #elseif  #else  #endif コンパイル時の分岐。環境ごとに実行コードを変化させたい場合に使用。
#Def1Arg 任意個数の引数を受け取る#Define。引数はカンマ区切りになる。
##Expression  ##Function コンパイル時の内容をコードに反映する。CSPの##(  )##と同様。
#Dim 変数の宣言。スタジオのメニュー→ツール→オプション→環境→クラス→Option explicit を ONにした場合に必要。


2016/08/03Update