PowerPlatform、モデル駆動型の研究

ジン・フリークス。日本人。

PowerAppsモデル駆動型アプリで「非同期データ取得」を活用しよう

 

PowerAppsモデル駆動型アプリで「非同期データ取得」を活用しよう

目次

  1. 概要
  2. PowerAppsでの非同期データ取得の重要性
  3. 非同期処理のメリット
  4. 具体例:顧客データの非同期取得
  5. 実装例とコードの比較
  6. 関連メソッドと構文
  7. 技術的な豆知識と制限事項
  8. 実践問題

概要

本記事では、PowerAppsモデル駆動型アプリにおける非同期データ取得とその利点について解説します。 非同期処理を活用することで、ユーザーがデータ取得中もスムーズに操作を続けられるようになり、アプリの使い勝手が向上します。 この記事では、顧客データの非同期取得を具体例として、処理の流れと実装方法について詳しく説明します。

PowerAppsでの非同期データ取得の重要性

PowerAppsでは、サーバーからデータを取得して表示するシーンが頻繁にあります。 もしデータ取得が同期処理で行われると、取得が完了するまでユーザーの操作が一時的に止まり、快適な操作が妨げられます。 非同期処理を利用することで、データ取得の完了を待たずに他の操作が可能になり、アプリの応答性が向上します。

非同期処理のメリット

  1. 応答性の向上: データ取得中も操作を続けられるため、ユーザーエクスペリエンスが向上します。
  2. 効率的なリソース利用: 複数のデータ取得を同時に行うことで、リソースを効率的に使用できます。
  3. エラーハンドリングが容易: 非同期処理では、エラー時の対応が簡素化され、安定性が向上します。

具体例:顧客データの非同期取得

ここでは、顧客データを非同期で取得し、ユーザーがデータ取得完了を待たずに操作を続けられる実装を紹介します。

データ仕様

  • テーブル名: contact
  • 列名とデータ型:
    • fullname: テキスト
    • email: メールアドレス
    • phone: 電話番号

実装例とコードの比較

非同期処理を使わない場合


function getContactDataSync() {
    var contactId = "some-contact-id";
    var result = Xrm.WebApi.retrieveRecord("contact", contactId, "?$select=fullname,email,phone");

    console.log("顧客名:", result.fullname);
    console.log("メールアドレス:", result.email);
    console.log("電話番号:", result.phone);
}

問題点: このコードはデータ取得が完了するまで操作が止まってしまいます。同期処理では、ユーザーの待機時間が発生し、使い勝手が悪くなります。

非同期処理(async/awaitを使用)を使ったコード


async function getContactDataAsync() {
    var contactId = "some-contact-id";
    
    try {
        const result = await Xrm.WebApi.retrieveRecord("contact", contactId, "?$select=fullname,email,phone");
        console.log("顧客名:", result.fullname);
        console.log("メールアドレス:", result.email);
        console.log("電話番号:", result.phone);
    } catch (error) {
        console.error("データ取得エラー:", error.message);
    }
}

メリット: 非同期でデータ取得が行われ、操作がスムーズに行えるようになります。awaitにより、データ取得の完了を待ちながらも、他の操作が可能です。

関連メソッドと構文

非同期処理で利用する主なメソッドと構文について説明します。

メソッド一覧

  • Xrm.WebApi.retrieveRecord: 指定したテーブルとIDでデータを取得します。
    使用例: Xrm.WebApi.retrieveRecord("contact", contactId, "?$select=fullname,email,phone");
  • async/await: 非同期関数と、その完了を待つためのキーワード。

注意点: awaitasync関数内でのみ使用可能です。

技術的な豆知識と制限事項

豆知識

  • async/await: 非同期処理を同期的に見せる記法で、コードが読みやすくなります。

制限事項

  • 通信が不安定だとデータ取得が遅延する可能性があります。

 

コード全体の流れ

この記事で使われているコードは、PowerAppsモデル駆動型アプリで、**「顧客データを非同期で取得して表示する」**という内容です。同期と非同期の2つの方法を使って、データの取得がアプリの動作にどう影響するかを説明しています。では、それぞれのコードの流れを順を追って見ていきましょう。


同期処理の流れ:getContactDataSync()

まず、同期処理を使った例について説明します。この関数は、PowerAppsの「Xrm.WebApi.retrieveRecord」メソッドを使ってデータを取得しますが、処理の仕方に問題があります。

処理の流れ

  1. 関数が呼び出される
    getContactDataSync()関数は、データ取得が必要になったときに呼ばれます。ここで実行が開始されます。

  2. 変数contactIdにデータIDを指定
    顧客データを取得するためのID(例:"some-contact-id")がcontactIdに代入されます。このIDを使って、特定の顧客データをサーバーから引き出します。

  3. Xrm.WebApi.retrieveRecordメソッドでデータを取得
    Xrm.WebApi.retrieveRecord("contact", contactId, "?$select=fullname,email,phone");を使ってサーバーからデータを取得します。ここで、「contact」テーブルから、contactIdで指定した顧客の「名前」「メールアドレス」「電話番号」が取り出されます。

    • ただし、同期的に動作するため、このデータ取得が完了するまで他の処理ができなくなります
  4. データの表示
    データが取得できたら、それぞれのフィールド(「名前」「メールアドレス」「電話番号」)をコンソールに出力します。この処理が終わるまで、他の操作は止まったままです。

データの流れ

  • まずcontactIdを通じて特定のデータが指定されます。
  • 次に、Xrm.WebApi.retrieveRecordメソッドがデータベースからこのデータを取得し、結果がresultに返されます。
  • 最後に、取得したデータがコンソールに出力され、処理が終了します。

非同期処理の流れ:getContactDataAsync()

次に、非同期処理を使った方法を見ていきましょう。非同期処理を使うことで、データの取得が終わる前でも他の操作が可能になります。

処理の流れ

  1. 関数が呼び出される
    getContactDataAsync()関数が呼ばれると、この非同期処理が開始されます。最初に変数の設定や準備を行います。

  2. 変数contactIdにデータIDを指定
    同期処理と同じように、取得したいデータのID(例:"some-contact-id")を変数contactIdに代入します。

  3. awaitでデータ取得を待つ
    次に、await Xrm.WebApi.retrieveRecord("contact", contactId, "?$select=fullname,email,phone");と書かれた行に進みます。このawaitは、データの取得が終わるのを待つことを指示しています。

    • awaitの処理は、データ取得中も他の操作が可能であることを意味しています。つまり、このデータ取得が終わるまで他の処理を中断する必要がありません。
  4. エラー処理
    try-catchブロックでエラー処理も追加しています。データ取得がうまくいかなかった場合、catchでエラーメッセージが表示されます。

  5. データの表示
    データが無事に取得できた場合、各フィールドの内容(「名前」「メールアドレス」「電話番号」)をコンソールに出力します。同期処理と異なり、この間にユーザーが他の操作を行っても問題がありません。

データの流れ

  • 同期処理と同じく、contactIdでデータが指定されます。
  • Xrm.WebApi.retrieveRecordメソッドがサーバーにリクエストを送信し、データがresultに返されます。
  • 結果のデータがコンソールに出力され、処理が終了します。

同期処理と非同期処理の違い

ここで、同期処理と非同期処理の違いを簡単にまとめます。

項目 同期処理 非同期処理
処理中の操作 他の操作が止まる 他の操作が可能
処理の待機 取得が終わるまで待機 処理中も他の作業が可能
ユーザー体験 操作が中断される 操作がスムーズ

子どもにもわかる例え話

非同期処理を、図書館で本を借りる例にたとえてみましょう。

  • 同期処理の場合:本を借りるために図書館に行き、受付で自分の順番が来るまで待ちます。前の人がたくさんの本を借りていると、自分が本を借りられるまで時間がかかってしまいます。
  • 非同期処理の場合:図書館に行って本を借りる手続きを始めますが、受付に「準備ができたら連絡してください」とお願いし、自分はほかのことをして待ちます。そうすれば、手続きが完了するまで、時間を無駄にしません。

コードの解説

最後に、コードの中で使われたメソッドについても詳しく説明します。

  1. Xrm.WebApi.retrieveRecord
    このメソッドは、特定のIDを持つレコードをデータベースから取得するために使います。取得したいテーブルの名前とID、そして取り出したいフィールド(例:fullname, email, phone)を指定します。

    • 構文: Xrm.WebApi.retrieveRecord("テーブル名", レコードID, "取得フィールド");
  2. async/await
    async関数内で使えるawaitは、特定の非同期処理が終わるまで待機するよう指示するキーワードです。awaitが使えるのは、必ずasync関数内です。非同期処理が完了したら次の処理に進みます。

  3. try-catchブロック
    try-catchは、エラー処理を行うための構文です。例えば、データ取得がうまくいかなかったとき、catch内でエラー内容をログに表示させることができます。これにより、エラーが発生してもアプリ全体が停止するのを防ぎます。


まとめ

非同期処理を使うことで、データ取得中も他の操作が可能となり、アプリがスムーズに動作するようになります。このコードの理解を通して、PowerAppsモデル駆動型アプリの開発がより効果的に進むことでしょう。

実践問題

問題: 以下の条件を満たす関数getAccountDataを作成してください。

  • 条件: 顧客データを非同期で取得し、取得したデータをコンソールに表示。

この記事では、PowerAppsモデル駆動型アプリでの非同期データ取得の活用について解説しました。非同期処理を理解して、アプリのパフォーマンスを向上させましょう。