18
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

PowerAppsで1万件を超えるデータを扱うときの動作を調べてみた

Last updated at Posted at 2021-01-06

#概要
SharePointリストをデータソースとするアプリでレコード数が増えた場合の動作について気になったので調べてみました。

#準備
PowerShellとPnPを使ってSharePointに1万件を超えるデータを登録しました。
※大量に登録するならCSOMを使った方がいいようです。 PnPだと一件ずつとなり1件1~2秒、完了するのに数時間かかりました😂
上記をデータソースとするキャンパスアプリを作成しました。
複数のレコードを使用するギャラリーやコンボボックスといったコントロールを配置して動作を調べます。

#コントロール別の動作

##ギャラリーコントロール

  • ギャラリーコントロールのソースに上記のリストを指定
  • データ表示、検索などが正常に動作するか検証

###動作確認

  • CountRows(Gallery1.AllItems)でギャラリーの行数を確認すると、最初は先頭の100件のみが取得される。
  • スクロールしていくと次の100件が取得が取得され表示される(無限スクロールのような動作)

image.png

  • ただし差分の100件のみを取得している訳ではなく、APIに対してはTopNの形で先頭データから再要求されている。つまり1000件なら1000件分のデータが取得される。

  • どこまでいけるか確認した結果、5000件でエラーが表示されそれ以上読み込みできませんでした。(SharePoint側の制限)
    image.png

  • 委任さえできれば1万件を超えるデータでもフィルター可能でした。
     なので委任で少数データに絞り込めるようにさえしていれば、データが万単位に増えても問題なさそうです。
    ※委任できるデータ型と関数は次のページにまとめられています。
    Connector reference SharePoint

  • ただし検索ワードをテキストボックスにバインドし、StartWithで検索すると文字入力がもたついたので、検索ボタンで検索開始するようにしたほうが良かったです。

##ギャラリーの中の画像コントロール
ついでに、ギャラリーの中に画像コントロールを配置しImageにFirst(Thisitem.添付ファイル).Valueを設定し、その動作も確認してみました。

###動作確認

  • ギャラリーを表示又はスクロールした際、レコード1件1件にAPI要求され、取得した画像はblobに格納される。こちらはスクロール時差分の100件のみ要求。
  • スクロールを続けると短時間にAPIコールしすぎ途中429エラーも発生。
     https://docs.microsoft.com/ja-jp/azure/logic-apps/handle-throttling-problems-429-errors
  • 画像コントロールのImageは添付ファイルの有無に関わらずAPIコールされるので、Imageに設定する関数は、以下のように添付ファイルの有無を確認し、添付がある場合のみ取得するようにしたほうが良いと思いました。
If(ThisItem.添付ファイルあり,First(ThisItem.添付ファイル).Value)

※PCだと添付ファイルのAbsoluteUriを指定してもいいのですが、APIを介さないため認証できないのか、スマホやTeamsからだと画像が表示されなかったのでValueを指定しています。

##コンボボックス

  • SharePointの参照列を使って親子関係のあるデータを扱うときの話です。
  • 参照列を含むリスト(子テーブル)のEditFormを作成したとき、参照列のフィールドは自動的にコンボボックスが生成されます。
  • 参照先のテーブル(親テーブル、又はマスター)が1万件を超えている場合の動作を確認してみました。
  • テーブル同士の紐付けを数値列でやる場合は関係ありません。

###準備

  • 先程の1万件超のリストを親テーブルとする小テーブルを追加作成、参照列をとして親テーブルのID列を参照する形にしました。(一対多の関係)
  • 検証アプリでは、親テーブル(左のギャラリー)をクリックしたときに、紐づく子テーブルのレコードが表示されるようにしました。(右のギャラリー)
  • そして、+アイコンで新規登録画面である子テーブルのEditFormに移動します。参照列は自動的にコンボボックスとして生成されます。

image.png

image.png

###動作確認

  • 参照列をコンボボックスで表示する場合、下記のようなエラーが発生しました。
    image.png
    image.png

###対応方法

  • EditFormのDataCardからコンボボックスを削除しテキストボックスに変更します。名前を「TextInput_ParentId」としてDefaultにGallery_Parent.Selected.Id(親ギャラリーのID)を設定。
  • DataCardのUpdadeに以下のおまじないを入力(参照列は{ID:id , Value:value}のオブジェクト)
{  
   '@odata.type' : "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedReference",  
   Id:TextInput_ParentId.Text,  
   Value:TextInput_ParentId.Text
}

参照列の参照列は親テーブルのIDにしているので、IDもValueも同じものを指定します。
コンボボックスによる選択はできませんが、これで親テーブルに紐づくデータを登録できます。

###参考

  • 検証アプリの右のギャラリーのItemsはFilter(ChildTable, ParentId.Value = Text(Gallery_Parent.Selected.Id))です。
  • 参照列のIdは委任できませんが参照列.Valueだと委任可能です。
  • 親テーブルの参照は参照列ではなく数値列でやってもいいのですが、参照列にすることで親テーブルのキー列以外の情報も表示できるので便利です。

##DataTable
簡単にしか検証してませんが

  • ギャラリーコントロールとは異なり500件ごとに取得される。
  • こちらは差分の500件のみ取得される。
  • 多分5000件以上スクロールできるが、5000件間近でメモリ不足によりフリーズ

自分の勘違いとおぼえ書き

この検証をやるまで色々勘違いをしていましたので覚え書きです。
・ギャラリーコントロールは500件又は2000件までしか表示できない→5000件までいける
・SharePointが2000件を超えると、委任しても先頭2000件のデータしか利用できない→1万件でもそれ以上でも(多分)委任さえできれば利用できる。
・テキスト列は委任できない→一行テキストなら委任可能。=やStartWithで委任可能。
・画像コントロールのImageは添付ファイルがある場合だけリクエストされる→添付があるかに関わらずリクエストされる。

#参考情報
今回の検証は以下の動画を参考にさせていただきました。
https://www.youtube.com/watch?v=X99bx3vOEWM&feature=emb_logo
https://www.youtube.com/watch?v=UaBmVUQx_Fk&t=1426s

18
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?