注
Dynamics 365 Commerce の小売インタレストグループは、Yammer から Viva Engage に移行しました。 新しい Viva Engage コミュニティにアクセスできない場合は、このフォーム (https://aka.ms/JoinD365commerceVivaEngageCommunity) に入力して追加し、最新のディスカッションに参加してください。
この記事では、顧客の Commerce Data Exchange (CDX) パッケージを拡張して、Microsoft Dynamics 365 Commerce にカスタム データを追加する方法について説明します。
販売時点管理 (POS) またはクライアント アプリケーションが Commerce 顧客検索アプリケーション プログラミング インターフェイス (API) を呼び出す場合、API はチャネル データベースで顧客を検索します。 API がチャネル データベースで顧客を見つけず、Commerce 本社でリモート検索が有効になっている場合、API は Commerce 本社をリアルタイムで呼び出してデータをフェッチします。 顧客データがコマース本社で見つかった場合、本社は顧客データ CDX パッケージを生成し、チャネル データベースに同期します。
顧客データ CDX パッケージの一部としてカスタム データ ( ロイヤルティ、 所属、 拡張 テーブル データなど) を含めてチャネル データベースに同期する場合は、X++ を使用して Commerce 本社の RetailTransactionServiceCustomerExtensions クラスを拡張します。
パッケージのカスタム データ部分を追加するには、RetailTransactionServiceCustomerExtensions クラスから addAdditionalCustomerDataToPackage メソッドを上書きし、カスタム クエリを追加して必要なテーブルからデータを読み込んでから、RetailCdxDataPackageSerializationHelper オブジェクトにデータ部分を書き込みます。
X++ 拡張子を追加するための前提条件
- CDX を拡張して、カスタム テーブルとフィールドを同期します。 拡張テーブルを同期する場合は、拡張テーブル データを読み取るためにコマース ランタイム (CRT) 拡張機能が必要です。 既存のエンティティ ( ロイヤルティ、 所属、 顧客など) を使用している場合は、既定の CRT コードによってデータがフェッチされるため、CRT 拡張機能は必要ありません。 詳細情報については、拡張を介してカスタムCommerce Data Exchange 同期を有効するを参照してください。
- Customer テーブルとフェッチする追加データの間のデータ整合性を維持します。 このデータには拡張テーブルが含まれます。
- 拡張テーブルと同期テーブルには、CDX フレームワークがテーブルにデータを書き込むための書き込みアクセス許可が必要です。
Customer CDX データ パッケージのデータ部分を追加するカスタム メソッドを作成するには、次の手順に従います。
Microsoft Visual Studio を開く。
Dynamics 365 メニューで、モデル管理 > モデルの作成をクリックします。
モデルの作成ダイアログ ボックスに、次の情報を入力します。
- モデル名: Contoso
- モデル発行元: Contoso
- バージョン: 1.0.0.0
- モデルの表示名: Contoso
次へ を選択します。
既存のパッケージを選択を選択してから、ドロップダウン リストでアプリケーション スイートを選択します。
次へ を選択します。
完了 を選択します。
新しいプロジェクト ダイアログ ボックスに、RetailTransactionServiceCustomerExtensions というプロジェクト名を入力します。
OKを選択します。
プロジェクトを選択したままにして (または右クリック)、追加 > 新しい項目を選択します。
新しい項目の追加ダイアログ ボックスで、クラスを選択し、RetailTransactionServiceCustomerExtensions_Sample_Extension をクラス名として入力します。
次の例に示すように、ExtensionOf 属性をクラスに追加してから、RetailTransactionServiceCustomerExtensions クラスを属性値として指定します。
[ExtensionOf(classStr(RetailTransactionServiceCustomerExtensions))] public final class RetailTransactionServiceCustomerExtensions_Sample_Extension { }addAdditionalCustomerDataToPackage メソッドを上書きし、必要なテーブルからデータを取り込みます。
例
この例では、次の表からデータをフェッチし、パッケージに含めます。
- 小売業向けのロイヤリティカード
- 小売ロイヤルティカード階級
- CustTable
- ContosoRetail顧客優先連絡時間
/// <summary>
/// Extension method to add additional data to customer data package.
/// </summary>
/// <param name = "serializer">The CDX data package serializer.</param>
/// <param name = "customerRecord">The <see cref="CustTable" /> record for which related information needs to be added.</param>
public static void addAdditionalCustomerDataToPackage(RetailCdxDataPackageSerializationHelper serializer, CustTable customerRecord)
{
RetailLoyaltyCard loyaltyCard;
RetailLoyaltyCardTier loyaltyCardTier;
CustTable extensionCustTable;
ContosoRetailCustPreferredContactHours contactHoursTable;
while select loyaltyCard
where loyaltyCard.Party == customerRecord.Party
{
serializer.writeRecord(loyaltyCard);
loyaltyCardTableAddedToPackage = true;
while select loyaltyCardTier
where loyaltyCardTier.LoyaltyCard == loyaltyCard.RecId
{
serializer.writeRecord(loyaltyCardTier);
loyaltyCardTierTableAddedToPackage = true;
}
}
while select contactHoursTable
{
serializer.writeRecord(contactHoursTable);
extensionTableAddedToPackage = true;
}
}
完全なサンプル コード
/// <summary>
/// Extension sample for RetailTransactionServiceCustomerExtensions::addAdditionalCustomerDataToPackage() method.
/// </summary>
[ExtensionOf(classStr(RetailTransactionServiceCustomerExtensions))]
public final class RetailTransactionServiceCustomerExtensions_Sample_Extension
{
// These fields are added for unit testing only and are not needed for extension functionality.
public static boolean loyaltyCardTableAddedToPackage;
public static boolean loyaltyCardTierTableAddedToPackage;
public static boolean extensionTableAddedToPackage;
/// <summary>
/// Extension method to add additional data to customer data package.
/// </summary>
/// <param name = "serializer">The CDX data package serializer.</param>
/// <param name = "customerRecord">The <see cref="CustTable" /> record for which related information needs to be added.</param>
public static void addAdditionalCustomerDataToPackage(RetailCdxDataPackageSerializationHelper serializer, CustTable customerRecord)
{
RetailLoyaltyCard loyaltyCard;
RetailLoyaltyCardTier loyaltyCardTier;
CustTable extensionCustTable;
ContosoRetailCustPreferredContactHours contactHoursTable;
while select loyaltyCard
where loyaltyCard.Party == customerRecord.Party
{
serializer.writeRecord(loyaltyCard);
loyaltyCardTableAddedToPackage = true;
while select loyaltyCardTier
where loyaltyCardTier.LoyaltyCard == loyaltyCard.RecId
{
serializer.writeRecord(loyaltyCardTier);
loyaltyCardTierTableAddedToPackage = true;
}
}
while select contactHoursTable
{
serializer.writeRecord(contactHoursTable);
extensionTableAddedToPackage = true;
}
}
}