おぼえておくと便利そうな PowerApps の変数やコレクションの基礎

PowerApps でアプリを作成する場合、変数やコレクションを利用することでより高度なアプリを作成できるようになります。PowerApps のアプリ内で変数やコレクションには次の種類があります。

* グローバル変数
* コンテキスト変数
* コレクション

また、PowerApps で扱われる値にはいくつかのデータ型があるようで、そちらも調べてみました。

#グローバル変数
グローバル変数を利用すると、アプリ内でどのスクリーンが表示されている場合でも、利用したい値を変数に持たせておき参照することができます。

##Set 関数
変数は Set 関数を利用して作成または更新を行います。

```PowerApps
Set(Var, "Value")
```
Set 関数では、ひとつ目の引数が変数名で、ふたつ目の引数が値です。指定した変数名で変数が作成されていない場合は、自動的に変数が作成されます。

そして、PowerApps では指定した値に応じて自動的に変数の型が変化します。

#コンテキスト変数
コンテキスト変数はグローバル変数とは異なり、変数のスコープが各スクリーンに限定されたローカル変数のような存在です。そのため、スクリーンを越えて同じ変数を参照することが基本的にはできません。ただし、例外として Navigate 関数を介してのみスクリーン間で値を渡すことができます。

##UpdateContext 関数
コンテキスト変数は UpdateContext 関数を利用して作成または更新を行います。

```PowerApps
UpdateContext({Ctx:"Value"})
```
UpdateContext 関数では、{} で囲まれた {変数名:値} の形で引数を指定します。ここは次のように複数の変数を一度に指定できます。

```PowerApps
UpdateContext({Ctx1:"Value", Ctx2:12345})
```

さらには、次のようにレコードの値も指定できます。

```PowerApps
UpdateContext({Person:{Name:"Hirofumi", Age:35}})
```
このレコードの値を参照するには、同じスクリーンの中で Person.Name または Person.Age のように参照できます。

##Navigate 関数
スクリーン間の遷移を行う Navigate 関数ですが、これのみっつ目の引数を利用することで、スクリーン間でコンテキスト変数を介して値を渡すことができます。

```PowerApps
Navigate(Screen2, None, {Ctx1:"Value", Ctx2:12345})
```
遷移先のスクリーン（この場合 Screen2）では、Ctx1 または Ctx2 を通常のコンテキスト変数と同様に参照できます。

#コレクション
コレクションを利用すると、テーブル型のデータを保持しておくことができます。コレクションでは、ClearCollect 関数や Collect 関数、Clear 関数などコレクションでのみ利用できる便利な関数が用意されています。また、コレクションはモバイルデバイスのローカルストレージに読み書きすることもできます。

コレクションもグローバル変数と同様にアプリ内のすべてのスクリーンから参照することができます。

##ClearCollect 関数
コレクションは ClearCollect 関数を利用して作成または更新を行います。

```PowerApps
ClearCollect(Coll, Table)
```
##Collect 関数
Collect 関数を利用するとコレクションのテーブルにレコードを追加できます。

```PowerApps
Collect(Coll, {Column1:333, Column2:"JKL"})
```
##Clear 関数
Clear 関数を利用するとコレクション内のレコードが全て削除されます。ただし、テーブルの列は削除されずに残ります。

```PowerApps
Clear(Coll)
```

##SaveData 関数
SaveData 関数を利用するとコレクションのデータをモバイルデバイスのローカルストレージにキャッシュのように保存できます。また、データは暗号化され、他のアプリからの参照はできません。

たとえば次のように Coll という名前のコレクションを AppData という名前でローカルストレージに書込みができます。

```PowerApps
SaveData(Coll, "AppData")
```

##LoadData 関数
LoadData 関数を利用するとモバイルデバイスのローカルストレージに SaveData 関数を利用して保存したデータを読込むことができます。

たとえば次のように AppData という名前でローカルストレージに保存されているデータを Coll という名前のコレクションに読込みができます。

```PowerApps
LoadData(Coll, "AppData")
```

デバイスがネットワークに接続している時に取得したクラウドサービスからのデータをローカルストレージに保存しておき、オフラインの時にはローカルストレージのデータを利用するなどが可能です。

#変数・値の型
PowerApps の変数は指定された値に応じて変数の型が自動的に変化します。演算処理などを行う場合、型や型の変換方法を覚えてくと便利な場面が多くあります。

##Number 型
数値を指定すると Number 型の変数になります。

```PowerApps
Set(Var, 12345)
```
Number 型の変数は四則演算や比較演算を利用できます。

また、Number 型を後述の Text 型に変換するには Text 関数を利用できます。

```PowerApps
Text(12345)
```

ちなみに、PowerApps では小数点が含まれる数値も Number 型です。

##Text 型
""で囲んだ文字列を指定すると Text 型の変数になります。

```PowerApps
Set(Var, "hogehoge")
```
Text 型の変数は & を利用した文字列連結演算や in（大文字小文字区別なし） または exactin（大文字小文字区別あり）の文字列一致テストなどを利用できます。

また、数字のみの Text 型は Value 関数を利用することで Number 型に変換できます。

```PowerApps
Value("12345")
```
##Boolean 型
True または False を指定すると Boolean 型の変数になります。

```PowerApps
Set(Var, true)
```
フラグのように利用できます。

##Date 型
日付の値を指定すると Date 型の変数になります。Date 型の値を作成するための Date 関数や今日の日付を取得する Today 関数を利用できます。

Date 関数では、それぞれの引数に西暦、月、日の値を数値で指定します。

```PowerApps
Set(Var, Date(2019, 2, 28))
```
Today 関数は次のように利用できます。

```PowerApps
Set(Var, Today())
```

また、文字列を Date 型に変換するには DateValue 関数を利用できます。

```PowerApps
DateValue("2019/2/28")
```
こうした表記の他に、次のような形の文字列も DateValue 関数を利用して Date 型に変換できます。

```PowerApps
DateValue("2019年3月30日","ja")
```
DateValue 関数では、ふたつ目の引数にどの言語の文字列が渡されるかを指定できます。省略した場合は、クライアントの表示言語が自動的に利用されますが、ユーザーの利用言語が複数想定される場合には考慮が必要です。

たとえば英語表記を指定した場合には、次のような文字列を Date 型に変換できます。

```PowerApps
DateValue("February 28th, 2019", "en")
```
```PowerApps
DateValue("Feb 25, 2019", "en")
```

Date 型の変数は、DateAdd 関数を使った日付の増減や DateDiff 関数を使った日付の差分演算を利用できます。

```PowerApps
DateAdd(Var, 30, Days)
```

```PowerApps
DateDiff(Var1, Var2, Days)
```

いずれもみっつ目の引数で増減の単位や差分計算結果の単位を指定できます。

また、Date 型も Text 関数を利用して Text 型に変換できますが、次のように Text 関数のふたつ目の引数を指定することで表示形式を指定できます。表示形式はいくつかの中から選択できます。

```PowerApps
Text(Var, DateTimeFormat.LongDate)
```

##Time 型
時刻を指定すると、Time 型になります。これは、時刻情報のみを持つ変数です。Time 型の値を作成するためには、Time 関数を利用できます。

次の例では「14:10:30」を表す Time 型になります。

```PowerApps
Set(Var, Time(14, 10, 30))
```

##DateTime 型
DateTime 型では、Date 型と Time 型の情報を合わせたような形で、日付 & 時刻情報を持ちます。DateTime 型の値を作成するためには、DateTimeValue 関数や現在の日付時刻を取得する Now 関数を利用できます。

```PowerApps
Set(Var, DateTimeValue("2019/2/29 14:10:30"))
```
Now 関数は次のように利用できます。

```PowerApps
Set(Var, Now())
```

DateTime 型も Date 型と同様に DateAdd 関数などを利用できるほか、Text 関数で Text 型に変換することも出来ます。

##Color 型
PowerApps では、色の情報を保持するための Color 型が用意されています。Color 型の値を作成するためには、ColorValue 関数や RGBA 関数を利用できます。

```PowerApps
Set(Var, ColorValue("#FF33BB"))
```

```PowerApps
Set(Var, RGBA(23, 45, 67, 0.5))
```

なお、どちらで指定した場合であっても Color 型変数の値は RGBA の形式で持ちます。

##Table 型
Table 型では、2次元の表形式のようなイメージでデータを変数に持たせておくことができます。Table 型の値を作成するためには Table 関数を利用できます。

```PowerApps
Set(Var, Table({Column1: 123, Column2: "ABC"},{Column1: 456, Column2: "DEF"},{Column1: 789, Column2: "GHI"}))
```
また、テーブル型変数は ClearCollect 関数などを利用してコレクションとして扱うことができます。次のように Table 型の変数 Var を Coll という名前のコレクションに変換できます。

```PowerApps
ClearCollect(Coll, Var)
```

コレクションとすることで、Collect 関数や Clear 関数を利用したレコードの追加や削除などの操作や、ローカルデバイスへのデータ保存（モバイルアプリの場合）が可能となります。

##Control 型
アプリ上に画像コントロール（仮に Image1 とします）がある場合、そのコントロールの情報を変数に持たせておくこともできます。この場合、変数は Control 型になります。

```PowerApps
Set(Var, Image1)
```
画像コントロールなどの他、スクリーンのプロパティも Control 型として変数に持たせることができます。

##Image 型
メディアの画像コントロールの Image プロパティやカメラコントロールの Photo プロパティは Image 型の値です。

たとえば、カメラコントロール（仮に Camera1 とします）に表示されている画像を変数に保存しておきアプリ内で利用することができます。

```PowerApps
Set(Picture, Camera1.Photo)
```

また、Image 型の変数は Text 型に変換することもできます。

```PowerApps
Text(Picture)
```

このとき、カメラコントロールから取得した Image 型の値の場合、テキスト化された画像のバイナリデータが取得できます。その後の処理として、データベースに画像を保存しておく必要がある場合など、このテキストデータを保存しておくこともできます。 テキストデータ化された画像データを読み込む場合、画像コントロールの Image プロパティにテキスト化された画像のバイナリデータを設定することで暗黙的に Image 型に変換されます。

#さいごに
備忘録的にバーッと書きましたが、間違いなどがあればご指摘ください。