[Power Apps]データソースの操作(参照・更新・追加)

追加(Insert)

公式リファレンス

Collect

Collect (データソース, レコード)

Collect(
  商品マスタ
  , {ID: "100", 商品ID:"K200", 商品名:"さわやかオレンジ", 単価:"500"}
);

更新(Update)

公式リファレンス

Update

Update (データソース, 更新対象レコード, 更新列)

Update(
  商品マスタ
  , First(Filter(商品マスタ, 商品名="鮭おにぎり"))
  , {ID: "3", 単価: 200}
);

いまいち、使い勝手が分からない関数。

  • 第1引数と、第2引数の対象取得でデータソース名を2回記述しなければならない。
  • Filter関数の頭にFirstを付けないと動かないっぽい?(レコードとコレクションの違いを理解していないため、なぜエラーになるのか現時点で分からず。)
  • レコード全体を更新するため、更新列で省略された列は全て空白で更新されてしまう。
  • 更新列にIDを指定しなければいけない。更新対象の列番号が動的に変わるのであれば、どのようにIDを指定すればよいのか正直分からない。

UpdateIf

Updatelf (データソース, 条件, 更新列)

Updatelf(
  商品マスタ
  , 商品名="鮭おにぎり")
  , {単価: 200}
);

SQLのupdate構文そのままであり、直感的であり、理解しやすい。
Update関数で上げた4つのデメリットはupdatelf関数にはない。
局所的な更新であればupdatelf関数一択である。

Patch

Patch (データソース, 初期レコード, 更新列)

更新の場合

第2引数に更新対象のレコードを設定する。

Patch(
    期末テストデータ
    , Lookup(期末テストデータ, 名前="ソラ ハレワタール")
    , {
        名前: "ソラ ハレワタール"
        , 数学: "50"
        , 物理: "75"
        , 英語: "100"
      }
) 

新規登録の場合

第2引数でDefaults(データソース)とすることで、規定値で初期化された新しいレコードが作成される。
第3引数で更新したい情報をキー名と値のMap形式で渡す。

Patch(
    期末テストデータ
    , Defaults(期末テストデータ)
    , {
        名前: "ソラ ハレワタール"
        , 数学: "50"
        , 物理: "75"
        , 英語: "100"
      }
) 

第3引数のMapは分割することもできる。

Patch(
    期末テストデータ
    , Defaults(期末テストデータ)
    , {
        名前: "虹ヶ丘 ましろ"
        , 数学: "40"
     } 
     , {
        物理: "30"
        , 英語: "80"
     } 
)

複数のMapに同じキーがあった場合、後に記述したMapの値で更新される

Patch(
  期末テストデータ
  , Default(期末テストデータ)
  , {
    名前: "虹ヶ丘 ましろ"
    , 数学: ""
    , 物理: ""
    , 英語: "50"

   }
   , {
    名前: ""
    , 数学: "40"
    , 物理: "30"
    , 英語: ""
   }
)

Formとの組み合わせ(Form.Updates)

Patch(
  期末テストデータ
  , Default(期末テストデータ)
  , {
      Form1_1.Updates
          , Form1_2.Updates
          , Form1_3.Updates
          , Form1_4.Updates
   }
)

Formで登録を行う際、「SubmitForm()」でなく、「Patch()」で代替することができる。
「名前」「数学」「英語」「物理」が4画面・4フォームに分割されている場合でも上記のように「Form.Updates」を並べることで、
入力されたすべての情報を、項目名を意識することなく設定することができる。

・公式リファレンス  Patch  Defaults  Form.Updates

 

参照(Select)

公式リファレンス

LookUp

LookUp (データソース, 条件式)

  • 条件に合致するレコードを1件だけ取得する。
  • 条件に合致するレコードがない場合、何も返却しない。
  • 第3引数で取得したレコードを加工して返却することができる (javascriptでいう.map())そうだが、どうにもエラーが解消できず、動作確認できず。
LookUp(
  商品マスタ
  , 商品ID = "T001"
)

Search

Search (データソース, 検索文字列, 対象列)

  • 対象列に検索文字列が含まれるレコードを全て取得する。
  • 検索文字列が空白「””」である場合はテーブルのレコードを全て取得する。
  • 条件に合致するレコードがない場合、何も返却しない。
  • 文字列の検索「大文字/小文字を区別しない」「部分検索をする」ため、完全一致であるかの判定はできない。
// 全ての「おにぎり」を取得
Search(商品マスタ, "おにぎり", 商品名)

// 大文字の「BLTサンドイッチ」も取得できる
Search(商品マスタ, "blt", 商品名)

// 全レコードを取得
Search(商品マスタ ,"", 商品名)

Filter

Filter (データソース, 条件1, 条件2…)

  • 全ての条件(1 ~ N)を満たす(AND条件)が含まれるレコードを全て取得する。
  • 条件に合致するレコードがない場合、何も返却しない。
// 単一条件
Filter(商品マスタ, Int(単価) > 150)

// 複数条件
Filter(商品マスタ, Int(単価) > 150, "おにぎり" in 商品名)

まとめ

簡単なアプリであれば、データソース追加は「Collect」、更新は「Updatelf」、参照は「Filter」の固定でよいと思われる。

削除の関数や難解そうなPatch関数はまだ手付かずなので、理解出来次第、記事を更新する予定。