業務ハックLab -とある情シスの備忘録-

とある情シスの備忘録的なものです。

【スポンサーリンク】

Power Appsちょいテク!~複雑な関数を設定する時は~

皆さん、こんにちは!
業務ハックLabのようです。
今回はPower Appsちょいテク!複雑な関数を設定する際はというお題で書いていきたいと思います。
ちょいテクというか基本というか・・・ 「そんなのあたりまえじゃん!」と思う方もいらっしゃるかと思いますがお付き合いください。

この記事は、Power Apps Advent Calendar 2022 12月15日担当分の記事です!
12/8の担当記事分はYouTubeでPower Appsちょいテクと題して配信したのですが今回はブログで書いていきます!

qiita.com

複雑に入れ子になった関数の設定

皆さんは複雑に入れ子になった関数を設定する時、どういう風に設定していきますか?
頭の中で構築して複雑な入れ子の関数でもさっと入力できるあなた!素晴らしいです。
僕は割とすぐに頭がこんがらがってしまうのでこれができないんですよね。
Power Appsでアプリを作る時、なるべくシンプルな作りにすることを心がけていますが、自分が意図した動きをさせる為にはどうしても複雑な式を設定しなければならない時もあります。
一つの結果を得たい時に7~8個の関数を組み合わせるなんてこともざらにあります・・・

今回の例題

ということですぐに頭がこんがらがってしまう僕が実践している整理方法をご紹介する前に、まずは入れ子になっている関数の例題です。

上記はMicrosoft MVPAkiraさんと元英語教師のkuro.さんと僕の3人で主催をしていた学習アプリ作成会で四択問題アプリを作った際に出てきたものです。
アーカイブは下記で見ることができるので是非是非!

youtube.com

イベントの中では最終的にはかなりすっきりした形になるのですがそれは一旦おいておいて、見ていただくとわかる通り、かなり関数が入れ子になっているとともにFilterの条件部分にもUser関数やDateValue関数なども入っており、なかなかすごいことになってますよねw
実装したい動きとしては

「データソース「English_Result」からログインユーザーかつgalCalenderで選択した日付でフィルタしたレコードをID昇順で取得し、そのレコードを10件毎表示し、ボタンをクリックすることで前の10件、後の10件と表示を変更できるようにする」


です。
この条件を実現させたのが上記の数式です。
他にも変数「locCount」を変更させる為、ボタンコントロールも組み合わせてますがそちらを説明するのは今回の趣旨とはずれるので割愛!(その辺はアーカイブを見てもらえると嬉しいです。)

「よう」が実践する整理方法

さて、それでは僕がいつも行っている整理方法です。
まず実践したい動きを整理します。

「データソース「English_Result」からログインユーザーかつgalCalenderで選択した日付でフィルタしたレコードをID昇順で取得し、そのレコードを10件毎表示し、ボタンをクリックすることで前の10件、後の10件と表示を変更できるようにする」

「データソース「English_Result」からログインユーザーかつgalCalenderで選択した日付でフィルタしたレコードをID昇順で取得し」という点に着目します。
分解していくとこんな感じですね。

  • データソース:「English_Result」
  • フィルタ条件:ログインユーザー & galCalenderで選択した日付
  • 並び替え順:English_ResultのID列昇順

フィルタと並び替えをする必要がありのでFilter関数とSort関数を使う必要がありますね。
フィルタと並び替えどちらを先にしても良いのですが今回は並び替えを先にしましょう。

これでEnglish_ResultのID列昇順にしたものが取得できます。
ではこの結果をとりあえずSort結果 としておきます。
このSort結果をデータソースとしてフィルタをかけていくので

となります。
では次にフィルタ条件を考えていきます。
フィルタ条件は上に書いてある通り、「ログインユーザー & galCalenderで選択した日付」です。

条件式でいくと

ログインユーザーメールアドレスとEnglish_Resultのレコード登録者メールアドレスが一致

galCalenderで選択した日付と登録日時の「時間」部分を0:00:00にしたものと一致

という感じですね。
これを式に代入するとこうなります。

これで「データソース「English_Result」からログインユーザーかつgalCalenderで選択した日付でフィルタしたレコードをID昇順で取得し」という部分の要件が満たせましたね。
ではこの結果をとりあえずFilter結果 としておきます。

では次です。
「そのレコードを10件毎表示し、ボタンをクリックすることで前の10件、後の10件と表示を変更できるようにする」という部分ですね。
例えば先ほど取得してきたデータが50件あった場合、ギャラリーに1~10件目、11~20件目といった形でレコードを範囲で表示したいわけです。
つまり1~10件目を表示したい場合は全50件のレコードのうち、最後のレコードから50件持ってきたうちの最初の10件を、11~20件目を表示したい場合は全50件のレコードのうち、最後のレコードから40件持ってきたうちの最初の10件を取得すればいいわけですね。
ですので仮に11~20件目のデータを表示する場合で最後のレコードから40件持ってくるときは

但し上記の40という部分は可変です。
Filter結果 で取得してきたレコード数も変わりますし、何よりボタンを押した際に前の10件、次の10件という動きをさせたいわけです。
ですのでこうなります。

「CountRows(Filter結果)」でFilter結果のレコード数を取得し、それとlocCount(ボタンに定義する変数)を引き算しています。
これをすることで「CountRows(Filter結果)」で取得した結果が50件でlocCountの値が10の時は、50-10=40となるのでLastNで取得できる範囲を可変にできるわけです。
この結果をとりあえずLastN結果としておきます。
そしてそのレコードの中から最初の10行を表示したいので

となるわけですね。
「そのレコードを10件毎表示し、ボタンをクリックすることで前の10件、後の10件と表示を変更できるようにする」という部分の要件もクリアできました。

では最後にSort結果Filter結果LastN結果の部分を展開するとこんな感じになります。

赤枠で囲むとわかりやすいです。

この式自体は委任問題が発生していたりするのでこれが最終型というわけではないですが多段で入れ子になっているような複雑な式の例としては良い例題だったので取り上げました。

まとめ

順序だてて考えていけば上記のような複雑な数式でも組むことができます。 整理する時のポイントは「内側から処理を始めること」です。
関数の動きとして入れ子にした場合、中に入れた関数が動作した結果を基に外側の関数が動く形になります。
ですので複雑な動きをさせる場合は内側から設定し、結果が思い通りになったことを確認したうえで次はその一つ外側の処理、といった風に進めていくとよいと思います。
今回は複雑な関数を設定する時の整理の仕方について説明させていただきました!
それでは皆さん、良い業務ハックライフを~


免責事項