2016年9月28日水曜日

ADempiereの読み取り専用ロジック

ADempiereでは、GUIから画面やテーブルを作成できる。

テーブルの列の設定では、その項目が読み取り専用かどうかを設定できる。
ここに、「Y」を設定すれば、読み取り専用の列となり、「N」を設定すれば更新可能な列となる。

さらに、応用的な設定方法としては、ここにちょっとしたロジックを記述して、
ある条件のときだけ、読み取り専用の列としたりすることも可能である。

このロジックを読み取り専用ロジックと呼んでいるが、
ここに設定するロジックでは、なんでも記述できるわけでないので注意が必要である。
このページの最後に、詳細な定義は記述したが、まとめると以下のようになる。


・コンテキストを使うときは、普通に記述できる。
ex. @C_BPartner_ID@

・かつ条件とまたは条件は、「&」「|」のひとつでいい。
 このへんは、Javaだと「&&」「||」なので、注意が必要。

・「=」の反対の「~でない条件」は、「!」でいい。
これも、ちょっと変わっているので注意が必要。(「!=」でもなく、「<>」でもなく、「!」だけ)
ex. @C_BPartner_ID@!0


・右辺でコンテキストは使えない。(コンテキスト同士の比較はできない)
@C_BPartner_ID@=@C_BPartner2_ID@ みたいなことはできないようだ。

・結局、サンプルにあるように
   Example '@AD_Table@=Test | @Language@=GERGER
のような条件式が適当な使い方になりそう。
複雑なロジックを使う場合は、新たな列を使って、その列にロジックを埋め込んで、その結果を読み取り専用ロジックで使うといったやり方になりそう。



詳細は、以下。

=========================================================
http://wiki.adempiere.net/Read_Only_Logic
=========================================================

The content here is parsed by the AD engine as stated in the APIdoc of the code for ReadOnlyLogic (GridTab.isReadOnly() - Boolean evaluateLogic):

 *  Evaluate Logic.
 *  <code>
 *  format      := <expression> [<logic> <expression>]
 *  expression  := @<context>@<exLogic><value>
 *  logic       := <|> | <&>
 *  exLogic     := <=> | <!> | <^> | <<> | <>>
 *
 *  context     := any global or window context
 *  value       := strings can be with ' or "
 *  logic operators := AND or OR with the prevoius result from left to right
 *
 *  Example '@AD_Table@=Test | @Language@=GERGER
 *  </code>
 *  @param source class implementing get_ValueAsString(variable)
 *  @param logic logic string
 *  @return logic result