【SharePoint Online】リストで参照・リレーション時の連鎖更新について試してみた

ICT

今回は、「SharePointリストで、【マスターテーブル】のように親子関係をリレーションで設定したときに、マスタ(親)を更新するとテーブル(子)の値がどう変化するのか。」を試してみました。

Dataverseを利用しておらず、Microsoft 365のみの利用の場合、PowerAppsのデータベースとしてSharePointリストを選択することもあると思います。

ある程度はアプリケーション側で制御するとしても、できる限りSharePointリスト側でコントロールしてくれると助かります。

 

マスタ(親)の作成

SharePoint Onlineで、マスタ(親)となるリストを作成します。

ありきたりですが、商品マスター購入履歴というリレーションで試してみます。

タイトル列を「商品名」として、「商品コード」列を作成しました。

「単価」列を追加します。

商品の有効・無効を設定する列を追加しました。

商品を使わなくなった時点で、無効とするイメージです。

とりあえず、商品マスタは上記のようになりました。

 

テーブル(子)の作成

続いて、テーブル(子)となるリストを作成します。

購入履歴を管理します。

 

早速、リレーション(参照)の設定を行います。

列の追加で、「その他」を選択します。

 

列名を「商品」として、種類を「参照」とします。

商品マスタと連携します。

 

列の追加設定はは、上記の通りです。

取得する列は「Title」=「商品名」として、同時に「単価」列の値も取得します。

 

リレーションシップの動作は、「制限削除」とします。

これで、商品マスタのアイテムが削除されても、購入履歴テーブルは連鎖削除されません。

 

その他、「購入日」「購入者」列を上記の通り追加しました。

 

「購入履歴」テーブルは上記の通りです。

 

購入履歴テーブルにデータを追加

作成した購入履歴テーブル(子)にデータを追加します。

「商品」列を入力しようとすると、「商品マスタ」の値が自動表示されました。

リレーションがうまくいっているようです。

入力すると、「商品:単価」も自動入力されました。

これは、リレーション設定時に同時に取得するよう設定したからです。

 

商品マスタの値を変更

マスタ(親)変更時に、テーブル(子)の値がどのようになるのか(そのままか・連鎖更新されるのか)を確認するために、商品マスタの値を変更します。

商品マスタの「単価」の値を¥1,980から¥2,980に変更します。

 

変更が完了しました。

 

購入履歴テーブルを見てみると、「商品:単価」の値は“更新”されていました。

SharePoint Onlineでは、マスタの値を変更するとテーブルの値も更新されるようです。

 

リレーションで同時取得してきた値をもとに、自動計算できるか

続いて、購入履歴テーブルに「購入数」「購入金額」という列を追加します。

「購入単価」×「購入数」=「購入金額」という自動計算を設定します。

「購入数」列を上記の通り追加します。

 

購入金額は、その他から「集計値(他の列を基にした計算結果)」とします。

数式を入力しようとすると、商品マスタから取得した「商品:単価」がありません。

また、商品マスタから取得した「商品名」もありません。

 

どうやら、リレーションを設定した値はあくまで”参照”値であり、購入履歴テーブル側に実体はないようです。リストIDでリレーションされているだけで、値をコピーしているわけではないということです。

それであれば、マスタの値を変更した際に、テーブル側も見た目上は”更新”される(されているように見える)のも納得です。

このような仕様を理解していないと、今回のようにマスタ側に単価を持たせてしまい、後ほど計算できないということになってしまいます。SharePointの機能ではなく、PowerAppsなどのアプリ側でコントロールしなければいけません。

 

自動計算部分の修正

マスタの値では計算ができなかったので、購入履歴テーブルに商品単価を持たせます。

上記のように、購入履歴テーブルに「商品単価」列を追加しました。

 

購入金額の集計値設定を変更します。

今回は数式で[商品単価]*[購入数]の設定ができました。

 

「購入金額」列が自動計算されているのも確認しました。

 

 

一般的なアプリ開発の経験があると、リレーションの設定を自由に行えるような気になりがちです。しかし、SharePointリストをデータベース代わりとして使用する際は、その仕様を考慮しテーブル設計をすることが必要だと実感しました。

 

タイトルとURLをコピーしました