ボタン名と表示条件(表示制御)最終更新日: 2021年3月1日
R8 | R9

ボタン名の変更例

ボタン名に式を適用した例を図1,図2に示します。ログオンアカウントによってボタン名が変わります。

図1 システム管理者が利用する場合はボタン名が「管理者登録」になる
図2 一般が利用する場合はボタン名が「一般登録」になる

ボタン名の定義方法

各画面に用意された「ボタン表示」の「ボタン名」は固定の名称だけでなく式が設定できます。

図3 ボタン名の設定

固定名称を指定する場合

ボタン名をそのまま指定します。

スケジュール登録

式を用いる場合

式の計算結果の戻り値の型が文字列型となるようにします。

IF(EXACT(USERNAME(),"admin"), "管理者登録","一般登録")

式の詳細は「計算式」をお読み下さい。

ボタン表示条件

「ボタン表示条件」を設定すると、条件に合致した場合にのみ、当該ボタンが画面に表示されるようになります。図4は "日付が本日以降の場合" という条件を指定した例です。

DATE(${sdate})>=DATE(TODAY())

式の戻り値は真偽値としてください。trueまたはfalseが戻るようにします。

図4 日付を条件に適用した

項目の表記ルールは自動計算式と同じです。モデル参照項目の場合、ID部を取得したい場合は#idを付与してください。

次のコードはモデル参照項目 DONEFLAG の ID が 0 かどうかを判定するものです。

${DONEFLAG#id}==0

条件となる項目の値に連動してボタンの表示・非表示を制御する

図4の例では、新規登録画面を開いた時に条件に合致しなければ、登録ボタンは非表示となります。その後、条件となる日付項目を入力しても、ボタンは非表示のままです。

この動作を修正し、条件となる項目の値に連動してボタンの表示・非表示を制御させる場合は、図5に示すように(条件となっている項目について)「値変更時に画面を再描画する」設定を有効にします。

この設定を行うと、当該項目の値が変更されるたびに、フォームの値を再送信するようになります。ボタン表示判定の制御はサーバ側で行います。

図5 値変更時に画面を再描画する

条件式の記述例

項目 item の値が 1 のとき、登録ボタンを表示する

${item}==1

項目 item の値が "東京" のとき、登録ボタンを表示する

EXACT(${item}, "東京")

EXACT関数は文字列の比較を行います。

モデル schedule について、権限 "perm_button" を持っている利用者が操作する場合にボタンを表示する

HASMODELPERMISSION("perm_button", "schedule")

HASMODELPERMISSION関数は、利用者が指定した権限を有しているかどうかを返します。

プリンシパル "publicuser" を持っている利用者が操作する場合にボタンを表示する

HASPRINCIPAL("publicuser")

管理者のみボタンを表示する

HASPRINCIPAL("all")

allは管理者権限を意味します。

管理者権限でログオンしたとき、HASPRINCIPAL 関数は常にtrueを返します。そのため、管理者権限のみボタンを表示する、という場合、カッコ内に与える引数(プリンシパル名)は実際にはなんでもよい、ということになります。しかし他のプリンシパルと区別するため、上記のように all と指定することを推奨します。

検索条件の値を用いる

ボタン表示制御の式に特別表記 ${cond.項目名} を指定することができます。 「検索の実行」ボタンを押すことで検索条件部の値を用いて判断します。

例えば一覧帳票を出力する際、検索結果により帳票出力ボタンの制御するために、次のような式を記述することができます。

検索項目 item1 の値が "A" の場合:

EXACT(${cond.item1},"A")

検索項目 status がモデル参照項目で、そのID部の値が 1 の場合:

${cond.status#id}==1

検索項目 num が整数型項目で範囲検索が有効となっており、その値が 1 の場合:

${cond.num1jshparam}==1

数値および日付型で範囲検索が有効の場合、開始の項目には接尾語 "1jshparam" を、終了の項目には "2jshparam" を付与してください。

外部キー関係での式の扱い

外部キー関係では、親モデルの画面に複数の子モデルを一覧表示することができます。
この場合のボタン表示制御は次のルールになります。

  • 条件式に含めることができる項目は親モデルになります。
  • ただし、親からみた子の一覧表示として、"子モデル_lp" という表記が利用できます。

例:「外部キー連携>表示条件」で、親モデルの項目 item1 の値が 100 より大きい場合に子モデルの新規登録ボタンを表示する。

${item1} > 100

例:この親モデルに紐づく子モデルの数が 3 未満のとき、子モデルの登録ボタンを表示する。

COUNT(${support_lp}) < 3

COUNT関数は、子レコードの総数を返します。

図6 外部キー連携でのボタン表示制御

ボタン名を式で制御する例も示します。子モデルの数によってボタン名が変わります。

IF(COUNT(${support_lp})==2,
    "あと一つ",
    IF(COUNT(${support_lp})==1,
        "あと二つ",
        "あと三つ"
    )
)

制約

この指定は子モデル一覧更新画面の「新規」ボタンには反映されません。
(一覧更新画面の「新規」ボタンの制御には未対応です。)

一覧表示(行)の扱い

親モデル customer と子モデル support が外部キーで連携している例で説明します。

親モデル customer の一覧表示画面で、各行に用意する独自ボタンに表示条件として、自身に紐づく子モデル (support) の COUNT 関数を用いることを想定します。図8の条件式 COUNT(${support_lp})>0は機能しません。

図8 一覧表示(行)ボタン表示制御 - うまくいかない例

回避策

親モデル customer の項目に COUNT(${support_lp}) を保持させます。これを supportcount 項目として用意した場合、次のように記述してください。${supportcount}>0

図9 一覧表示(行)ボタン表示制御 - 正しく動作する例

親-子-孫の扱い

親モデル parent、子モデル child、孫モデル gchild がそれぞれ外部キーで連携している例で説明します。

子モデル child の項目 citem1 に、自身に紐づくモデル gchild の数をかぞえる式COUNT(${gchild_lp})を設定したとします。ここで citem1 をデータベースに保存しない設定とします。

親モデル parent の詳細表示画面に子モデル child を表示させることができますが、child の項目 citem1 の値は計算されません。 これは親モデルの詳細表示では、子モデルの値を取得しますが、孫モデルの値までは取得しないということを示します。パフォーマンス上の問題を回避するため、標準では孫以降の値は取得しません。

回避策

  • 子モデルの項目 citem1 をデータベースに保存する、とします。
  • 式に代わって、スクリプトで citem1 の値を設定します。スクリプトでは孫モデル gchild の件数を EntityService を使って取得するようにします。