Microsoft Power Fx の概要
Power Fx は Microsoft Power Platform 全体で使用されるロー コード言語です。 汎用、厳密な型指定、宣言型、そして関数型のプログラミング言語です。
Power Fx は、人が使いやすいテキストで表現されています。 作成者が Excel のような数式バーまたは Visual Studio Code のテキスト ウィンドウで直接操作できるローコード言語です。 ローコードの「ロー」は、言語の簡潔でシンプルな性質によるものであり、一般的なプログラミング タスクを作成者と開発者の両方にとって容易にします。 これにより、プログラミング経験のない人向けのコードなしから経験豊富な専門家向けの「プロコード」まであらゆる開発が実現し、新たに学ぶことや書き直しの必要がないので、さまざまなチームが協力して時間と費用を節約できます。
Note
- Microsoft Power Fx は、Power Apps のキャンバス アプリの数式言語の新しい名前です。 この概要と関連記事は、キャンバス アプリから言語を抽出し、その他の Microsoft Power Platform 製品と統合して、オープン ソースとして利用できるようにするために進行中の作業です。 今日の言語についてもっと学び、体験するには、Power Apps ドキュメントのキャンバス アプリで数式を使い始めるから開始し、Power Apps 無料試用版に無料でサインアップします。
- この記事では、プログラミング スキルのスペクトラムの最後で使用される機能について説明する場合、作成者を参照します。 機能がより高度で、一般的な Excel ユーザーの範囲を超えている場合、開発者としてユーザーを参照します。
Power Fx は、宣言型のスプレッドシートのような数式でオブジェクトをバインドします。 たとえば、その他のコントロールのプロパティに基づいて値を計算する関連式を使用して、UI コントロールの表示プロパティを Excel ワークシートのセルとして考えます。 計算式のロジックは、スプレッドシートと同様に値を自動的に再計算しますが、これはコントロールの表示方法に影響します。
また、Power Fx は必要に応じて命令論理を提供します。 通常、ワークシートにはデータベースに変更を送信できるボタンはありませんが、アプリにはよくあります。 宣言型ロジックと命令型ロジックの両方に同じ式言語が使用されます。
Power Fx は、オープンソース ソフトウェアとして利用できるようになります。 現在、キャンバス アプリに統合されており、他の 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
を計算するために、計算式として force = mass * acceleration
と入力します。 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は、多対1の関係を持つ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 は、ノーコードの対話を記述するための優れた言語になると確信しています。 Power Fx は簡潔で強力、そして解析が簡単で、「障壁のない」ローコードに必要なヘッドルームを提供します。
プロ コード
ローコードの作成者は、専門家の助けを必要とするものや、プロの開発者によって保守や拡張が行われるものをビルドすることがあります。 専門家はまた、ローコード開発は、専門的なツールを構築するよりも、簡単、迅速、低コストであることを高く評価しています。 すべての状況で Visual Studio のフル パワーが必要なわけではありません。
専門家は、生産性を最高にするために専門的なツールを使用したいと考えています。 Power Fx 数式は YAML ソース ファイルに保存できます。これは、Visual Studio Code、Visual Studio またはその他のテキスト エディタで簡単に編集でき、Power Fx が GitHub、Azure DevOps、またはその他のソースコード管理システムでソース管理下に置かれるようにします。
Power Fx は、共有と再利用のための数式ベースのコンポーネントをサポートします。 さらに機能が強化された純粋なユーザー定義関数を作成できるように、コンポーネント プロパティへのパラメーターのサポートを発表しました。
また、Power Fx は専門家によって構築されたコンポーネントとサービスをつなぎ合わせるのに適しています。 すぐに使用できるコネクタは、何百ものデータソースと Web サービスへのアクセスを提供し、カスタム コネクタは Power Fx が任意の REST Web サービスと通信できるようにし、コード コンポーネントは Power Fx が画面とページで完全にカスタム化された JavaScript と対話できるようにします。
設計原則
シンプル
Power Fx は、メンバーが開発者としてトレーニングされていない開発者対象ユーザーをターゲットにするように設計されています。 この対象ユーザーがすでに馴染みのある知識や、すぐに理解できる知識をできるだけ使用します。 成功するために必要な概念の数は最小限に抑えられています。
シンプルであることは、開発者にとっても都合の良いことです。 開発者対象ユーザーに役立つよう、ソリューションの構築に必要な時間を短縮するローコード言語を目指しています。
Excel 整合性
Microsoft Power Fx 言語は、Excel の数式言語から大きく借用しています。 Excel を使用する多くの作成者の Excel の知識と経験を活用します。 タイプ、演算子、および関数のセマンティクスは、可能な限り Excel に近いものにしています。
Excel に答えがない場合は、SQL を見てみます。 Excel の次に、SQL は最も一般的に使用される宣言型言語であり、Excel にはないデータ操作と厳密な型指定に関するガイダンスを提供することができます。
宣言型
作成者は、正確にはどのようにまたはいつ行うかではなく、ロジックが何を行うかを説明します。 これにより、コンパイラは、操作の並行実行、必要になるまでの延期、またキャッシュ データの事前にフェッチと再利用により、最適化を行うことができます。
たとえば、Excel ワークシートの場合、作成者はセル内でリレーションシップを定義しますが、Excel は数式を評価する時と順序を決定します。 同様に、アプリの計算式は、ユーザーのアクション、データベースの変更、またはタイマー イベントに基づいて、必要に応じて「再計算」すると考えることができます。
関数型
副作用のない純粋な関数を優先します。 これにより、ロジックは理解しやすくなり、コンパイラは最も自由に最適化できるようになります。
Excel では、アプリはその性質上、状態を変化させます たとえば、アプリにはデータベースのレコードへの変更を保存するボタンがあります。 したがって、実用的な範囲で制限しますが、一部の機能には副作用があります。
コンポジション
可能な場合、追加された機能は既存の機能と共に適切に作成されます。 強力な機能は、より簡単に独立して使用できる小さな部分に分解できます。
たとえば、ギャラリー コントロールには個別の Sort
および Filter
プロパティの機能がありません。 代わりに、Sort
と Filter
機能は 1 つの Items
プロパティに一緒に構成されます。 Sort
および Filter
動作を表す UI は、このプロパティに双方向のエディターを使用することにより、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 Apps のプレビュー バージョンで何年も前にビルドされたアプリを引き続き読み込むことができます。
たとえば、赤いバックグラウンドのエラー バナーを表示する ShowError
関数を紹介しました。
ユーザーは気に入ったようですが、成功バナー (緑色の背景) または情報バナー (青色の背景) の表示方法を質問するユーザーもいました。 通知の種類を 2 番目の引数とする、より汎用的な Notify
関数を考えました。 Notify
を追加し、ShowError
を現在のまま保持することもできましたが、代わりに ShowError
を Notify
で置き換えました。 以前は運用されていた機能を削除し、他のものに置き換えました。 同じことを実行するのに 2 つの方法があったため、特に新しいユーザーには混乱を引き起こし、最も重要なこととして複雑性が加わりました。 不満を持つ人はなく、誰もが変更に賛成し、次の通知機能に話を進めました。
Power Apps の最新バージョンに読み込まれたときに、同じアプリはこのように表示されます。 ユーザーがこの変換を実行するのにアクションは必要ではなく、アプリを開いたときに自動的に実行されました。
この施設で、Power Fx はほとんどのプログラミング言語よりも速く、より積極的に進化することができます。
未定義の値はありません
JavaScript などの一部の言語は、初期化されていない変数またはプロパティがない未定義の値の概念を使用しています。 簡単にするために、この概念は避けました。 その他の言語において、定義されていないインスタンスは、エラーまたは空白の値として扱われます。 たとえば、初期化前の状態に戻されたすべての変数は空白の値で始まります。 すべてのデータ型は空白の値で実行できます。
関連記事
データ型
演算子と識別子
テーブル
変数
命令型論理
グローバルサポート
表現文法
YAML式の文法
キャンバス アプリの数式