8
9

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 5 years have passed since last update.

PowerAppsで遭遇する5つの委任問題とちょっと強引な回避方法(SharePointリスト利用時)その2

Last updated at Posted at 2019-05-20

(2019/08/13)
選択肢のフィルタリング処理は委任可能になりましたので、本記事の手法は不要となりました!!
…が、次回の記事(その3)で紹介している"ケース4:動的にフィルタ処理したい"場合は、私が知る限り本記事の手法一択なので、記事としては残すことにしました。ご興味ある方はその3と併せてご覧ください。

次回の記事(その3)↓
PowerAppsで遭遇する5つの委任問題とちょっと強引な回避方法(SharePointリスト利用時)その3


前回の続きです。本記事をご覧になりたい方は、先に前回の記事(その1)をご覧いただくと話がスムーズです↓
PowerAppsで遭遇する5つの委任問題とちょっと強引な回避方法(SharePointリスト利用時)その1

その2では、前回ほどではないけれど、そこそこ委任問題に遭遇した以下のケース

 ケース3:"新規"ステータスのものだけ表示させたい(選択肢のフィルタリング)

について、私が実際に行っている、委任問題のちょっと強引な回避方法について紹介します。

紹介で利用するデータソース

ここでは、以下のSharePointリスト「テストリスト」について考えます。
※列の種類は、前回の記事の作業終了時点の状態です。
image.png

#ケース3:"新規"ステータスのものだけ表示させたい(選択肢のフィルタリング)
つまり、選択肢列をフィルタ処理するケースです。
例えばタスク管理で「新規」「対応中」「完了」の3つのステータスを選択肢として持ち、そのうち「新規」のものだけ表示させる、などです。
選択肢の持たせ方は色々な方法があるかと思いますが、ここではSharePoint側で定義された"選択肢"列をフィルタリングすることについて考えます。

まずは、SharePoint側に選択肢列"ステータス"を追加します。
image.png
選択肢には、例で挙げた「新規」「対応中」「完了」を設定しています。
image.png

適当に値をセットし、分かりやすくするためにGallery内にステータス情報を"ThisItem.ステータス.Value"で表示させておきます。
image.png

準備が整いましたので、早速、選択肢列"ステータス"に対して新規のみに限定するフィルタ処理をGalleryに書いてみます。
選択肢の情報は、列名.Valueで取れるので…

Items
Filter(テストリスト,ステータス.Value = "新規")

image.png
委任警告さん、また会ったね。
どうやら.Valueで選択肢の情報を抽出する処理が委任できないようです。
私が知る限り、SharePointの選択肢列のフィルタ処理は委任できません。

回避方法

そこで自社では、選択肢列でフィルタ処理することを諦め、代わりに数値列を利用してステータス情報を数値で持ち、その数値をフィルタリングすることにしました。
ここでは、数値とステータスを以下のように定義することにします。

ステータス
1 新規
2 対応中
3 完了

#### 1. 列の変更 SharePoint側で先ほどの列"ステータス"の列の種類を選択肢から数値に変更します。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/2e15dfef-5d0e-4292-4b93-0e9392c6b47f.png) ※すでにステータス列にデータがある場合は、ステータス列の中身が抹消されます(以下警告)ので、抹消されると困る場合は別途数値列を追加してから該当の選択肢列を削除するなどしてください。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/2a488a93-7d40-78a6-cb97-ba851fb5e25f.png)

列の種類を変更したら、先にSharePoint側で値を入れておくとよいです。
image.png

2. フィルタ処理書き換え

列を変更したら、PowerApps側で情報を更新し…
image.png

フィルタ処理を以下のように書き換えます。
(新規は1と定義したので、ステータス=1とする)

Items
Filter(テストリスト,ステータス = 1)

image.png
委任警告が消えました。めでたしめでたし。
…ってあれ??フィルタは良いとして、Gallery内のステータス情報が表示されなくなりました。
ステータス情報を"ステータス.Value"で取得していたため、数値列に切り替えたことで取得方法が変わったことが原因です。
だからといって"ステータス"をそのまま持ってくると数字しか取れませんので、数字に応じてステータス表記を切り替えることにします。

この表記の切り替えはこの後何度か出現します。処理共通化のため、まずAppのOnStartで以下のCollection:StatusListを定義します。

OnStart
ClearCollect(StatusList, 
    Table(
        {Val:1,Txt:"新規"},
        {Val:2,Txt:"対応中"},
        {Val:3,Txt:"完了"}
    )
)

image.png
StatusListの中身はこんな感じ↓

Val Txt
1 新規
2 対応中
3 完了

「Collection??はぁ??」という方は、以下の記事がとても分かりやすいのでご一読ください。
おぼえておくと便利そうな PowerApps の変数やコレクションの基礎(idea.toString();)

記載しただけではまだStatusListに値が入っていないため、忘れずにAppの横にある"…"をクリックしてOnStartを実行しておきます。
image.png

そして、表示エラーになった該当のラベルのTextに以下を記載します。先ほど定義したStatusListから、ステータスの値に合う日本語(1なら新規、2なら対応中、3なら完了)を抽出する処理です。

Text
LookUp(StatusList, Val = ThisItem.ステータス).Txt

image.png
これで、フィルタ処理の書き換えは完了です。


#### 3. 変更した列のデータ選択方法 上記の処理だけでは、アイテム登録/修正時にステータスの"数値"を選択することになってしまいますので、フォームでステータスの"名前"を選択できるよう修正を加えます。 まずは、先ほどの"ステータス"列をフォームに追加します。 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405544/67d8dc20-46ad-06e0-2b77-144de0204671.png)

※※※補足※※※
追加後にキャンバスで以下のようにエラーが表示される場合は、追加した"ステータス"列が選択肢列のままになっている可能性がありますので、以下の手順でデータソースをつなぎ直してください。
image.png
image.png
image.png
image.png
image.png
上記作業が終わったら「3. 変更した列のデータ選択方法」を初めからやり直してみてください。
※※※補足ここまで※※※

続いて、追加した"ステータス"カードのコントロールの種類を"許可値"に変更します。
image.png

追加した"ステータス"カードのロックを解除し、カード内にあるドロップダウンのプロパティを各々以下のように書き換えます。
ItemsのStatusListは、先ほど定義したCollectionです。
ドロップダウンの表示がステータスの"名前"になるよう、ValueにはTxtを指定します。
Defaultには先ほど一覧画面のステータス表示で利用した処理と同じ処理を記載します。これがないとアイテムの修正時にステータス値が正常に表示されません。

Items
StatusList
Value
Txt
Default
LookUp(StatusList, Val = ThisItem.ステータス).Txt

image.png

最後に、"ステータス"カードのUpdateプロパティを、ドロップダウンのVal列を利用するよう修正します。

Update
DataCardValue8.Selected.Val
// ドロップダウン名は適宜置き換えてください

image.png
これで、フォームの修正は完了です。


#### 4. 変更した列の詳細画面での表示方法 このままだと、一覧画面でアイテムを選択した際に表示される詳細画面(DetailScreen)でのステータスの表示が数字になってしまうため、修正する必要があります。 (詳細画面にステータスを表示させない場合は省略可能)

まずは、"ステータス"列をフォームに追加します。
image.png
※※※補足※※※
追加後に、先ほどのフォーム画面のようにエラーが表示される場合は、「3. 変更した列のデータ選択方法」と同様の方法でデータソースをつなぎ直してください。
※※※補足ここまで※※※

追加した"ステータス"カードのプロパティを変更するためにロックを解除し、カードのDefault値を以下に書き換えます。
先ほど一覧画面やフォーム画面のステータス表示で利用した処理と同じです。

Default
LookUp(StatusList, Val = ThisItem.ステータス).Txt

image.png

これで、詳細画面の修正は完了です。

完成!

以上で、「ケース3:"新規"ステータスのものだけ表示させたい」は完成です。

完成イメージ↓
※違いを分かりやすくするため、切り替えスイッチでフィルタ処理を切り替える処理を追加しています。
Rec1.gif

#まとめ
選択肢列をGalleryでフィルタ処理するために、選択肢列を捨てるという、ちょっと(かなり?)強引な方法についてご紹介しました。
自社のアプリではこの方法を用いて、ステータスやカテゴリのフィルタ処理を行っています。


ちなみに、今回のケース3の方法を見て、 > ステータス名を保持したいのなら、なぜ"新規"などのステータス名をそのままテキスト列に保存せずに、わざわざ数値列を使って面倒な処理にしたの??

と思われた方、おっしゃる通りです。
実はこれには目的がありまして…というお話は、また次回にしたいと思います。

ご参考になれば幸いです。

その3はこちら↓
PowerAppsで遭遇する5つの委任問題とちょっと強引な回避方法(SharePointリスト利用時)その3

8
9
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
8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?