Power Platform学習アプリ作成会#8

おはようございます、こんにちは、こんばんは。先日は学習アプリ作成会にご参加いただきありがとうございました。今回もレポートとして記事を投稿いたします。分かりにくかった点は以下の動画#8をご覧ください。

また、記事に誤りがあった場合は、優しくご指摘いただけますと幸いです。なお、この記事は筆者が一方的に書いているものなので、文責はkuro.が負うものです。ご理解いただけますと幸いです。

動画#8

ロボ研さんのオフィスよりお送りしました

もたついてしまいましたね…。ゆっくり丁寧に教えていただきありがとうございます。昔から人より倍理解に時間がかかってしまうのですが、分かるまでやるというのが大事…!

例:With関数

学習アプリ作成会で使用した関数を中心に、ようさんのチャンネルで『関数解説シリーズ』としてリリースされています。チャンネル登録、高評価よろしくお願いします!

前回の復習(#7)

復習に関しては動画を視聴していただくか、当ブログの『Power Platform学習アプリ作成会#7』をお読みいただければと思います。Akiraさんのチャンネルは高評価と登録をよろしくお願いします

今回(#8)の目指すところ

10件ずつ絞り込み、ページ送り機能を追加します

カレンダーセレクター

円を追加

円をギャラリーテンプレートに挿入し、Visibleプロパティに表示・非表示の条件分岐を行います。条件分岐といえば頭に浮かんでくるのはIf関数ですが、IsSelected演算子を使うだけで終わります。

  • ThisItem.IsSelected
  • If ( ThisItem . IsSelected = true , true , false )

レコードを10件に絞り込む

Sort関数で昇順に

レコードを10件絞り込む前に、解答した順番に並べ替えておきます。今回使用するのはSort関数です。データソース(テーブル)を指定し、並び替えの条件を入れ、昇順か降順かを引数に設定します。

Filter(
        Sort(
              English_Result,
              ID,
              Ascending
        ),
        DateValue(galCalendar.Selected.lblCalendarDay.Text) = DateValue(登録日時)
)

あらかじめSortしておいたものをFilterします。昇順であれば省略可能ですが、書いておくことが重要とのことでした。心得ておきます。

FirstN関数とLastN関数の組み合わせ

ここからは、データが30件あるものとして話を進めます。

First関数は最初の1件、Last関数は最後の1件、Index関数は指定の行番号で1件のレコードを抽出して表示する関数なので、1件以上抽出する時に役立つのがFirstN関数とLastN関数でした。

最初の10件と最後の10件を抽出して表示することは簡単にできますが、間の11件から10件分、21件から30件…となると、少し考えなければなりません。

座学

図解だと分かりやすいのですが、LastN関数でレコード数を決めるイメージです。今回は全部で30件のデータなので、LastN ( Table , 20 ) 、つまり、30件中、末尾から20件となると、間の11件目が最初のレコードとなります。

LastN ( Table , 10 )、つまり、30件中末尾から10件となると、間の21件目が最初のレコードとなります。これらをFirstN関数で先頭から10件抽出すれば、それぞれ10件区切りでデータを絞り込むことができるようになります。

本題

ということは、先頭から10件は定数とし、末尾を変数とすることによって考えていることはできそうです。まず最初に、CountRows関数を使ってレコードの総数を引っ張って来ます。言い換えると、LastN関数で引っ張ってくる行番号を行数(レコード数)としてしまうアイディア。

FirstN(
    LastN(
        Filter(
            Sort(
                English_Result,
                ID,
                Ascending
            ),
            DateValue(galCalendar.Selected.lblCalendarDay.Text) = DateValue(登録日時)
        ),
        CountRows(
            Filter(
                English_Result,
                DateValue(galCalendar.Selected.lblCalendarDay.Text) = DateValue(登録日時)
            )
        )
    ),
    10
)

最初の10件のみ表示されることになりました。

ページ送り機能を追加する

コンテクスト変数を使う

11件目以降も10件ずつ表示できるようにボタンを追加していきます。このボタンには、10件ずつ足したり引いたりしてしまえば良いわけなので、成績管理画面に遷移してきたタイミングで変数 locCount に0を格納し、ボタンを押した時に locCount +10、locCount -10 とできれば良いですね。

  • ViewScreen:Onvisibleプロパティ
    UpdateContext ( { locDay : Today ( ) , locCount : 0 } )
  • btnMinus:OnSelectプロパティ
    UpdateContext ( { locCount : locCount – 10 } )
  • btnPlus:Onselectプロパティ
    UpdateContext ( { locCount : locCount + 10 } )
  • galTranscript:Itemsプロパティ
    先ほどのCountRows ( ) の後に – locCount

エラー処理

ボタンを押し続けると、当たり前ですがレコードの総数を上回ったり下回ったりしてしまいます。ページ送り用のボタンのDisplayModeプロパティを使ってエラー処理をしていきます。

問題はどのように条件分岐をするか…というところですが、btnMinus に関しては、変数 locCount が0になったタイミング、つまり、FirstNで10件表示された状態がレコードの限界なので以下のコードでOKです。

If(locCount=0,DisplayMode.Disabled,DisplayMode.Edit)

一方、btnPlusは、変数 locCount と、レコード件数から10を引いた数値が上限となります。レコード数が全部で30件の場合、btnPlusのlocCountが20+10になったタイミングでDisplayModeプロパティの値がDisabledになればOKということです。

If(
    locCount=CountRows(
        Filter(
            English_Result,
            DateValue(galCalendar.Selected.lblCalendarDay.Text) = DateValue(登録日時)
        )
    ) -10,
    DisplayMode.Disabled,
    DisplayMode.Edit
)

ちなみに、この DisplayMode.Disabled/Edit のDisplayModeも省略可能です。

それでも、付けておくと丁寧ですね。

○件中△件~☆件を表示する

最後に、ラベルに全体の件数と現在表示されている件数が分かるようにコーディングしていきます。

復習ですが、locCount は10件ずつ増えたり減ったりする変数なので、その変数に1を足した値と10を足した値をそれぞれ表示させるだけでOKです。

ボタンを押した時のlocCountが10であれば「11件~20件」ということですね。

文字列連結関数のConcatenate関数を使用し、ラベルのTextプロパティに以下のように書いていきます。

Concatenate(
    locCount + 1,
    "~",
    locCount + 10,
    "件",
    " / ",
    CountRows(
        Filter(
            English_Result,
            DateValue(galCalendar.Selected.lblCalendarDay.Text) = DateValue(登録日時)
        )
    ),
    "件"

また、関数を使わない方法もあります。その際は & で区切って連結していきます。どちらでもお好みでOKです。

次回(#9)

画像リンク

次回はデータを追加するフォームを作成していきます。出題するための単語を追加して、充実させていきましょう。

隅田智尋

PAGE TOP