モデルの操作

最終更新日: 2022年10月3日

モデル操作ブロック

モデルを操作するブロックを選択し、ワークスペースにドラッグ&ドロップします。

モデル操作ブロック(1)

操作は「登録」「更新」「削除」「取得」の4つのパターンが用意されています。

モデル操作ブロック(2)

取得(1つ)

ここでは例として、注文モデルを登録するタイミングで、(注文モデルと関連のある)商品モデルの在庫数を取得するスクリプトを記述してみます。

商品モデルには「在庫数」を用意しています。

商品モデル

注文モデルは、商品モデルを参照しています。

注文モデル
注文モデル 商品ID
注文モデル 商品名

取得したいモデルを指定し、操作を「取得」とすると、ブロックの形が変わります。取得操作では、どのデータを取得するかを一意に定めるために主キーの指定が必要になります。

取得操作を指定する(1)

ワンポイント

このブロックは主キーで指定したデータが存在しなかった場合、エラーメッセージを画面に表示し、処理を終了します。データが存在しない可能性がある場合は次節「取得(リスト)」の説明をお読みください。「検索条件を指定してモデルのデータを取得する」ブロックを使います。

今回の例では「注文」モデルが「商品」モデルの主キーを保持しています。そこでモデルブロック群から自分自身のモデルを選択し、モデル操作ブロックのID部に配置します。

※ このように、対象モデル(ここでは「注文」モデル)が、モデル参照(ここでは「商品」モデル)を行うという関係があれば、この「モデル取得」ブロックが使えます。

はじめに「主キー」ブロックを配置します。

主キーブロック (1)
主キーブロック (2)

ブロックの左側の部分に、取得しようとしているモデル(ここでは「商品」)の主キー項目を指定します。

主キーブロック (3)

ブロックの右側の部分には、商品モデルの主キーである商品IDの値をセットします。今回は注文モデルの商品ID項目が該当します。

主キー商品IDの値をセットする (1)
主キー商品IDの値をセットする (2)

取得したデータの扱い

ここで取得した「商品」を、ブロックの中で扱うことができます。
例として、取得した値(商品の在庫数)を変数に保存してみます。スクリプトの中で作成した「変数」は、このスクリプトの内部だけで利用できます。

ここでは "在庫" という名前の変数を作成してみます。

変数ブロック群から変数の作成を行う
在庫変数の作成(1)

新たに作成した変数が利用できるようになります。

在庫変数の作成(2)

なお、変数名を選択してマウスの右クリック操作を行うと、変数名の変更や削除を行うことができます。

変数の名前変更や削除も行える

それでは取得ブロックで入手した在庫数を、変数に格納するセットブロックを用意しましょう。取得ブロックの内部に、一つ以上の文を含めることができます。

値をセットする文

取得ブロック内に文を含めるようにします。

ブロック内に文を含める

セットブロックの右側に、在庫変数にセットする値(商品モデルの在庫数)を指定します。

在庫変数に値をセットする(1)
在庫変数に値をセットする(2)

在庫数が0以下の場合、エラーとする例

在庫数が0以下なら、注文の新規登録を失敗させる処理を加えてみましょう。

「条件判断ブロック群」から、「もし...ならば」ブロックを使って、在庫変数の値が0以下ならば、を用意します。

在庫変数が0以下ならば

「文ブロック群」から「エラーメッセージ表示」ブロックを選択します。

エラーメッセージ表示ブロック

「もし...ならば」ブロックが成立した場合に、エラーメッセージブロックを実行するよう、配置します。

エラーメッセージブロックを配置する

「文字列ブロック群」から文字列ブロックを選択し、エラーメッセージとして配置します。

エラーメッセージ文字列を設定する

動作イメージを示します。在庫数不足の場合、エラーメッセージが表示され、注文の新規登録は行われなくなります。

注文処理が失敗した例

自分自身を操作することはできません

モデル操作ブロックに表示される対象モデル一覧に、自分自身(のモデル)は含まれません。

取得(リスト)

「取得(リスト)」は「検索条件を指定してモデルのデータを取得する」ブロックを使います。戻り値はリストです。リストとは、複数の値が格納された集合のことです。

検索結果をリストに格納する

このブロックには「検索条件」と「ソート(並び順)」を追加することができます。未指定の場合は全件検索で、並び順は不定、となります。

検索ブロックに付与できるさまざまなブロック群

範囲検索条件を一つ加えた例を示します。検索条件は左側のブロックに「(自モデルの)対象項目」を、右側のブロックに条件値(または条件値を保持しているモデル項目)を指定します。特に範囲検索の場合は「〜から〜まで」を指定するため、右側のブロックは二つ指定します。

範囲検索の指定

ブロックを選択し、「外部入力」形式に変更することもできます。ブロックの並びが複雑になる場合、見通しのよい形式に変えることができます。

ブロックの形式を変更する

ブロックの形状は変わりますが、意味は変わりません。

範囲検索の指定 - 外部入力形式

検索条件は「かつ」「または」ブロックを組み合わせることができます。次の例は「予約開始日付時刻」と「予約終了日付時刻」のいずれかで絞り込んでいます。

範囲検索の指定(2)

さらに「施設予約」項目でも絞り込むという条件を含めた例を示します。ここで「施設予約」項目はモデル参照型で、参照先モデルの主キーはID(整数型の順序)です。モデル参照で、参照先モデルの主キーが整数型の場合は、TOLONG関数で項目を囲むようにしてください。

モデル参照項目を検索条件に加える時、参照先モデルの主キーが整数型の場合はTOLONG関数で囲む必要がある
参照先モデルの主キー項目の型が「文字列」の場合、TOLONG関数で囲む処理は不要です。

検索結果

検索結果はリストとなっています。結果が一つであってもリスト形式であり、リスト内に(結果が)一つだけある、という状態です。整理すると次のようになります。

検索結果説明
なし検索結果に合致するデータが見つからない。リストの長さがゼロになる。
1件リストに1つのデータが格納されている。
2件以上リストに複数のデータが格納されている。ソート順を指定していた場合は、指定したソート順に並んでいる。ソート順を指定しない場合は、並びは不定である。

例えば検索結果が1件以上ある場合にエラーとする、という場合は次のようなブロックになります。

リストの長さを確認する

取得時のロック

モデルデータの取得時にロックをかけることができます。取得したデータを更新する予定の場合、読み込み時にあらかじめロックを行うとよいでしょう。

ロックを行う

ロックを行おうとした対象データがすでに別の利用者によって変更中の場合、ロック失敗となります。画面にエラーメッセージが表示され、このスクリプトはキャンセルされます。

スクリプトの処理が終了するタイミングで、ロックは自動的に解放されます。(正常終了、異常終了のいずれでもロックは解放されます。)

更新

注文モデルの新規登録時に、関連する商品モデルの値を更新するブロックを使ってみます。

(上述した)取得モデルの説明にあるように、どの商品モデルを更新するかを特定するための主キーを指定します。主キーの指定方法は「取得ブロック」と同じなので説明を割愛し、図だけを掲載します。

商品モデルを更新するブロックを用意する

自分自身(ここでは商品モデル)の値を書き換えるため、更新ブロックのギアアイコンをクリックし、左側に用意された処理ブロックを右側にドラッグ&ドロップします。

処理ブロックの配置(1)
処理ブロックの配置(2)

追加した処理ブロックの左側の選択肢は、自分自身(ここでは商品モデル)の項目を指定することができます。ここで指定した項目に対して、値をセットすることができます。

値をセットしたい項目を選択する

ここでは現在の在庫数から、注文数量を減らします。「数値ブロック群」から四則演算ブロックを選び、配置します。

在庫数を減らす処理

更新ブロックでは複数の項目を更新することができます。ギアアイコンから、処理ブロックを選択し、ドラッグ&ドロップで処理を追加します。

処理ブロックを追加する

商品モデルの最終更新日項目に、処理時点の日付をセットした例です。Wagbyが提供する日付時刻型関数TODAYを使っています。

最終更新日をセットする

自分自身を操作することはできません

モデル操作ブロックに表示される対象モデル一覧に、自分自身(のモデル)は含まれません。

登録

注文モデルの子モデルとして、注文変更記録モデルを用意したとします。(親子関係の詳細は、こちらをお読みください。

注文変更記録モデル

注文モデルの更新時に、変更記録明細を1件、自動的に作成するというスクリプトを用意してみます。

登録処理を行うブロックを用意する

登録時に、対象モデル(ここでは注文明細モデル)の内容をセットすることができます。

はじめに、親モデルの主キーである注文IDを、子モデル(注文明細モデル)の外部キー項目にセットするブロックを用意します。親子関係では外部キーの設定は必須です。そのため外部キーをセットするブロックは常に用意するようにしてください。

外部キー項目をセットする

その他の項目に値を設定することもできます。今回は「日付」「最終数量」項目はいずれも読み込み専用とし、注文内容の変更が生じた際に自動記録されるようにしています。

その他の項目をセットする

注意

スクリプトの実行タイミング「登録(初期データ作成)」で、子モデルを作成することはできません。初期データ作成のタイミングでは、親モデルの主キーに順序値が割り当てられていないためです。そのため子モデルの外部キー項目をセットできず、親子関係の紐付けが成立しません。

実行例

注文の新規登録直後は、変更記録がありません。

注文の新規登録直後(変更記録なし)

注文内容(数量)の変更が発生しました。更新画面を開き、数量を変更します。数量以外の項目はすべて更新画面で読み込み専用を設定しています。

注文内容の変更

更新のタイミングでスクリプトが実行されます。変更記録が自動的に追加されます。(更新の都度、この変更記録は1件ずつ追加されます。)

注文変更完了と同時に変更記録が追加される

自分自身を操作することはできません

モデル操作ブロックに表示される対象モデル一覧に、自分自身(のモデル)は含まれません。

削除

削除対象のモデルと主キーを指定することで、指定した主キーのデータを削除することができます。

削除ブロック

削除ブロックで、削除するデータの値を変更することはありません。ブロックの中身は空白のままとしてください。

ブロックの中身に値をセットするブロックを設定しても、無視されます。つまり機能しません。
削除ブロックでは値の変更ブロックは無視される

自分自身を操作することはできません

モデル操作ブロックに表示される対象モデル一覧に、自分自身(のモデル)は含まれません。

子モデルの取得

注文モデルと、注文明細モデルを用意します。これは親子関係とし、注文モデルの「合計」欄は、注文明細モデルの各行の「小計」の合算とします。

注文明細モデル

注文明細モデルの「小計」は、単価と数量の積です。

注文明細モデルの小計

注文モデルの「金額」項目に、ブロックの組み合わせで合計欄をセットするようにします。はじめに「合計金額」を表す変数を用意します。

合計金額を表す変数を作成する

「子モデル...のデータを取得する」ブロックを用意します。このブロックは親子関係となっているモデルの「親」側で利用することができます。このブロックは通常、複数のモデルを扱うため、「リスト」ブロックを使ってループ処理を行うようにします。

「子モデル...のデータを取得する」ブロック

ループ処理で合計金額を算出します。最後に、合計金額を注文モデルにセットしています。

合計金額を求める

実行例

注文明細(子)の小計から、注文(親)の合計が計算される例です。

注文明細(子)の小計から、注文(親)の合計が計算される

親モデルの取得

子モデルのスクリプトで、親モデルの値を確認したいときに利用できるブロックです。具体的には親子同時更新画面の子モデルでのみ利用できます。

子のスクリプトで、親を参照する

注意

親子同時更新画面でない場合、親モデルを参照することができません。そのため上の例のように、スクリプトでは親モデルの取得が成功したかどうか(nullでないかどうか)を必ず行うようにしてください。

複合主キーの扱い

複合キーモデルを操作する場合、複数の主キーを使います。

例を示します。「商品」モデルが商品コードと国コードの複合主キーになっているものとします。(国コードは選択肢モデルとして用意しています。)

商品コードと国コードによる複合キーモデル

「注文明細」モデルは、商品モデルを参照しています。3行目の「商品」項目が商品モデルを参照しています。このとき、商品モデルの各主キー項目(商品コードと国コード)をルックアップでそれぞれ用意しておきます。これらは内部で利用するための項目なので、表示上は隠し項目としておきます。

注文明細モデルではルックアップで商品モデルの各主キー項目をもっておく

「商品」項目は、商品モデルを参照します。

商品項目は商品モデルを参照する

「商品コード(隠し)」と「国コード(隠し)」はルックアップで値を保持します。入力と出力のいずれも隠し設定を行います。また、これらはデータベースに保存する必要もありません。

商品コード項目は隠し、かつデータベース保存なし
国コード項目も隠し、かつデータベース保存なし

ワンポイント

ルックアップ項目は標準ではデータベースに保存されないようになっています。

「注文明細」モデルの登録タイミングで、在庫の確認を行う処理を加えてみます。商品のデータを取得するブロックをワークスペースに配置します。

商品のデータを取得するブロック

タイミングを登録とする理由

この注文(親)と注文明細(子)は、親子同時更新機能を使っています。このとき注文明細(子)は一覧更新機能で編集しますが、一覧更新では入力チェックスクリプトが動作しません。登録タイミングでエラー扱いとすることで、入力チェックと同等の処理を実現できます。

商品モデルを取得するためには二つの主キーの値を指定する必要があります。そこで「主キー項目設定」ブロックを使います。単一主キーの場合は、このブロックは使いません。複合キーの場合に使います。

主キー項目設定ブロック (1)

このブロックを取得ブロックの主キー部分に含めます。これによって、主キー項目設定ブロックの右側に、複数の主キー項目を設定できるように拡張されます。

主キー項目設定ブロック (2)

商品モデルの二つの主キー「商品コード」と「国」を設定するブロックを配置します。

二つの主キー (1)

この値は、注文明細モデルの隠し項目にそれぞれ用意されたものを使います。

二つの主キー (2)

商品モデルの現在個数と、注文しようとしている数量の差を比較し、在庫不足であればエラーとするスクリプトを用意した例です。

在庫を確認するスクリプト

実行例

注文モデルの新規登録時、注文明細で指定した商品の在庫数不足の場合、エラーメッセージが表示されます。

在庫を確認するスクリプトの動作例

トラブルシューティング

「モデル」ブロック群に、使いたいモデルが表示されない

そのモデルがビルドの対象から解除されていないか、確認してください。モデル一覧の「ビルド」という列にチェックがついているモデルが、利用可能です。