このガイドは、開発者が Power Apps SDK を使用してコード アプリを Microsoft Dataverse に接続するのに役立ちます。
注
プレビュー機能は運用環境での使用を想定しておらず、機能が制限されている可能性があります。 これらの機能は、お客様が早期にアクセスしてフィードバックを提供できるように、公式リリースの前に利用できます。
[前提条件]
- Power Apps コードアプリ SDK @microsoft/power-apps - npmパッケージ
- Power Apps CLI (PAC CLI) バージョン 1.46 以降
- Dataverse が有効になっている環境
- PAC CLI を使用して環境に接続する必要があります
Steps
PAC CLI を使用して環境に接続していることを確認します。
pac コードの add-data-source コマンドを使用して、Dataverse をデータ ソースとしてコード アプリに追加する
pac code add-data-source -a dataverse -t <table-logical-name><table-logical-name>を、接続先の Dataverse テーブルの論理名に置き換えます。
サポートされているシナリオ
Power Apps SDK を使用して Dataverse に接続する場合は、次のシナリオがサポートされます。
PAC CLI を使用して Dataverse エンティティをコード アプリに追加する
CRUD 操作を実行します。
- Create
- 取得
- RetrieveMultiple
- Update
- 削除
委任対象:
FilterSort-
Topクエリ
ページングのサポート
コードアプリをセットアップする
コード アプリで作成、読み取り、更新、削除 (CRUD) 操作を実行する前に、次の 2 つのセットアップ手順を完了してください。
データ呼び出しの前に Power Apps SDK の初期化を確認する
App.tsxファイルで、Power Apps SDK が完全に初期化されるのを待ってからデータ操作を実行するロジックを実装します。 これにより、初期化されていないサービスまたはコンテキストが見つからない場合に発生するエラーが回避されます。API 呼び出しを行う前に、非同期関数または状態管理を使用して初期化を確認します。 例えば次が挙げられます。
useEffect(() => { // Define an async function to initialize the Power Apps SDK const init = async () => { try { await initialize(); // Wait for SDK initialization setIsInitialized(true); // Mark the app as ready for data operations } catch (err) { setError('Failed to initialize Power Apps SDK'); // Handle initialization errors setLoading(false); // Stop any loading indicators } }; init(); // Call the initialization function when the component mounts }, []); useEffect(() => { // Prevent data operations until the SDK is fully initialized if (!isInitialized) return; // Place your data reading logic here }, []);必要な型とサービスをインポートする
データ ソースを追加すると、モデル ファイルとサービス ファイルが自動的に生成され、
/generated/services/フォルダーに配置されます。 たとえば、組み込みの Accounts テーブルをデータ ソースとして追加すると、次のファイルが作成されます。AccountsModel.ts– Accounts テーブルのデータ モデルを定義します。AccountsService.ts– Accounts データを操作するためのサービス メソッドを提供します。
これらを次のようにコードにインポートして使用できます。
import { AccountsService } from './generated/services/AccountsService'; import type { Accounts } from './generated/models/AccountsModel';
レコードの作成
生成されたモデルを使用してレコード オブジェクトを作成する
生成されるモデルは、Dataverse テーブルのスキーマを反映しており、レコード オブジェクトの作成に使用する必要があります。
注
レコードを作成するときは、主キーや所有権フィールドなどのシステム管理列または読み取り専用列を除外します。 環境内のテーブル定義を参照することで、読み取り専用の列を理解するために使用できるツールを示します。 たとえば、[ 取引先企業] テーブルには、次のフィールドを含めないでください。
- AccountID
- オーナーID
- owneridname
- owneridtype
- owneridyominame
入力するフィールドのみを含むレコードを作成します。 たとえば、Accounts エンティティの場合は次のようになります。
const newAccount = { name: "New Account" statecode: 0, accountnumber: "ACCOO1" ... };生成されたサービスを使用してレコードを送信する
生成されたサービス ファイル内の関数を使用して、レコードを送信します。 たとえば、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 [];
}
};
レコードの更新
レコードを更新するには、次のものが必要です。
- レコードの主キー値。 たとえば、アカウント テーブルでは、
accountid値です。 - 行いたい変更。
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);
}
サポートされていないシナリオ
次の機能はまだサポートされていません。
- オプション セットの書式設定された値と表示名の取得
- ルックアップ フィールド(多態性ルックアップを含む)
- Dataverse のアクションと関数
- PAC CLI を使用した Dataverse データソースの削除
- スキーマ定義 (エンティティ メタデータ) CRUD
- FetchXML のサポート
- 代替キーのサポート