サポート > リポジトリ > 画面機能 > メインモデルとサブモデル

1つのモデルに対して複数の一覧表示画面、詳細表示画面、登録画面を作成することができます。

1つのモデルで複数の画面を作成する場合は、まずメインとなるモデル(以後「メインモデル」と呼びます)を定義した後に、その定義内容をコピーして新しいモデル(以後「サブモデル」と呼びます)を定義します。 1つのメインモデルに対して複数のサブモデルを用意することもできます。

図1 メインモデルとサブモデルの構成イメージ
  • 画面を複数用意できますが、データをやり取りするモデルそのものは1つです。
  • データベース上では、メインモデルとサブモデルは共通のテーブルが使用されます。
  • サブモデルはメインモデルのサブセットの関係にあるので、既存項目(主キーを除く)を削除して減らすことはできますが、メインモデルにない新たな項目を追加定義することはできません。[詳細...]

メインモデルを一つ選択します。

図2 メインとなるモデルを一つ選択する

ギアアイコンから「テンプレート > サブモデル」を選択します。

図3 サブモデルを作成する

標準では、モデル名に「- サブモデル」と付与されたモデルが新規で作成されます。モデルIDは「1」という数字が付与されます。

図4 サブモデルが作成された

サブモデルの定義を開きます。最初にモデル名、モデルIDを適切に変更してください。

図5 サブモデルのモデル名とモデルIDを変更する

ここでは項目名にすべて "[サブ]" という名称を加えてみました。(項目名は変更可能です。項目IDは変更できません。)
また、備考という項目を削除してみました。(サブモデルでは項目を減らすことはできます。)

図6 テストのためにサブモデルの定義を微修正する

はじめに、サブモデルからデータを登録してみます。

図7 サブモデルから操作する

図8は、サブモデルからデータを1件、登録した例です。

図8 サブモデルのデータを1件、登録した

続いて、メインモデルの検索を行なってみます。

図9 メインモデルの検索を行なう

メインモデルでは、サブモデルから登録したデータを共有できていることがわかります。(テーブルは1つなので、共有されています。)

図10 メインモデルの検索結果は、サブモデルと同じになっている

スマートフォン

スマートフォン版の画面は、PC版のサブセット(一部)という場合に適用できます。PC版のモデルをメインモデルとし、スマートフォンで使うモデルをサブモデルとします。サブモデルは、メインモデルの項目の一部、という扱いになります。

その上で、サブモデルに対して「スマートフォンで使う」設定を有効にします。

複数の一覧表示画面

サブモデルを使って、1つのモデルに複数の一覧表示画面を作成する、といったことができます。ユーザごとにアクセスする画面を分けたいという場合にも有効です。

セキュリティ

権限のあるユーザにはメインモデルを見せる、権限のないユーザには項目の少ないサブモデルを見せるという設計に適用できます。

サブモデルを使って、ユーザの権限ごとに操作できる画面を分ける例を紹介します。

この例では「山田」「鈴木」という二つのアカウントを用意しています。

アカウントプリンシパルモデル
山田顧客管理顧客 (メインモデル)
鈴木一般顧客(一般ユーザ用) (サブモデル)

図11は、ユーザ山田による顧客の一覧表示画面の操作例です。

図11 顧客一覧表示

図12は、ユーザ鈴木による顧客の一覧表示画面の操作例です。このサブモデルは「電話番号」項目が含まれていません。

図12 顧客(一般ユーザ用)一覧表示

図13、図14は、それぞれのユーザのプリンシパルを示しています。

図13 ユーザ山田は、プリンシパル「顧客管理」をもつ。
図14 ユーザ鈴木は、プリンシパル「一般ユーザ」をもつ。

プリンシパルに応じて、操作できるモデルを変えることができます。ユーザ山田とユーザ鈴木では、ログオン後のメニューに表示されるモデルが異なります。ユーザ山田はメインモデルを、ユーザ鈴木はサブモデルを操作します。

図15 ユーザ山田はメインモデル「顧客」を操作できる
図16 ユーザ鈴木はサブモデル「顧客(一般ユーザ用)」を操作できる

なお、システム管理者はすべてのモデルを操作できます。

図17 システム管理者はメインモデル、サブモデルいずれも操作できる

定義方法

「顧客」モデルに対して、サブモデル「顧客(一般ユーザ用)」を用意しました。(参考:サブモデルの作成方法)

図18 「顧客」と「顧客(一般ユーザ用)」モデル

図19はメインモデル「顧客」、図20はサブモデル「顧客(一般ユーザ用)」です。サブモデルは「メールアドレス」と「電話番号」を削除したものとなっています。

図19 メインモデル「顧客」
図20 サブモデル「顧客(一般ユーザ用)」

権限の設定

メインモデル「顧客」に最初から備わっていたプリンシパル「一般ユーザ」を削除します。

図21 プリンシパル「一般ユーザ」を削除する

新しいプリンシパル「顧客管理」を用意します。すべての操作を許可します。

図22 プリンシパル「顧客管理」を追加する (1)
図23 プリンシパル「顧客管理」を追加する (2)

サブモデル「顧客(一般ユーザ用)」のプリンシパルは、更新系の権限を無効とします。これによって閲覧のみが行えるようになります。

図24 サブモデル「顧客(一般ユーザ用)」のプリンシパル (1)
図25 サブモデル「顧客(一般ユーザ用)」のプリンシパル (2)

サブモデルを作成したあと、(自身の)メインモデルを変更することができます。 「画面 > その他 > モデルの関連性」から「メインモデル名」を指定します。

図11 メインモデル名を変更する

顧客(サブモデル)の一覧表示画面を図12に示します。ここで「詳細」ボタンを押下すると、顧客(メインモデル)に遷移します。(図13)

図12 顧客(サブモデル)一覧画面
図13 顧客(メインモデル)詳細画面

定義方法

サブモデルを用意します。

図14 サブモデルを用意する

サブモデルの「画面 > 検索・一覧表示 > 詳細ボタン」で、「遷移先モデルID」から自身の親モデルを指定します。

図15 遷移先モデルIDを指定する
この機能は、遷移先対象は親モデルには限定されません。主キー(名前、型)が同じであれば、異なるモデルへ遷移させることもできます。

外部キー連携における子モデル一覧表示の場合

外部キー連携において、親モデル詳細画面の下部に表示される子モデル一覧表示の「詳細」ボタンと「更新」ボタンの遷移先をそれぞれ指定できます。

図16 外部キー連携の設定
  • サブモデルはメインモデルの部分集合のため、テーブル構造が変わるような変更を行うことはできません。 よって、サブモデルを定義する場合、メインモデルで定義された以下の点は変更してはいけません。 (変更した場合は、ビルド時もしくは実行時にエラーとなります。)
    • 項目ID
    • 項目の型
    • 「データベース保存」対象の項目を追加すること。(データベース非保存の自動計算項目や参照連動項目等はサブモデルへ追加することができます。)
    • モデル項目定義シートの「リレーショナルデータベースの詳細」「必須チェック」等の設定について、メインモデルと異なる定義をすること(メインモデル、サブモデルともに同じ設定にする必要があります。)
  • サブモデルのサブモデルを定義することはできません。
  • サブモデルでデータの削除を行う場合、メインモデルに含まれる「モデル参照(チェックボックス)」「繰り返し項目」「繰り返しコンテナ項目」を必ずサブモデルでも用意してください。(サブモデルで不要な場合は、隠し項目とすると良いでしょう。)この対応を行わない場合、サブモデルからのデータ削除に失敗します。
  • メインモデルとサブモデルで、同じ項目に対してモデル参照先の項目を変更する場合、モデル参照先の「型」は同じとなるように配慮してください。
  • システムモデル(juserやjgroupなど)のサブモデルを作成することはできません。

サブモデルにメインモデルと違うグループ権限を設定することはできますか。

サブモデルにメインモデルと違うグループ権限を設定することは可能です。

例えば、メインモデルは権限3とし、サブモデル1は権限2、サブモデル2は権限3にするということができます。

項目の必須チェックはメインモデルとサブモデルで同じようにするという仕様ですが、「警告」はメインモデルとサブモデルで変えることはできますか。

必須チェックについては、指定する箇所に「○」「警告」「未指定」の3種類の値が設定可能です。「○」を設定した場合データベースのテーブル定義にて、対応する列にNOT NULL制約が設定されます。このため、いずれかのモデルに「○」を指定した場合、メインサブ関係にある他のモデルにも「○」を指定する必要があります。これは同じテーブルを使うためです。

警告や未指定は組み合わせることが可能です。例えば下記のようになります。

設定可能な組み合わせ

メインモデルサブモデル
警告警告
(未指定)警告
警告(未指定)
(未指定)(未指定)

設定できない組み合わせ

メインモデルサブモデル
警告
(未指定)
警告
(未指定)

メインモデルとサブモデルという関係ではなく、物理テーブルを共用することはできますか。

可能です。詳細は"モデル > データベースの詳細 > 物理テーブル名"をお読みください。

メインモデルとサブモデルの関係を設定すると、ロックやキャッシュは適切に制御されます。
Wagby Developer Day 2017