【Power Apps】Dataverseで習慣トラッカーを自作する!ForAllとPatchでリレーションを保存する「魔術」
プライベートでも自分用の「業務・生活記録アプリ」を開発しています。 バックエンドをSharePointリストから Dataverse に移行し、リレーショナルなデータ構造で「習慣トラッカー」機能を実装しました。
これまでは食わず嫌いしていたDataverseですが、実際に触ってみてリレーション(関連付け)の仕組みを理解したら、**「なぜ今までこれを使わなかったんだ」**と後悔するほど快適でした。
今回は、個人的に「魔術」だと感じた、ForAll と Patch を組み合わせたスマートな保存処理について解説します。
今回作りたい機能:習慣トラッカー
やりたいことはシンプルです。
- 事前に登録しておいた「習慣リスト(筋トレ、勉強、掃除など)」を一覧表示する。
- やったものにチェックを入れる。
- 「登録」ボタン一発で、選択した日付のデータとして保存する。
データベース設計:マスターとトランザクションの分離
SharePointリストのみで運用していた頃は、テキスト列にそのまま「筋トレ」などと書き込んでいましたが、今回はDataverseの強みを活かしてテーブルを分けました。
- WorkLog_HabitMaster(マスターテーブル)
- 習慣の名前やIDを管理する定義テーブル。
- WorkLog_HabitLog(トランザクションテーブル)
- 「いつ」「どの習慣を」「やったか」を記録する実績テーブル。
この2つを、Dataverseの 「検索列(Lookup)」 で紐づけています。これぞRDB(リレーショナルデータベース)の基本ですね。
実装:これが「魔術」のコードだ
実際に「登録ボタン」の OnSelect プロパティに書いたコードがこちらです。 ギャラリー(一覧)に表示されているアイテムを一括で処理します。
コード
ForAll(
Gallery2.AllItems As _Master, // ★ここで「_Master」というあだ名をつける
Patch(
WorkLog_HabitLog, // 保存先のテーブル
Defaults(WorkLog_HabitLog),
{
HabitName: _Master, // ★ここが最大のポイント!
Date: DatePicker1.SelectedDate,
check: _Master.chkDid.Value // チェックしたかどうか
}
)
);
このコードには、Power Apps初学者〜中級者が一度はつまずくポイントを突破するテクニックが詰まっています。

魔術ポイント①:As演算子で変数を支配する
Gallery2.AllItems As _Master という部分です。 ForAll の中で Patch を使うと、今どのレコードを指しているのか(ThisRecord が何を指すのか)が曖昧になりがちです。 そこで As _Master と明示的に名前を付けてあげることで、「今ループしているこの行は _Master だよ」 とコード内で宣言できます。これで変数の迷子を防げます。
魔術ポイント②:リレーションの保存があまりに直感的
一番感動したのがここです。
HabitName: _Master
保存先の HabitName 列は、マスターテーブルへの検索列(Lookup)になっています。 従来のSharePointなどではIDを指定したりと面倒な処理が必要でしたが、Dataverseの場合は 「レコードそのもの(_Master)」を渡すだけで、勝手にリレーション(紐付け)が完了します。
「IDを探して…」といった手続き不要で、「この親の子供です!」とオブジェクトを渡す感覚。これぞオブジェクト指向、これぞモダンなローコード開発です。
まとめ:Dataverseはいいぞ
これまでは「ExcelやSharePointで十分」と思っていましたが、データの整合性や、アプリ側でのコード記述量を考えると、Dataverseのリレーション機能は強力な武器になります。
何より、コードが短くて美しくなるのが最高です。 「市民開発」のレベルを一段上げたい方は、ぜひDataverseの検索列と ForAll の組み合わせに挑戦してみてください。
