Power Fx は、Microsoft Power Platformが使用するローコード言語です。 これは、汎用の厳密に型指定された宣言型の関数型プログラミング言語です。
Power Fx は、人が使いやすいテキストで表現されています。 作成者が Excel のような数式バーまたは Visual Studio Code のテキスト ウィンドウで直接操作できるローコード言語です。 ローコードの "低" は、言語の簡潔でシンプルな性質から来ています。これにより、一般的なプログラミング タスクが作成者と開発者の両方にとって簡単になります。 これまでにプログラミングしたことがない人のためのノーコードから、経験豊富なプロフェッショナル向けの「プロコード」まで、学習や書き換えのない崖の間に開発の全範囲を可能にします。 多様なチームが共同作業を行い、時間と費用を節約できます。
Note
- Microsoft Power Fx は、Power Apps のキャンバス アプリの数式言語の新しい名前です。 この概要と関連記事は、Microsoftキャンバス アプリから言語を抽出し、他のMicrosoft Power Platform製品と統合し、オープンソースとして使用できるようになるため、進行中の作業です。 今日の言語についてもっと学び、体験するには、Power Apps ドキュメントのキャンバス アプリで数式を使い始めるから開始し、Power Apps 無料試用版に無料でサインアップします。
- この記事では、 作成者 は、プログラミング スキルの範囲の両端で機能を使用する可能性があるユーザーを指します。 開発者は、機能がより高度であり、一般的なExcelユーザーの範囲を超える可能性がある場合にユーザーを参照します。
Power Fx は、宣言型のスプレッドシートのような数式でオブジェクトをバインドします。 たとえば、その他のコントロールのプロパティに基づいて値を計算する関連式を使用して、UI コントロールの表示プロパティを Excel ワークシートのセルとして考えます。 計算式のロジックは、スプレッドシートと同様に値を自動的に再計算しますが、これはコントロールの表示方法に影響します。
また、Power Fx は必要に応じて命令論理を提供します。 通常、ワークシートにはデータベースに変更を送信できるボタンはありませんが、アプリにはよくあります。 宣言型ロジックと命令型ロジックの両方に同じ式言語が使用されます。
Microsoftでは、Power Fx をオープンソース ソフトウェアとして利用できるようになります。 現在、キャンバス アプリに統合されており、Microsoftは、他のMicrosoft Power Platform製品やオープンソースで使用するために、Power Appsから抽出する処理中です。 詳細については、GitHub 上での Microsoft Power Fx を参照してください
この記事は、言語とそのデザイン原則の概要です。 Power Fx の詳細については、次の記事を参照してください。
スプレッドシートで考えてみる
Excel でワークシートを作成するのと同じくらい簡単にアプリを作成できるとしたらどうでしょうか?
既存のスプレッドシートの知識を活用できるとしたらどうでしょうか?
これらの質問は、Power Appsと Power Fx の作成に影響を与えました。 毎日何億人ものユーザーがExcelでワークシートを作成しています。 簡単で、既に知っているExcel概念を使用するアプリの作成について説明します。 Power Apps から Power Fx を壊すことによって、ビルディング オートメーション、仮想エージェント、またはその他のドメインに関するこれらの質問に答えます。
Power Fx を含むすべてのプログラミング言語には、式 (数値、文字列、またはその他のデータ型の計算を表す方法) があります。 例えば、ほどんどの言語の mass * acceleration は、mass と acceleration の乗算を表します。 式の結果を変数に格納したり、プロシージャの引数として使用したり、より大きな式に入れ子にしたりすることができます。
Power Fx は、これをさらに一歩進めます。 式自体は、計算内容については何も述べません。 それを変数に入れるか、関数に渡すかは作成者次第です。 Power Fx では、特定の意味を持たない式を書くだけでなく、式を識別子にバインドする数式を書きます。
force = mass * acceleration を計算するために、計算式として force と入力します。
massまたはaccelerationが変更されると、force自動的に新しい値に更新されます。 式は計算を記述し、計算式はその計算に名前を付け、レシピとして使用されます。 これが私たちが Power Fx を式言語と呼ぶ理由です。
たとえば、この スタック オーバーフローからの計算式 は文字列を逆の順序で検索します。 Excel では、次の画像のように見えます。
=RIGHT(A1,LEN(A1)- FIND("|", SUBSTITUTE(A1," ","|", LEN(A1)-LEN(SUBSTITUTE(A1," ","")))) という計算式が入力されている Excel の数式バーのスクリーンショットです。セル A1 に含まれているテキストは次の通りです。「Hello, World! It is great to meet you!」 セル A2 には 「you!」 というテキストが含まれています。
Power Fx は、セル参照がコントロール プロパティ参照に置き換えられ、これと同じ数式で機能します。
Power Apps の Power Fx 式バーのスクリーンショット。 =RIGHT(Input.Text,Len(Input.Text)- FIND("|", SUBSTITUTE(Input.Text," ","|", Len(Input.Text)-Len(Substitute(Input.Text," ","")))) という計算式。下の数式の入力ボックスのテキストは次の通りです。「Hello, World! It is great to meet you!」と一文字一文字表示されます。 同時に、ラベル ボックスに、最後の単語の文字が表示されます。 入力ボックスに全文が表示されたら、「you!」という単語がラベルボック氏に表示されます。
Input コントロールの値が変更されると、Label コントロールによって数式が自動的に再計算され、新しい値が表示されます。 その他の言語でよくあるような OnChange のイベント ハンドラーはここではありません。
別の例では、画面の Fill 色に数式を使用します。 赤、緑、青を制御するスライダーが変化すると、背景色は再計算中に自動的に変更されます。
他の言語でよくあるような、スライダー コントロールに必要な OnChange のイベントはありません。 明示的に Fill プロパティを設定する方法はありません。 色が意図したとおりに機能しない場合、1 つの計算式を調べて、機能していない理由を理解する必要があります。 予期しないときにプロパティを設定するコードを見つけるためにアプリを検索する必要はありません。時間の要素はありません。 正しい計算式の値は常に保持されます。
スライダーが暗い色に設定されると、赤、緑、青のラベルが白に変わり、補正されます。 この変更は、各ラベル コントロールの Color プロパティの単純な数式によって行われます。
この数式の優れた点は、 Fill の色で何が起こっているかから分離されていることです。これらはまったく異なる 2 つの計算です。 通常 Power Fx ロジックでは、大きなモノリシック プロシージャではなく、多数の独立した小さな式で構成されています。 この構造により、理解しやすくなり、既存のロジックを妨げることなく拡張機能が有効になります。
Power Fx は、Excel と同様に宣言型の言語です。 作成者は動作を定義しますが、その実行方法とタイミングを決定し最適化するのはシステム次第です。 実際には、ほとんどの処理が副作用が生じない純粋関数によって実行されるため、Power Fx は関数型の言語と言えます (Excel と同様)。
常にライブ
ワークシートの定義的な側面は、ワークシートが常にライブであり、変更が即座に反映されることです。 ワークシートにコンパイル モードまたは実行モードはありません。 数式を変更したり値を入力したりすると、ワークシートはすぐに再計算され、変更が反映されます。 検出されたエラーはすぐに表示され、ワークシートの残りの部分に干渉しません。
Power Fx は同じものを実装します。 インクリメンタル コンパイラを使用して、動作しているデータとプログラムの同期を継続的に維持します。 変更はプログラムのグラフを通じて自動的に反映され、依存計算の結果に影響します。 これらの計算は、色や位置などのコントロールのプロパティを駆動する場合があります。 増分コンパイラでは、IntelliSense、提案、オートコンプリート、および型チェックを備えた豊富な数式編集エクスペリエンスも実現します。
次のアニメーションでは、ラベルの下に 2 つのエラーがある場合でも、スライダー コントロールに依存するラベル コントロールに順序番号が表示されます。 このアプリは常に新鮮で、インタラクティブです。 最初に .InvalidName と入力して数式の修正を試みると、すぐに赤い線が表示されてエラーが表示されますが、アプリは実行を続けます。
.Employee入力すると、Data ペインで Employees テーブルが追加され、このテーブルのメタデータが取得され、列の候補がすぐに表示されます。 テーブル間のリレーションシップを調べて、システムがアプリの参照に必要な調整を行いました。
.Customer を追加するときに同じことが起こります。
変更するたびに、スライダーは最後の値で続行し、変数はその値を保持します。 全体を通して、注文番号は引き続き上部のラベルに表示されます。 アプリはライブであり、リアルタイムのデータを処理します。 保存したり、離れて歩いたりして、他のユーザーがExcelと同じように開いて使用できます。 ビルド ステップもコンパイルもなく、ユーザーに対応できるアプリのバージョンを決定する発行手順しかありません。
ロー コード
Power Fx は、簡潔でありながら強力な式でビジネスロジックを説明します。 ほとんどのロジックは 1 行に減り、より複雑なニーズに対する表現力と制御が十分に備えられます。 目標は、作成者が理解する必要のある概念の数を最小限に抑えることです。理想は、Excel ユーザーがすでに把握している概念の数を超えないようにすることです。
たとえば、注文について従業員の名を検索するには、次のアニメーションに示すように Power Fx を記述します。 ここで Excel の概念を超えて追加された唯一の概念は、この の場合のようにデータ構造を調べるためのドット .Employee.'First Name' です。 アニメーションは、Power Fx の式の一部とそれと同等の JavaScript でのコーディングに必要な概念のマッピングを示しています。
Power Fx が私たちのために行うことと、数式が宣言型であるために最適化する必要がある自由について、さらに詳しく見てみましょう。
非同期: Power Fx でのすべてのデータ操作は非同期です。 作成者はこれを指定する必要はなく、呼び出しが終了した後、作成者は操作を同期する必要もありません。 メーカーはこの概念を意識する必要はありません。Promise またはラムダ関数についての知識も必要ありません。
ローカルおよびリモート: Power Fx は、メモリ内のローカル データと、データベースまたはサービス内のリモート データに対して同じ構文と関数を使用します。 ユーザーはこの違いについて考える必要はありません。 Power Fx は自動的にサーバーに委任し、フィルターやソートをより効率的に処理します。
リレーショナル データ: Orders と Customers は異なる 2 つのテーブルであり、多対一のリレーションシップを持っています。 OData クエリには、SQLでの Join と同様に、外部キーの知識を持つ "$expand" が必要です。 この数式には存在しません。実際、データベース キーの概念もメーカーは知る必要がありません。 メーカーは、単一のドット表記を使用して、レコードからリレーションシップのグラフ全体にアクセスできます。
プロジェクション: クエリを記述するとき、多くの開発者は
select * from tableと記述し、データのすべての列を戻します。 Power Fx は、式の依存関係を越えて、アプリ全体で使用されているすべての列を解析します。 プロジェクションは自動的に最適化されます。作成者は「プロジェクション」の意味を知る必要はありません。必要な項目だけを取得する: この例では、
LookUp関数は 1 つのレコードのみを取得し、それだけを返すことを意味しています。Filter関数を使用してさらに多くのレコードを要求した場合、 数千件のレコードが見込みありと評価されることもある 一度に返されるデータは 1 ページ分のみで、ページあたり 100 レコードのオーダーです。 ユーザーは、ギャラリーまたはデータ テーブルをジェスチャしてさらに多くのデータを表示する必要があり、自動的に追加のデータが取り込まれます。 作成者は、データ要求を管理が可能な塊に制限することを考えることなく、大きなデータ セットについて考えることができます。必要な場合にのみ実行: ラベル コントロールの
Textプロパティの数式を定義します。 選択した変数が変わると、LookUpは自動的に再計算され、ラベルが更新されます。 作成者は、Selectionの OnChange ハンドラーを記述する必要はなく、このラベルがそれに依存していることを覚えておく必要もありませんでした。 先程も述べたように、これは宣言型プログラムです。メーカーはラベルに何を入れたいかを指定し、いつどのようにフェッチするかは指定しません。 このラベルが表示されない画面上にあるために表示されない場合や、そのVisibleプロパティが false の場合は、ラベルが表示されるまでこの計算を延期し、ほとんど発生しない場合は効果的に削除できます。Excel構文の翻訳 : 多くのユーザーは、アンパサンド (& ) がExcelでの文字列連結に使用されることを知っています。 JavaScript はプラス記号 (+) を使用し、その他の言語はドット (.) を使用します。表示名とローカライズ:
First Nameは Power Fx 式で使用され、nwind_firstnameは JavaScript と同等のもので使用されます。 Microsoft Dataverse および SharePoint では、一意の論理名に加えて、列とテーブルのための表示名があります。 この場合のように、表示名は多くの場合ずっと使いやすいですが、ローカライズできるという別の重要な性質があります。 多言語のチームがある場合、各チームのメンバーは自分の言語でテーブル名とフィールド名を表示できます。 すべてのユース ケースにおいて、Power Fx は自動的に正しい論理名をデータベースに送信します。
コードなし
ロジックの表現を開始するために、Power Fx を読み書きする必要はありません。 単純なスイッチと UI ビルダーを使用して、多くのカスタマイズとロジックを表現できます。 これらのコードなしのツールは、Power Fx の読み取りと書き込みを行うために構築されているため、誰かがそれをさらに進めるために十分な余裕があります。 ただし、コードなしのツールでは、完全な言語のすべての表現力が提供されることはありません。 コードなしのビルダーを使用する場合でも、数式バーはPower Appsの前面と中央にあり、Power Fx の学習を開始できるように、作成者に代わって何が行われているかについて教育します。
いくつかの例を見てみましょう。 Power Apps で、プロパティ パネルには、コントロールのプロパティで使用するノーコード スイッチとノブがあります。 実際には、ほとんどのプロパティの値は静的です。 カラー ビルダーを使用して、Gallery の背景色を変更することができます。 数式バーにこの変更が反映され、数式が別の RGBA 呼び出しに更新されていることを確認します。 いつでも数式バーに移動し、この変更をさらに進めることができます。この例では、 ColorFade を使用して色を調整します。 色のプロパティは引き続きプロパティ パネルに表示されますが、fx のアイコンはホバーしたときに表示され、数式バーに移動します。 これは 2 つの方法で完全に機能します。ColorFade 呼び出しを削除することによりプロパティ パネルが理解できるものに色を返し、それを再度使用して色を設定できます。
次の例はさらに複雑です。 ギャラリーには、Dataverse から従業員の一覧が表示されます。 Dataverse は、テーブル データのビューを提供します。 これらのビューの 1 つを選択し、数式を変更して、このビュー名で Filter 関数を使用できます。 2 つのドロップダウン メニューを使用して、数式バーに触れることなく、正しいテーブルとビューをダイヤルできます。 しかし、さらに並べ替えを追加したいとします。 その関数を数式バーに追加すると、プロパティ パネルに fx アイコンが再び表示され、数式バーに変更が送られます。 また、プロパティ パネルが読み取りおよび書き込みできる内容に数式を簡略化する場合は、それを使用できます。
これらの例は単純です。 Power Fx は、コードなしの対話を記述するための優れた言語です。 簡潔で強力で、簡単に解析できます。 これは、ローコードまで「崖なし」で頻繁に必要なヘッドルームを提供します。
プロ コード
ローコード作成者は、専門家の助けを必要とするソリューションを構築したり、プロの開発者によって引き継がれて保守や強化を行ったりすることがあります。 専門家はまた、ローコード開発は、専門的なツールを構築するよりも、簡単、迅速、低コストであることを高く評価しています。 すべての状況で Visual Studio のフル パワーが必要なわけではありません。
専門家は、生産性を最高にするために専門的なツールを使用したいと考えています。 Power Fx の数式は、Visual Studio Code、Visual Studio、またはその他のテキスト エディターを使用して簡単に編集できる YAML ソース ファイルに格納できます。 YAML ファイルに数式を格納すると、GitHub、Azure DevOps、またはその他のソース コード管理システムを使用して、Power Fx をソース管理下に配置できます。
Power Fx は、共有と再利用のための数式ベースのコンポーネントをサポートします。 コンポーネントのプロパティに対するパラメーターをサポートし、途中でより多くの機能強化を加えた純粋なユーザー定義関数の作成を可能にします。
また、Power Fx は専門家によって構築されたコンポーネントとサービスをつなぎ合わせるのに適しています。 すぐに使用できるコネクタを使用すると、何百ものデータ ソースと Web サービスにアクセスできます。 カスタム コネクタを使用すると、Power Fx が任意の REST Web サービスと通信できます。 コード コンポーネントを使用すると、Power Fx は画面上およびページ上で完全にカスタムの JavaScript と対話できます。
設計原則
シンプル
Power Fx は、メンバーが開発者としてトレーニングされていないメーカーの対象ユーザーをターゲットにするように設計されています。 可能な限り、この言語では、この対象ユーザーが既に知っているか、すぐに取得できる知識が使用されます。 成功するために必要な概念の数は最小限に抑えられています。
シンプルであることは、開発者にとっても都合の良いことです。 開発者の対象ユーザーにとって、Power Fx は、ソリューションの構築に必要な時間を短縮する低コード言語を目指しています。
Excel 整合性
Microsoft Power Fx 言語は、Excel の数式言語から大きく借用しています。 また、Excelを使用する多くのメーカーからのExcel知識と経験を活用しています。 タイプ、演算子、および関数のセマンティクスは、可能な限り Excel に近いものにしています。
Excelに回答がない場合、Power Fx は次に SQL を検索します。 Excel の次に、SQL は最も一般的に使用される宣言型言語であり、Excel にはないデータ操作と厳密な型指定に関するガイダンスを提供することができます。
宣言型
作成者は、正確にはどのようにまたはいつ行うかではなく、ロジックが何を行うかを説明します。 この方法を使用すると、並列で操作を実行し、必要になるまで作業を延期し、キャッシュされたデータをプリフェッチして再利用することで、コンパイラを最適化できます。
たとえば、Excel ワークシートでは、作成者はセル間のリレーションシップを定義しますが、数式を評価するタイミングと順序Excel決定します。 同様に、アプリ内の数式は、ユーザー アクション、データベースの変更、タイマー イベントに基づいて、必要に応じて "再計算" と考えることができます。
関数型
副作用のない純粋な関数を使用します。 このアプローチにより、理解しやすいロジックが得られ、コンパイラに最適化の自由度が最も高まります。
Excelとは異なり、アプリの性質上、状態が変更されます。 たとえば、アプリには、データベース内のレコードへの変更を保存するボタンがあります。 一部の機能, したがって, 副作用を持っています, しかし、限り、これらの副作用は実用的であるとして制限します.
コンポジション
可能であれば、既存の機能をうまく構成する機能を追加します。 強力な機能をより小さな部分に分解し、個別に使いやすくなります。
たとえば、ギャラリー コントロールには個別の Sort および Filter プロパティの機能がありません。 代わりに、 Sort 関数と Filter 関数を 1 つの Items プロパティにまとめる必要があります。 このプロパティの双方向エディターを使用して、 Sort と Filter の動作を Items プロパティの上に重ねて表示します。
厳密な型指定
すべての値の型はコンパイル時に認識されます。 このアプローチにより、作成中にエラーや豊富な提案を早期に検出できます。
ポリモーフィック型はサポートされていますが、使用する前に、その型を静的型にピン留めする必要があり、その型はコンパイル時に認識されている必要があります。 IsType と AsType 関数は、型のテストとキャストのために提供されています。
型の推定
型は、宣言せずに使用することで派生します。 たとえば、変数を数値に設定すると、変数の型が数値として確立されます。
型の使用法が競合すると、コンパイル時エラーが発生します。
ロケールに依存する小数点
たとえば、世界の一部の地域ではドット (.) が、その他の地域ではコンマ (,) が小数点として使用されます。 Excelは、この地域規則に従います。 一般に、他のプログラミング言語では、世界中のすべてのユーザーの小数点区切り記号として正規のドット (.) が使用されます。 すべてのレベルの作成者にとって可能な限りアクセスしやすいものであるために、3,14 が、その構文を生涯にわたって使用してきたフランスのユーザーにとって 10 進数であることは重要です。
小数点の選択は、関数呼び出し引数に使用される一覧の区切りとチェーン演算子に対して、カスケードの影響を及ぼします。
| 作成者の言語の小数点 | Power Fx 小数点 | Power Fx リスト区切り記号 | Power Fx チェーン演算子 |
|---|---|---|---|
| . (ドット) | . (ドット) | , (コンマ) | ; (セミコロン) |
| , (コンマ) | , (コンマ) | ; (セミコロン) | ;; (二重セミコロン) |
詳細については、グローバル サポート を参照してください
オブジェクト指向ではありません
Excel も Power Fx もオブジェクト指向ではありません。 たとえば、一部の言語では、文字列の長さは、"Hello World".length JavaScript のように文字列のプロパティとして表されます。 Excel と Power Fx は、代わりに関数に関しては Len( "Hello World" ) のように表します。
プロパティとメソッドを持つコンポーネントはオブジェクト指向であり、Power Fx は簡単に連携します。 ただし、可能な場合は、機能的なアプローチを優先します。
Extensible (拡張可能)
開発者は、Power Fx 自体を使用してコンポーネントと機能を作成できます。 開発者は、JavaScript を使用してコンポーネントと関数を作成できます。
開発者向け
メーカーは主なターゲットですが、可能な限り開発者に優しい存在にしてください。 前に説明した設計原則と競合しない場合は、開発者が理解する方法で操作を行います。 たとえば、Excelにはコメントを追加する機能がないため、C のような行とインラインコメントを使用します。
言語の発展
プログラミング言語を進化させることは必要であり、また注意も必要です。 すべてのユーザーは、当然のことながら、どれほどよい意図があっても、変更が既存のコードを壊し、新しいパターンを学ぶことをユーザーに要求することがあることを心配しています。 Power Fx は下位互換性を真剣に受け止めていますが、Power Fx チームは、常に初めて正しく機能するとは限らず、コミュニティが何が最善かを集合的に学習できることを強く信じています。 プログラミング言語は進化する必要があり、Power Fx は最初から言語の進化をサポートするように設計されています。
保存されたすべての Power Fx ドキュメントには、言語バージョンのスタンプが含まれています。 Power Fx チームが互換性のない変更を行いたい場合は、次回編集時に数式を自動的に書き換える"バック互換性コンバーター" と呼ばれるものを記述します。 変更がチームがユーザーを教育するために必要な重要な変更である場合、アプリはドキュメントへのリンクを含むメッセージを表示します。この機能を使用することで、Power Fx は、それ以降に発生したすべての変更にもかかわらず、何年も前のPower Appsのプレビュー バージョンで構築されたアプリを読み込むことができます。
たとえば、Power Fx チームは、赤い背景でエラー バナーを表示する ShowError 関数を導入しました。
ユーザーはそれを愛していましたが、成功バナー (緑の背景) または情報バナー (青い背景) を表示する方法も求めました。 そのため、チームは、通知の種類に対して 2 番目の引数を受け取る、より汎用的な Notify 関数を思い付きました。 チームは Notify を追加し、そのまま ShowError 維持できましたが、代わりに ShowError を Notifyに置き換えました。 彼らは以前に運用環境にあった関数を削除し、別のものに置き換えた。 同じことを行うには 2 つの方法があるため、この変更により、特に新しいユーザーにとって混乱が生じ、最も重要なのは複雑さが増した可能性があります。 不満を持つ人はなく、誰もが変更に賛成し、次の通知機能に話を進めました。
Power Apps の最新バージョンに読み込まれたときに、同じアプリはこのように表示されます。 ユーザーがこの変換を実行するのにアクションは必要ではなく、アプリを開いたときに自動的に実行されました。
この機能を使用することで、Power Fx はほとんどのプログラミング言語よりも迅速かつ積極的に進化できます。
未定義の値はありません
JavaScript などの一部の言語は、初期化されていない変数またはプロパティがない未定義の値の概念を使用しています。 わかりやすくするために、Power Fx はこの概念を回避します。 その他の言語において、定義されていないインスタンスは、エラーまたは空白の値として扱われます。 たとえば、初期化前の状態に戻されたすべての変数は空白の値で始まります。 すべてのデータ型は空白の値で実行できます。
関連記事
データ型
演算子と識別子
テーブル
変数
命令型ロジック
グローバル サポート
式の文法
YAML 式の文法
キャンバス アプリの式