データ型

注意

Microsoft Power Fx は、キャンバス アプリの数式言語の新しい名前です。 これらの記事は、キャンバス アプリから言語を抽出し、その他の Microsoft Power Platform 製品と統合して、オープン ソースとして利用できるようにするために進行中の作業です。 言語の紹介のために Microsoft Power Fx の概要 から開始します。

スプレッドシートのセルと非常によく似た、小さな離散値として、情報が Microsoft Power Fx を介して流れます。 たとえば、誕生日 フィールドと 記念日 フィールドはどちらも、年、月、日を含む Date 値として通過します。 アプリは、これらの値をフォーマットする方法を認識し、それぞれに適切なものに入力を制限し、データベースと値を共有します。 誕生日と記念日は人によって異なりますが、システムはそれらを全く同じ方法で処理します。 この場合、日付データ型の例です。

この記事では、PowerFx がサポートするデータ型について詳しく説明します。 外部データが言語に取り込まれると、そのソースの各データ型が Power Fx のデータ型にマップされます。

データの種類 内容
Boolean true または false の値。 IfFilter または比較なしの他の関数で直接使用できます。 True
Color アルファ チャネルを含む色の指定。 Color.Red
ColorValue( "#102030" )
RGBA( 255, 128, 0, 0.5 )
Currency 浮動小数点数に格納される通貨値。 Currency 値は、通貨フォーマット オプションを使用した数値と同じです。 123
4.56
Date アプリのユーザーのタイム ゾーンでの、時刻のない日付。 Date( 2019, 5, 16 )
DateTime アプリのユーザーのタイム ゾーンでの、時刻のある日付。 DateTimeValue( "May 16, 2019 1:23:09 PM" )
GUID グローバル一意識別子 GUID()
GUID (123e4567-e89b-12d3-a456-426655440000)
Hyperlink ハイパーリンクを保持するテキスト文字列。 "https://powerapps.microsoft.com"
Image .jpeg、.png、.svg、.gif、またはその他の一般的な Web 画像形式へのユニバーサルリソース識別子 (URI) 文字列。 アプリのリソースとして追加された MyImage
"https://northwindtraders.com/logo.jpg"
"appres://blobmanager/7b12ffa2..."
Media ビデオまたはオーディオ録音への URI テキスト文字列。 アプリのリソースとして追加された MyVideo
"https://northwindtraders.com/intro.mp4"
"appres://blobmanager/3ba411c..."
Number 浮動小数点数。 123
-4.567
8.903e121
Option set 数字に裏付けられた、オプション セットからの選択。 このデータ型は、ローカライズ可能なテキスト ラベルと数値を組み合わせたものです。 ラベルがアプリに表示され、数値が保存されて比較に使用されます。 ThisItem.OrderStatus
Record データ値のレコード。 この複合データ型には、このトピックにリストされている他のデータ型のインスタンスが含まれています。 詳細については、テーブルの使用を参照してください。 {会社: "Northwind Traders"、
スタッフ: 35、
非営利団体: false}
Record reference エンティティ内のレコードへの参照。 このような参照は、ポリモーフィック ルックアップでよく使用されます。 詳細については、参照の使用を参照してください。 First(Accounts).Owner
Table レコードのテーブル。 すべてのレコードには、同じデータ型のフィールドに同じ名前を付ける必要があり、省略されたフィールドは 空白 として扱われます。 この複合データ型には、このトピックにリストされている他のデータ型のインスタンスが含まれています。 詳細については、テーブルの使用を参照してください。 テーブル ({名: 「シドニー」、
姓: 「比嘉」}、
{名: 「ナンシー」、
姓: 「アンダーソン」})
Text Unicode テキスト文字列。 "Hello, World"
Time アプリ ユーザーのタイム ゾーンでの、日付のない時刻。 Time( 11, 23, 45 )
Two option ブール値に裏付けられた、2 つのオプション セットからの選択。 このデータ型は、ローカライズ可能なテキスト ラベルとブール値を組み合わせたものです。 ラベルがアプリに表示され、ブール値が保存されて比較に使用されます。 ThisItem.Taxable

これらのデータ型の多くは類似しており、基本的な表現は同じです。たとえば、Hyperlink フィールドは Text として扱われます。 追加のデータ型により、フォームやその他のコントロールの既定エクスペリエンスが向上します。

Blank

すべてのデータ型、空白 値を持つことができます (つまり、値なし)。 「null」 という用語は、この概念のデータベースでよく使用されます。

Blank 関数を Set または Patch 関数と共に使用して、変数またはフィールドを blank に設定します。 例えば、Set( x, Blank() ) は、グローバル変数 x の値を削除します。

IsBlank 関数を使用して、空白 の値をテストします。 Coalesce 関数を使用して、可能な 空白 の値を、空白 以外の値に置き換えます。

すべてのデータ型が 空白 をサポートしているため、Boolean そして Two option のデータ型は、効率的に 3 種類の値を持ちます。

これらの 4 つのデータ型はすべて、Unicode テキスト文字列に基づいて作成されます。

埋め込みテキスト

計算式に埋め込まれたテキスト文字列は、二重引用符で囲まれています。 2 つの二重引用符を一緒に使用して、テキスト文字列内の単一の二重引用符を表します。 たとえば、Button コントロールの OnSelect プロパティで次の式を使用します。

Notify( "Jane said ""Hello, World!""" )

ボタンを押すとバナーが表示され、最初と最後の二重引用符は省略され (テキスト文字列を区切るため)、Hello, World! を囲む二重引用符が繰り返される 単一の二重引用符で置き換えられます。

Jane が "Hello, World." と言ったというメッセージのポップアップ通知

特殊文字を含み、テキスト文字列内で意味を持たない識別子名には、一重引用符は使用されません。

画像とメディアのリソース

ファイル メニューを使用して、画像、ビデオ、オーディオ ファイルをアプリのリソースとして追加できます。 インポートされたファイルの名前は、アプリのリソース名になります。 この図では、nwindlogo という名前の Northwind Traders のロゴが、アプリに追加されました。

Northwind リソース。

このリソースをアプリで使用するには、Image コントロールの Image プロパティで指定します。

Northwind 画像。

画像およびその他のメディアの URI

Label コントロールの Text プロパティを nwindlogo に設定することで、最後の例を少し詳しく知ることができます。 ラベルはテキスト文字列を示します。

Northwind テキスト。

Power Fx は、クラウド内にあるかアプリ リソースとして追加されているかに関係なく、各画像またはその他のメディア ファイルを URI テキスト文字列で参照します。

たとえば、画像コントロールの Image プロパティは、アプリ リソースだけでなく、"https://northwindtraders.com/logo.jpg" のような Web 上の画像へのリンクも受け入れます。 この例では、プロパティは、データ URI スキームを使用するインライン画像も受け入れます。

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAFAQMAAACtnVQoAAAABlBMVEUAAAB0J3UMNU6VAAAAAXRSTlMAQObYZgAAABRJREFUCNdjUGJgCGVg6GgAkkA2AA8/AffqCEBsAAAAAElFTkSuQmCC"

その URI は、2 つの紫色のダイヤモンドの拡大バージョンを表示します。

ダブル ダイヤモンド。

画像コントロールの Image プロパティをカメラ コントロールの Photo プロパティに設定すると、Camera コントロールでキャプチャされた最新の画像を表示できます。 アプリは画像をメモリに保持し、カメラ コントロールの Photo プロパティは、画像への URI 参照を返します。 たとえば、写真を撮ると、カメラの Photo プロパティは "appres://blobmanager/7b12ffa2ea4547e5b3812cb1c7b0a2a0/1" を返します。

URI を使用して、データベースに保存されている画像または別のメディア ファイルを参照します。 そうすれば、アプリは必要になるまで実際のデータを取得しません。 たとえば、Microsoft Dataverse エンティティの添付ファイルは "appres://datasources/Contacts/table/..." を返す可能性があります。カメラの例のように、イメージ コントロールの Image プロパティをこの参照に設定することにより、イメージを表示できます。この参照は、バイナリ データを取得します。

画像などのメディア データ型をデータベースに保存すると、アプリは URI 参照ではなく、実際の画像またはメディア データを送信します。

サイズの制限

テキスト文字列および URI は、データ型の長さはあらかじめ設定されていません。

これらのデータ型が参照するバイナリ データにも、事前に設定されたサイズ制限はありません。 たとえば、現在 "appres://..." として参照されているカメラ コントロールを介してキャプチャされた画像は、デバイスのカメラが要求できる限りの大きさで高解像度にすることができます。 メディア ファイルの解像度、フレーム レート、およびその他の属性は、データ型によって制限されませんが、メディアの再生とキャプチャに関する特定のコントロールには、独自の制限がある場合があります。

ただし、すべてのデータ サイズは、アプリで利用可能なメモリ容量によって左右されます。 デスクトップ コンピューターで実行されているブラウザーは、通常 100 メガバイトを超えるデータをサポートします。 ただし、電話などのデバイスで使用可能なメモリ容量ははるかに少なく、通常は 30 - 70 メガバイトの範囲です。 アプリがこれらの制限内で実行されるかどうかを判断するには、実行するすべてのデバイスで一般的なシナリオをテストします。

ベスト プラクティスとして、必要な間だけメモリにデータを保持します。 できるだけ早く画像をデータベースにアップロードしてください。アプリのユーザーが要求した場合にのみ画像をダウンロードします。

Number と Currency

数値 および 通貨 のデータ型は、IEEE 754 倍精度浮動小数点標準を使用します。 この標準は、–1.79769 x 10308 ~ 1.79769 x 10308 で機能する幅広い数値を提供します。 表示できる最小値は、5 x 10-324 です。

Power Fx は、–9,007,199,254,740,991 (–(253 – 1)) と 9,007,199,254,740,991 (253 – 1) の間の整数 (それぞれの値を含む) を正確に表すことができます。 この範囲は、データベースが一般的に使用する 32 ビット (または 4 バイト) の整数データ型よりも大きいものです。 ただし、Power Fx は 64 ビット (または 8 バイト) の整数データ型を表すことはできません。 数値をテキスト フィールドに格納するか、計算列を使用して数値のコピーをテキスト フィールドに作成し、Power Fx で テキスト データ型にマッピングされるようにすることをお勧めします。 このようにして、これらの値を保持、表示、入力し、それらを比較して等しいかどうかを判断できます。ただし、この形式では数値計算を実行できません。

浮動小数点演算は概算であるため、多くの文書化された例で予期しない結果が生じることがあります。 55 / 100 100 という計算式は正確に 55 を返し、**(55 / 100 100) - 55 という計算式は正確にゼロを返すことが期待できます。 ただし、後者の式は 7.1054 x 10–15 を返します。これは小さい値ですがゼロではありません。 この小さな差分は通常問題を引き起こさず、アプリが結果を表示するときにはそれを切り上げます。 ただし、小さな差分がそれ以降の計算で積み重なり、間違った回答を与えるように見えることがあります。

多くの場合、データベース システムは通貨を保存し、10 進数を使用して計算を実行します。これにより、範囲は狭くなりますが、精度をより細かくコントロールできます。 デフォルトでは、Power Fx アプリは浮動小数点値の内外で通貨をマップします。したがって、結果は、ネイティブの 10 進データ型で実行される計算とは異なる場合があります。 このタイプの不一致によって問題が発生する場合は、ここのセクションで前述した大きな整数を扱うのと同じように、これらの値を テキスト として扱うこともできます。

Date、Time、DateTime

タイム ゾーン

日付/時刻の値は次のカテゴリに分類されます。

  • ユーザー ローカル:これらの値はUTC (世界協定時刻)に格納されますが、アプリ ユーザーのタイム ゾーンは、アプリが値を表示する方法と、アプリ ユーザーが値を指定する方法に影響を与えます。 たとえば、同じ時点はカナダのユーザーと日本のユーザーでは異なって見えます。
  • タイムゾーン非依存: タイムゾーンに関係なく、アプリはこれらの値を同じ方法で表示し、アプリユーザーは同じ方法で指定します。 同じ時点は、カナダのユーザーにも日本のユーザーにも同じように表示されます。 アプリが異なるタイム ゾーンで使用されることを予定していないアプリ作成者は、全体的にシンプルであるため、これらの値を使用します。

次のテーブルにいくつかの例を示します。

日付/時刻の種類 データベースに保存されている値 UTC の 7 時間西に表示および入力された値 UTC の 4 時間東に表示および入力された値
ユーザー ローカル Sunday, May 19, 2019
4:00 AM
Saturday, May 18, 2019
9:00 PM
Sunday, May 19, 2019
8:00 AM
タイム ゾーン非依存 Sunday, May 19, 2019
4:00 AM
Sunday, May 19, 2019
4:00 AM
Sunday, May 19, 2019
4:00 AM

Power Apps で使用される場合、ユーザー ローカル 日付/時刻については、Power Fx はブラウザやデバイスのタイム ゾーンを使用しますが、モデル駆動型アプリは Dataverse のユーザー設定を使用します。 これらの設定は通常は一致しますが、これらの設定が異なると結果も異なります。

DateAdd および TimeZoneInformation 関数を使用して、ローカル時間を UTC に変換し、再び戻します。 これらの関数については、ドキュメントの最後にある例を参照してください。

相当する数値

Power Fx は、UTC で ローカル ユーザー であるか タイムゾーンに依存しない であるかに関わらず、すべての日付/時刻値を保持して計算します。 アプリは、値を表示するとき、およびアプリ ユーザーが値を指定するときに、アプリ ユーザーのタイム ゾーンに基づいて値を変換します。

Power Fx が タイムゾーンに依存しない 値をデータ ソースから読み取るか、そのような値をデータ ソースに書き込むと、アプリは自動的に値を調整して、アプリのユーザーのタイムゾーンを補正します。 その後、アプリはその値を UTC 値として扱い、アプリ内の他のすべての日付/時刻の値と一致させます。 この補正のため、アプリがアプリ ユーザーのタイム ゾーンの UTC 値を調整すると、元の タイム ゾーン非依存 の値が表示されます。

Value 関数を使用して日付/時刻値の基になる数値にアクセスすることにより、この動作をより詳細に観察することができます。 この関数は、1970 年 1 月 1 日の 00:00:00.000 UTC からのミリ秒数として日付/時刻値を返します。

すべての日付/時刻値は UTC で保持され、Date 関数は日付を UTC で返すため、Value( Date( 1970, 1, 1 ) ) は世界のほとんどの場所でゼロを返しません。 たとえば、式は UTC から 8 時間オフセットされたタイム ゾーンで 28,800,000 を返します。 その数値は、8 時間のミリ秒数を反映しています。

上記の例に戻ります。

日付/時刻の種類 データベースに保存されている値 UTC の 7 時間西に表示および入力された値 Value 関数が返す
ユーザー ローカル Sunday, May 19, 2019
4:00 AM
Saturday, May 18, 2019
9:00 PM
1,558,238,400,000
(Sunday, May 19, 2019
4:00 AM UTC)
タイム ゾーン非依存 Sunday, May 19, 2019
4:00 AM
Sunday, May 19, 2019
4:00 AM
1,558,263,600,000
(Sunday, May 19, 2019
11:00 AM UTC)

Unix 時間の変換

Unix 時間は、1970 年 1 月 1 日 00:00:00 UTC 以降の秒数を反映しています。 Power Fx は秒ではなくミリ秒を使用するため、1,000 で乗算または除算することにより、2 つの間で変換できます。

たとえば、Unix 時間は 2001 年 9 月 9 日 01:46:40 UTC を 1,000,000,000 として表示します。 その日付/時刻の値をテキストとして表示するには、その数値に 1,000 を掛けてミリ秒に変換してから、テキスト関数で使用します。 計算式 *Text(1000000000 1000, DateTimeFormat.UTC) は、文字列 2001-09-09T01:46:40.000Z を返します。

ただし、DateTimeFormat.LongDateTime24 形式を UTCから -7 時間オフセットしたタイムゾーン (UTC の 7時間西) で使用すると、この関数は Saturday, September 8, 2001 18:46:40 を返します。 この結果は、ローカルのタイム ゾーンに基づいて、DateTime 値を正確に示してます。

Unix 時間に変換するには、Value からの結果を 1,000 で割ります。
RoundDown( Value( UnixTime ) / 1000, 0 )

さらに計算するため、または Power Apps 内で表示するために Date 値の Unix 時間が必要な場合は、次の式を使用します。
DateAdd( Date( 1970,1,1 ), UnixTime, Seconds )

SQL Server

SQL Server には DatetimeDatetime2、およびほかの日付/時刻データ型があり、タイム ゾーンのオフセットは含まれておらず、どのタイム ゾーンにいるかを示しません。 Power Fx は、これらの値が UTC に保存されていると想定し、ローカル ユーザー として扱います。 値がタイム ゾーン非依存である場合は、TimeZoneOffset 関数を使用して UTC 変換を修正します。

Power Fx は、値をアプリの内部 UTC 表現に変換するとき、Datetimeoffset フィールドに含まれているタイムゾーン情報を使用します。 アプリは、データを書き込むときに、常にタイム ゾーン (ゼロ タイム ゾーン オフセット) として UTC を使用します。

Power Fx は、SQL Server で Time データ型の値の読み取りと書き込みを、ISO 8601 期間形式のテキスト文字列として行います。 たとえば、この文字列形式を解析し、Time 関数を使用してテキスト文字列 "PT2H1M39S"時間 値に変更する必要があります。

With( 
    Match( "PT2H1M39S", "PT(?:(?<hours>\d+)H)?(?:(?<minutes>\d+)M)?(?:(?<seconds>\d+)S)?" ),
    Time( Value( hours ), Value( minutes ), Value( seconds ) )
)
// Result: 2:01 AM (as shown in a label control, use the Text function to see the seconds)

日付と時刻情報の組み合わせ

DateTime、および DateTime は、名前は異なりますが、日付と時刻に関する情報はすべて同じです。

Date の値には、通常は真夜中の時刻情報を含めることができます。 Time の値には、日付情報を含めることができます。通常は 1970 年 1 月 1 日です。 Dataverse は、日付のみ のフィールドに時刻情報も格納しますが、既定では日付情報のみが表示されます。 同様に、Power Fx は、これらのデータ型を区別して、デフォルトの形式とコントロールを決定する場合があります。

日付と時刻の値を直接加算および減算することはお勧めしません。タイムゾーンやその他の変換が結果に混乱が生じさせることがあります。 Value 関数を使用して、最初に日付/時刻の値をミリ秒に変換し、アプリ ユーザーのタイム ゾーンを考慮に入れるか、DateAdd および DateDiff 関数を使用して、これらの値のいずれかを加算または減算します。

Option sets、Two options

Option sets と Two options のデータ型は、アプリ ユーザーに 2 つ以上の選択肢を提供します。 たとえば、受注状態 のオプション セットは、新規発送済み請求済み、および クローズ の選択肢を提供する場合があります。 Two option のデータ型は、2 つの選択肢のみ提供します。

これらのデータ型はどちらも、テキスト文字列のコンテキストでラベルを表示します。 たとえば、コントロールの Text プロパティがそのオプション セットを参照する計算式に設定されている場合、ラベル コントロールは受注状態オプションの 1 つを表示します。 オプション ラベルは、さまざまな場所のアプリ ユーザー向けにローカライズされる場合があります。

アプリのユーザーがオプションを選択してその変更を保存すると、アプリはデータをデータベースに送信し、データベースはそのデータを言語に依存しない表現で保存します。 Two option のオプションは数値として送信および保存され、2 つのオプションのデータ型のオプションはブール値として送信および保存されます。

ラベルは表示のみを目的としています。 ラベルは言語に固有であるため、ラベルを直接比較することはできません。 代わりに、各オプション セットには、基になる数値またはブール値で機能する列挙があります。 たとえば、この計算式は使用できません。

If( ThisItem.OrderStatus = "Active", ...

ただし、次の数式を使用できます。

If( ThisItem.OrderStatus = OrderStatus.Active, ...

(エンティティが共有する) グローバル オプション セットの場合、Two option 列挙の名前は、グローバル オプション セットの名前と一致します。 (エンティティを対象とする) ローカル オプション セットの場合、名前にはエンティティの名前が含まれる場合があります。 この動作により、複数のエンティティに同じ名前のオプション セットがある場合の競合が回避されます。 たとえば、取引先企業 エンティティには 受注状況 オプション セットがあり、その名前は 受注状況 (取引先企業) になります。 その名前には 1 つ以上のスペースとかっこが含まれるため、計算式で参照する場合は、単一引用符で囲む必要があります。

さらに、2 つのオプションの値はブール値としても動作します。 たとえば、課税状況 という名前の 2 つのオプションの値には、課税対象 そして 非課税 というラベルがあり、それぞれ true および false に対応しています。 デモの目的で、この計算式を使用できます。

If( ThisItem.Taxable = TaxStatus.Taxable, ...

この等価な式も使用できます。

If( ThisItem.Taxable, ...