今回は、「SharePointリストで、【マスターテーブル】のように親子関係をリレーションで設定したときに、マスタ(親)を更新するとテーブル(子)の値がどう変化するのか。」を試してみました。
Dataverseを利用しておらず、Microsoft 365のみの利用の場合、PowerAppsのデータベースとしてSharePointリストを選択することもあると思います。
ある程度はアプリケーション側で制御するとしても、できる限りSharePointリスト側でコントロールしてくれると助かります。
マスタ(親)の作成
SharePoint Onlineで、マスタ(親)となるリストを作成します。
ありきたりですが、商品マスター購入履歴というリレーションで試してみます。
タイトル列を「商品名」として、「商品コード」列を作成しました。
「単価」列を追加します。
商品の有効・無効を設定する列を追加しました。
商品を使わなくなった時点で、無効とするイメージです。
とりあえず、商品マスタは上記のようになりました。
テーブル(子)の作成
続いて、テーブル(子)となるリストを作成します。
購入履歴を管理します。
早速、リレーション(参照)の設定を行います。
列の追加で、「その他」を選択します。
列名を「商品」として、種類を「参照」とします。
商品マスタと連携します。
列の追加設定はは、上記の通りです。
取得する列は「Title」=「商品名」として、同時に「単価」列の値も取得します。
リレーションシップの動作は、「制限削除」とします。
これで、商品マスタのアイテムが削除されても、購入履歴テーブルは連鎖削除されません。
その他、「購入日」「購入者」列を上記の通り追加しました。
「購入履歴」テーブルは上記の通りです。
購入履歴テーブルにデータを追加
作成した購入履歴テーブル(子)にデータを追加します。
「商品」列を入力しようとすると、「商品マスタ」の値が自動表示されました。
リレーションがうまくいっているようです。
入力すると、「商品:単価」も自動入力されました。
これは、リレーション設定時に同時に取得するよう設定したからです。
商品マスタの値を変更
マスタ(親)変更時に、テーブル(子)の値がどのようになるのか(そのままか・連鎖更新されるのか)を確認するために、商品マスタの値を変更します。
商品マスタの「単価」の値を¥1,980から¥2,980に変更します。
変更が完了しました。
購入履歴テーブルを見てみると、「商品:単価」の値は“更新”されていました。
SharePoint Onlineでは、マスタの値を変更するとテーブルの値も更新されるようです。
リレーションで同時取得してきた値をもとに、自動計算できるか
続いて、購入履歴テーブルに「購入数」「購入金額」という列を追加します。
「購入単価」×「購入数」=「購入金額」という自動計算を設定します。
「購入数」列を上記の通り追加します。
購入金額は、その他から「集計値(他の列を基にした計算結果)」とします。
数式を入力しようとすると、商品マスタから取得した「商品:単価」がありません。
また、商品マスタから取得した「商品名」もありません。
どうやら、リレーションを設定した値はあくまで”参照”値であり、購入履歴テーブル側に実体はないようです。リストIDでリレーションされているだけで、値をコピーしているわけではないということです。
それであれば、マスタの値を変更した際に、テーブル側も見た目上は”更新”される(されているように見える)のも納得です。
このような仕様を理解していないと、今回のようにマスタ側に単価を持たせてしまい、後ほど計算できないということになってしまいます。SharePointの機能ではなく、PowerAppsなどのアプリ側でコントロールしなければいけません。
自動計算部分の修正
マスタの値では計算ができなかったので、購入履歴テーブルに商品単価を持たせます。
上記のように、購入履歴テーブルに「商品単価」列を追加しました。
購入金額の集計値設定を変更します。
今回は数式で[商品単価]*[購入数]の設定ができました。
「購入金額」列が自動計算されているのも確認しました。
コメント