方法: コード アプリを Dataverse に接続する

このガイドは、開発者がコード アプリ用の Power Apps クライアント ライブラリを使用して、コード アプリをMicrosoft Dataverseに接続するのに役立ちます。

[前提条件]

Steps

  1. PAC CLI を使用して環境に接続していることを確認します。

  2. pac コードの add-data-source コマンドを使用して、Dataverse をデータ ソースとしてコード アプリに追加します。

    pac code add-data-source -a dataverse -t <table-logical-name>
    

    <table-logical-name>を、接続先の Dataverse テーブルの論理名に置き換えます。

サポートされているシナリオ

コード アプリ用の Power Apps クライアント ライブラリ は、Dataverse に接続するときに次のシナリオをサポートします。

  • Dataverse エンティティをコード アプリに追加します。

  • オプション セットのオプション値の書式設定された値 (ラベル) を取得します。

  • Dataverse テーブルのメタデータを取得します

  • ルックアップと連携する 現時点では、ルックアップ操作時に、ガイダンスに従って単一値のナビゲーション プロパティに関連付けるか、作成時にレコードを関連付ける必要があります。 専用のハウツーガイドが近日公開予定です。 Power Apps チームは、コード アプリで参照を使いやすくするために積極的に取り組んでいます。

  • イメージとファイルのアップロードとダウンロード (プレビュー)。 npm ベースの cli を使用して Dataverse をデータ ソースとして追加すると、生成される関数はsrc/generated/servicesの一部になります。

  • CRUD 操作を実行します。

    • Create
    • 取得
    • RetrieveMultiple
    • Update
    • 削除​​
  • 委任対象:

    • Filter
    • Sort
    • Top クエリ
  • ページングのサポート。

ヒント

完全な作業例をお探しですか? Dataverse デモ アプリは、この記事で取り上げるすべてのパターン (CRUD 操作、ルックアップ フィールド、画像とファイルのアップロードとダウンロード、生成されたサービス) を React/TypeScript アプリで確認および拡張できます。 アプリを自分で実行するには、 PowerAppsCodeApps/samples/Dataverse/DEVELOPMENT.md のセットアップ手順に従って環境用に構成します。

コードアプリをセットアップする

コード アプリで作成、読み取り、更新、削除 (CRUD) 操作を実行する前に、必要な型とサービスをインポートします。

データ ソースを追加すると、モデル ファイルとサービス ファイルが自動的に生成され、 /generated/services/ フォルダーに配置されます。 たとえば、組み込みの Accounts テーブルをデータ ソースとして追加すると、次のファイルが作成されます。

  • AccountsModel.ts – Accounts テーブルのデータ モデルを定義します。
  • AccountsService.ts – Accounts データを操作するためのサービス メソッドを提供します。

次のように、コード内でこれらのファイルをインポートして使用できます。

import { AccountsService } from './generated/services/AccountsService';
import type { Accounts } from './generated/models/AccountsModel';

レコードの作成

生成されたモデルの種類とサービス メソッドを使用して、コード アプリから新しい Dataverse レコードを作成します。

  1. 生成されたモデルを使用してレコード オブジェクトを作成する

    生成されたモデルには、Dataverse テーブルのスキーマが反映されます。 これらを使用してレコード オブジェクトを作成します。

    レコードを作成するときは、主キーや所有権フィールドなどのシステム管理列または読み取り専用列を除外します。 読み取り専用の列を理解するには、 環境内のテーブル定義の参照に関するページを参照してください。 たとえば、[ 取引先企業] テーブルには、次のフィールドを含めないでください。

    • AccountID
    • オーナーID
    • owneridname
    • owneridtype
    • owneridyominame

    入力するフィールドのみを含むレコードを作成します。 たとえば、Accounts エンティティの場合は次のようになります。

    
    const newAccount = {
       name: "New Account"
       statecode: 0,
       accountnumber: "ACCOO1"
       ...
    };
    
  2. 生成されたサービスを使用してレコードを送信する

    生成されたサービス ファイル内の関数を使用して、レコードを送信します。 たとえば、Accounts エンティティの場合は次のようになります。

    try {
    const result = await AccountsService.create(newAccount as Omit<Accounts, 'accountid'>);
    
    if (result.data) {
    console.log('Account created:', result.data);
    return result.data;
    }
    } catch (err) {
    console.error('Failed to create account:', err);
    throw err;
    };
    

データの読み取り

1 つのレコードを取得するか、クエリを作成して複数のレコードを返すことができます。

1 つのレコードを取得する

1 つのレコードを取得するには、その主キー ( accountid など) が必要です。

const accountId = "<00000000-0000-0000-0000-000000000000>"; // Replace with actual ID value

try {
      const result = await AccountsService.get(accountId);
      if (result.data) {
            console.log('Account retrieved:', result.data);
      }
} catch (err) {
      console.error('Failed to retrieve account:', err);
}

複数のレコードを取得する

Dataverse テーブルからすべてのレコードを取得するには、 getAll メソッドを使用します。

try {
   const result = await AccountsService.getAll();
   if (result.data) {
         const accounts = result.data;
         console.log(`Retrieved ${accounts.length} accounts`);
   }
} catch (err) {
   console.error('Failed to retrieve accounts:', err);
}

getAll メソッドは、IGetAllOptions インターフェイスを実装する省略可能なパラメーターを受け取ります。 クエリをカスタマイズするには、次のオプションを使用します。

interface IGetAllOptions {
   maxPageSize?: number;    // Maximum number of records per page
   select?: string[];       // Specific fields to retrieve
   filter?: string;         // OData filter string
   orderBy?: string[];     // Fields to sort by
   top?: number;           // Maximum number of records to retrieve
   skip?: number;          // Number of records to skip
   skipToken?: string;     // Token for pagination
}

Important

select パラメーターを使用して取得する列の数は常に制限します。

複数のオプションの例を次に示します。

const fetchAccounts = async () => {
const options: IGetAllOptions = {
      select: ['name', 'accountnumber', 'address1_city'],
      filter: "address1_country eq 'USA'",
      orderBy: ['name asc'],
      top: 50
};

try {
      const result = await AccountsService.getAll(options);
      return result.data || [];
} catch (err) {
      console.error('Failed to fetch accounts:', err);
      return [];
}
};

レコードの更新

レコードを更新するには、次のものが必要です。

  1. レコードの主キー値。 たとえば、アカウント テーブルでは、 accountid 値です。
  2. 行いたい変更。

Important

レコードを更新する場合は、変更するプロパティのみを要求に含めます。 以前に取得したレコードの変更されたプロパティを設定し、そのデータを要求に含める場合、値が変更されなかった場合でも、すべてのプロパティを更新します。 このような誤った更新により、値が変更されることを想定するビジネス ロジックがトリガーされたり、監査データが破損して、変更されなかったデータが誰かが変更されたことを示したりする可能性があります。

次の例では、アカウントレコードの name プロパティと telephone1 プロパティを更新します。

const accountId = "<your-account-guid>";
const changes = {
      name: "Updated Account Name",
      telephone1: "555-0123"
};

try {
      await AccountsService.update(accountId, changes);
      console.log('Account updated successfully');
} catch (err) {
      console.error('Failed to update account:', err);
}

Dataverse でレコードを削除する

レコードを削除するには、レコードの主キー値が必要です。 たとえば、アカウント テーブルでは、 accountid 値です。

例えば次が挙げられます。

const accountId = "<00000000-0000-0000-0000-000000000000>"; // Replace with actual ID value

try {
  await AccountsService.delete(accountId);
  console.log('Account deleted successfully');
} catch (err) {
  console.error('Failed to delete account:', err);
}

サポートされていないシナリオ

次の機能はまだサポートされていません。

  • ポリモーフィック検索
  • PAC CLI を使用した Dataverse データソースの削除
  • スキーマ定義 (エンティティ メタデータ) CRUD
  • FetchXML のサポート
  • 代替キーのサポート