アプリ開発の調査にかかる
時間を削減したい
内製化支援サービス
アプリを自分たちで
作成できるようになりたい
DX人材育成プログラム
プロに開発を依頼したい
アプリ開発導入支援サービス
SharePoint デザイン拡張サービス
X-SP Style
モダン化から運用管理までサポート
移行・モダン化コンサルティング
※内容を一部修正しております。(2023年12月)
Power Appsでアプリを作成する際、気をつけなければならない1つの事項としてデータソースから取得できるレコード数の上限があります。
Power AppsはDataverseやSharePointなどから一度に最大2,000件(デフォルトでは500件)のレコードしか取得する事ができません。
よって、委任できない検索条件を用いた場合や、検索後も2,000件を超過するような場合は、全てのレコードを取得する事ができないということになります。
※委任に関する詳細については、過去にブログを作成したことがあるので、以下URLを参照してください。
よって、今回は500/2,000件以上のレコードを扱いたい場合の方法について紹介します。
内容としては、Power Appsの中級者の方に向けた記事となっております。
今回紹介する方法は大量データを扱うため、パフォーマンスが大きく低下する可能性があります。
よって、全面的におすすめしている訳ではありません。
(そもそも「データ件数が2,000件を超過しないようにする」という解決策もあると思います。)
あくまでも解決策の1つとして参考にしてください。
やりたいこと
今回は、以下構成となっております。
データソースはSharePointリストです。
今回は、「大量にデータが保存されているSharePointリストから、Power Appsを用いてその内容を検索する」ということを行います。
SharePointリストの詳細は以下です。
リスト名:LargeList
列名(外部名) |
列名(内部名) |
データ型 |
---|---|---|
タイトル |
Title |
1行テキスト |
詳細 |
Description |
複数行テキスト |
また、SharePointリストには10,001件のレコードを保存しております。
Power Appsの取得できるデータ行の設定も以下のように変更しております。
上記の設定値は、Power Appsのファイル→設定→全般→データ行の制限から確認することが出来ます。
※デフォルト値は500であり、最大値は2,000です。(2023年2月時点)
Before
Power Appsの構成
まずは、Power Appsの構成について説明しておきます。
Power AppsはReloadボタンsearchTextBoxギャラリーの3つのコントロールから構成されています。 それぞれの役割は以下のとおりです。
Reloadボタン:データソースを更新する際に押下します。
searchTextBox:データソースから検索したい語句を入力します。
ギャラリー:データソースからsearchTextBoxの内容に応じて、レコードを表示します。
実装(素直な実装)
まずは、何も考えず素直に実装してみます。
Reloadボタン・ギャラリーにそれぞれ以下を設定します。
ReloadボタンのOnSelectプロパティ
Refresh(LargeList);
ギャラリーのItemsプロパティ
SortByColumns(
Search(LargeList,
searchTextBox.Text,
"Title",
"Description"
),
"ID", Ascending
);
上記では「LargeList」というデータソース(=SharePointリスト)を、Search()関数の中で直接指定しています。
すると、下記のように委任に関する警告が表示されました。
検索の結果、SharePointリストの上位2,000件までのレコードは検索されましたが、2,001件目以降のレコードは検索されませんでした。
委任ができない検索条件である、かつデータ行の制限が2,000と設定されているため、当然の結果ですよね。
※取得データ件数も2,000となっていることが確認できると思います。
以下では、2,000件以上のレコードが存在する場合でも、データソースから検索結果を得る方法について紹介します。
After
まずは、実装のイメージについて説明します。
前提として、SharePointリストからレコードを取得する際に、データ行の制限(=最大2,000件)を超えることはできません。
よって、データソースから対象範囲のレコードを複数回取得し、取得結果をコレクションに追加するという方法を用います。
(1回目は1~2,000行目を取得、2回目は2,001~4,000行目を取得…というイメージでループを回していきます。)
それでは、実装してみましょう。
(今回色々と試行錯誤しながら作成しましたので、その流れも一緒にお伝えします。)
Step1:最初の状態
今回はReloadボタン押下時に、データソースから全レコードを取得するようにしております。
まずは、以下のように記載してみました。
ReloadボタンのOnSelectプロパティ(最初の状態)
UpdateContext({threshold: 2000 });
UpdateContext({lastRecord: First(Sort(LargeList,ID,SortOrder.Descending))});
UpdateContext({maxIteration: RoundUp(lastRecord.ID/threshold,0)});
Clear(colLargeList);
ForAll(
Sequence(maxIteration, 0),
Collect(colLargeList, Filter(LargeList, Value(Value) * threshold < ID && ID <= (Value(Value) + 1) * threshold))
);
ギャラリーのItemsプロパティ
SortByColumns(
Search(colLargeList,
searchTextBox.Text,
"Title",
"Description"
),
"ID", Ascending
);
Beforeでは、Search()関数の中に、データソースを直越指定していましたが、 今回はコレクション(=colLargeList)を指定しています。
Itemsプロパティでは、委任に関する警告とMul演算子に関するエラーが発生しました。
(Mul演算子は掛け算のことです。)
Step2:Mul演算子に関するエラーをWith()関数で解消
Mul演算子に関するエラーを解消するため、With()関数を用いました。
With()関数については、以下を参照ください。
Power Apps での With 関数
ReloadボタンのOnSelectプロパティ(With()関数を用いて修正)
UpdateContext({threshold: 2000 });
UpdateContext({lastRecord: First(Sort(LargeList,ID,SortOrder.Descending))});
UpdateContext({maxIteration: RoundUp(lastRecord.ID/threshold,0)});
Clear(colLargeList);
ForAll(
Sequence(maxIteration, 0),
With(
{
prev: Value(Value) * threshold,
next: (Value(Value) + 1) * threshold
},
Collect(colLargeList, Filter(LargeList, prev < ID && ID <= next))
)
);
上記修正により、Mul演算子に関するエラーは解消されました。
しかし、委任に関する警告はまだ消えておりません。
Step3:subID列を追加し、委任に関する警告を解消
調査したところ、SharePointリストのID列は、イコール(=)以外の比較演算子はサポートしておらず、委任できないようでした。(2023年2月時点)
詳細は以下URLをご参照ください。
委任メモ
上記の対応策として、SharePointリストに新しく「subID」列を追加し、ID値をコピーしました。
※データ型は数値として設定しています。
ちなみに、subID列を追加するのは、データソースがSharePointリストだからです。
データソースがDataverseの場合は、ID列でも比較演算子が委任できます。
次に、IDの代わりにsubIDを用いて、OnSelectプロパティを修正しました。
ReloadボタンのOnSelectプロパティ(subIDを用いて更に修正)
UpdateContext({threshold: 2000 });
UpdateContext({lastRecord: First(Sort(LargeList,ID,SortOrder.Descending))});
UpdateContext({maxIteration: RoundUp(lastRecord.ID/threshold,0)});
Clear(colLargeList);
ForAll(
Sequence(maxIteration, 0),
With(
{
prev: Value(Value) * threshold,
next: (Value(Value) + 1) * threshold
},
Collect(colLargeList, Filter(LargeList, prev < subID && subID <= next))
)
);
こちらで警告やエラーが発生しない状態となりました。
また検索の結果、全てのSharePointリストのレコードから検索されるようになりました。
※取得データ件数も10,001となっていることが確認できると思います。
おわりに
少し長くなりましたので、本日はここまで!
今回は、Power Appsで500/2,000件以上のレコードを扱いたい場合の方法について、実装までの流れを紹介しました。
次回はReloadボタンのOnSelectプロパティの内容について、詳細について深掘りしていきます。
【このシリーズの過去回一覧】
【こちらも合わせて読みたい】
小刀稱知哉
大分県出身(温泉大好き)、現在は東京都在住
1990年生まれ
30才でメーカーの技術営業からIT業界にジョブチェンジ!!!
趣味は読書
主にMicrosoftのローコード(SharePoint・Power Platform)に関するに関する営業活動や設計、開発などを担当しております!
(最近はCopilot Studioについても勉強中)
持ってる資格はPL-200/PL-300/PL-400/PL-600/MS-700/AZ-104/AZ-305/SC-200
こんにちは。アーティサン株式会社の小刀稱(ことね)です。