次の方法で共有


顧客テーブル (アカウント、連絡先、顧客アドレス)

アカウント テーブルと 連絡先 テーブルは、顧客の識別と管理、製品とサービスの販売、顧客への優れたサービスの提供に不可欠です。 customeraddress テーブルには、顧客の住所と配送情報が格納されます。

アカウント テーブル

account テーブルは、Dataverse のテーブルのひとつで、他のほとんどのテーブルがアタッチされたり、親になったりしています。 Dataverse では、取引先企業は部署が関係を持つ会社を表します。 取引先企業に含まれている情報は、関連するすべての取引先担当者情報、会社情報、カテゴリ、関係の種類、および住所情報です。 適用されるその他の情報には、次の項目が含まれています。

  • アカウントは、別のアカウントを含むほとんどのテーブル タイプの親になることができます。
  • account は、スタンドアロン テーブルになることができます。
  • 1 つの取引先企業の上位にできる取引先企業は 1 つだけです。
  • 取引先企業は、複数の下位取引先企業および下位取引先担当者を持つことができます。

アカウント管理は、組織が他の企業とのすべてのアクティビティを把握する必要があるため、B2B顧客関係管理 (Dynamics 365) の重要な概念の1つです。 これらすべてのアクティビティはアカウント レベルで統合されます。 アカウント テーブル参照を表示します

Contact テーブル

Dataverse では、取引先担当者は、部署が関係を持つ個人 (顧客、納入業者、同僚など) を表します。 contact テーブルは、 のテーブルのひとつで、他のほとんどのテーブルがリンクされています。 contact は、スタンドアロン テーブルになることができます。 このテーブルに含まれるのは、業務、個人、家族の情報、複数のアドレスです。 連絡先テーブルリファレンス を表示します。

取引先企業も取引先担当者も顧客管理の一部であり、相互の関係は次のとおりです。

  • contact は、account と contact 以外のすべてのテーブルの親になることができます。
  • 1 つの取引先担当者の上位に存在できる取引先企業は 1 つだけです。
  • Account.PrimaryContactId 列を設定することで、連絡先をアカウントの主な連絡先としてマークできます。

連絡先テーブルには、電子メール アドレス、住所、電話番号などの個人に関する情報が格納されます。 また、その人の誕生日や記念日などの関連情報も含まれます。 顧客の全体像が見えるようにするには、部署が抱える顧客の種類に応じて、取引先担当者のみ、または取引先担当者と取引先企業の両方が必要になります。

アクティビティやメモなどのテーブルを contact テーブルにリンクすると、ユーザーは顧客とのすべてのコミュニケーション、顧客に代わって実行したすべてのアクション、および顧客についてユーザーが必要とするすべての情報を確認できます。

CustomerAddress テーブル

このテーブルには、顧客レコード (アカウントと連絡先) の詳細な住所と配送情報が含まれています。 デフォルトでは、新しい顧客レコードが作成されると、これらのレコードにデータがない場合でも、このテーブルに Dataverse 少なくとも2つの customeraddress レコードが作成されます。 この行動を変える方法を学ぶ

アカウントおよび連絡先レコードに関連するすべてのレコードは、それぞれ customeraddress Account_CustomerAddress および Contact_CustomerAddress リレーションシップ を介して利用できます。 これらの リレーションシップ は両方とも parentid ルックアップを使用し、 parentidtypecode 列は、アドレスが関連付けられている顧客レコードのタイプを示します。

顧客記録に埋め込まれた住所データ

顧客レコードに埋め込まれた2つまたは3つのレコードのデータを取得または変更できます。 customeraddress

  • アカウント レコードには列 address1_addressidaddress2_addressid があります。
  • 連絡先レコードには、 address1_addressidaddress2_addressidaddress3_addressid の列があります。

これらの列には customeraddressid 値が格納され、 address1*address2*、または address3* のいずれかのプレフィックスが付いた他の顧客列があり、 customeraddress テーブルからの対応する住所情報が含まれています。

customeraddress addressnumber 列は、親顧客レコード列に適用される住所を示します。 同じ親顧客に関連する別のレコードで使用されている値を列に設定することはできません。 addressnumber customeraddress 顧客レコードのレコードの相対的な位置を入れ替える場合は、既存の addressnumber 値を0またはnullに設定し、別のレコードの値を変更できます。 addressnumber 値は顧客に対して作成されたレコードごとに増加しますが、顧客レコード内のそれぞれの埋め込みアドレス位置 (12、または 3) を制御すること以外、 addressnumber 列の値は他の目的には使用されません。

Dataverse 行を直接更新するのではなく、対応する顧客レコード列を通じてこれらのレコードのみを更新します。 customeraddress customeraddress ただし、誰でもこれらのレコードをレコードとして編集したり、取引先レコードや連絡先レコードに埋め込まれていないレコードに関連付けられたレコードやレコードを追加したりすることはできます。 customeraddress customeraddress account contact

埋め込まれた顧客住所行の削除は許可されていません

デフォルトでは、顧客レコードの customeraddressaddress1_addressid、または address2_addressid で参照されている埋め込みレコードの1つを削除しようとすると、次のようなエラーが発生します。 address3_addressid

名前: CannotDeleteDueToAssociation
コード: 0x80040227
番号: -2147220953
メッセージ: Customer Address can not be deleted because it is associated with another object. Address Id = 4f33c2e4-d5a3-4b03-b050-21984c0e4c15, AddressNumber=2, ParentId=4b757ff7-9c85-ee11-8179-000d3a9933c9, ObjectTypeCode=1

この行動を変える方法を学ぶ

空のレコードの作成を無効にする

テーブルの各行は、支払う容量にカウントされるため、このコストを最小限に抑えることをお勧めします。 customeraddress Dataverse

管理センターの「空の住所レコードの作成を無効にする」設定を変更することで、各顧客レコードに対して空のテーブル行を作成しないように指示できます Dataverse 。 customeraddress · Power Platform この動作を変更する前に、デフォルトの動作に依存する既存のカスタマイズがあるかどうかを検討する必要があります。 この設定の詳細

この設定がオンの場合、新しい顧客レコードが作成されても、新しい空のテーブル行は作成されません。 customeraddress レコードは、受信ペイロードにアドレス データが含まれている場合にのみ作成されます。 通常、ペイロードにはデータがある列のみが含まれます。 列にデータがない場合、列はペイロードに含まれず、レコードが保存されるときに値はnullになります。 ただし、ペイロードに値がnullに設定されたアドレス列が含まれている場合、アドレスはnull値で作成されます。 空のレコードが引き続き作成される場合は、それらがどのように作成されるか、およびそのクライアント アプリケーションがnull値を含む列データを送信しているかどうかを確認してください。

空のアドレス レコードの作成を無効にする 設定をオフにすると、デフォルトの動作が再開されます。 この設定をオンにしても、既存のテーブル行は削除されません。 customeraddress この設定をオフにした後で再度オンにしても、作成されなかったレコードは再作成されません。

空のアドレスレコードの作成が無効になっているかどうかを検出する

これらのサンプル関数は、環境で 空のアドレス レコードの作成を無効にする 設定が有効になっているかどうかを検出する方法を示しています。

この静的メソッドは、WhoAmIRequestクラスとIOrganizationService.Retrieveメソッドを使用して、Organization.OrgDbOrgSettings列の値を確認します。 IsEmptyAddressRecordCreationDisabled ... ... ...

static bool IsEmptyAddressRecordCreationDisabled(IOrganizationService service)
{

   Guid orgId = ((WhoAmIResponse)service
         .Execute(new WhoAmIRequest())).OrganizationId;

   Entity organization = service
         .Retrieve("organization", orgId, new ColumnSet("orgdborgsettings"));

   XDocument orgdborgsettings = XDocument
         .Parse((string)organization["orgdborgsettings"]);

   XElement? element = orgdborgsettings
         .XPathSelectElement("//CreateOnlyNonEmptyAddressRecordsForEligibleEntities");

   // Return true only when the element exists and has the value of 'true'
   return element != null && element.Value == "true";
}

埋め込まれたアドレスレコードを削除する

デフォルトでは、顧客テーブル内の customeraddress 列、 address1_addressid 列、または address2_addressid 列によって参照される埋め込みテーブル行を削除することはできません。 address3_addressid 参照 埋め込まれた顧客住所行の削除は許可されていません

管理センターPower Platform アドレス レコードの削除を有効にする 設定により、この動作が変更されます。 この設定の詳細

アドレスレコードの削除が有効になっているかどうかを検出する

これらのサンプル関数は、環境で アドレス レコードの削除を有効にする 設定が有効になっているかどうかを検出する方法を示しています。

この静的メソッドは、WhoAmIRequestクラスとIOrganizationService.Retrieveメソッドを使用して、Organization.OrgDbOrgSettings列の値を確認します。 IsDeleteAddressRecordsEnabled ... ... ...

static bool IsDeleteAddressRecordsEnabled(IOrganizationService service)
{

   Guid orgId = ((WhoAmIResponse)service
         .Execute(new WhoAmIRequest())).OrganizationId;

   Entity organization = service
         .Retrieve("organization", orgId, new ColumnSet("orgdborgsettings"));

   XDocument orgdborgsettings = XDocument
         .Parse((string)organization["orgdborgsettings"]);

   XElement? element = orgdborgsettings
         .XPathSelectElement("//EnableDeleteAddressRecords");

   // Return true only when the element exists and has the value of 'true'
   return element != null && element.Value == "true";

}

空の顧客住所レコードの一括削除

空のアドレス レコードの作成を無効にし、アドレス レコードの削除を有効にした後、次のサンプル関数を使用して、 customeraddress メッセージを使用して空のレコードを非同期的に削除できます。 BulkDelete

これらの関数は、 アドレス (CustomerAddress) 書き込み可能列/属性 に基づいており、環境内に存在する可能性のあるカスタム列は含まれません。 カスタム列を含める必要がある場合は、これらのクエリを変更する必要があるかもしれません。

静的メソッドは、BulkDeleteRequestクラスを使用して空のレコードを削除するシステム ジョブを作成します BulkDeleteEmptyCustomerAddressRecordscustomeradddress ...

このメソッドは、それぞれ「 IsDeleteAddressRecordsEnabled アドレス レコードの削除が有効かどうかを検出する IsEmptyAddressRecordCreationDisabled 」および「 空のアドレス レコードの作成が無効かどうかを検出する 」で説明されている例の および 静的メソッドを使用して、これらの設定がすべての空の顧客アドレス レコードの削除を許可し、新しいレコードが作成されないように構成されていることを確認します。

/// <summary>
/// Create a Bulk Delete job to delete empty customer address records
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance.</param>
/// <returns>The Id of the system job</returns>
/// <exception cref="Exception"></exception>
static Guid BulkDeleteEmptyCustomerAddressRecords(IOrganizationService service)
{
    if (!IsDeleteAddressRecordsEnabled(service))
    {

        throw new Exception("Enable deletion of address records" +
            " before running this method.");
    }

    if (!IsEmptyAddressRecordCreationDisabled(service))
    {

        throw new Exception("Disable empty address record creation" +
            " before running this method.");
    }

    var query = new QueryExpression("customeraddress")
    {

        ColumnSet = new ColumnSet("customeraddressid"),
        Criteria =
        {
            Conditions =
            {
                new ConditionExpression("city", ConditionOperator.Null),
                new ConditionExpression("country", ConditionOperator.Null),
                new ConditionExpression("county", ConditionOperator.Null),
                new ConditionExpression("fax", ConditionOperator.Null),
                new ConditionExpression("freighttermscode", ConditionOperator.Null),
                new ConditionExpression("latitude", ConditionOperator.Null),
                new ConditionExpression("line1", ConditionOperator.Null),
                new ConditionExpression("line2", ConditionOperator.Null),
                new ConditionExpression("line3", ConditionOperator.Null),
                new ConditionExpression("longitude", ConditionOperator.Null),
                new ConditionExpression("postalcode", ConditionOperator.Null),
                new ConditionExpression("postofficebox", ConditionOperator.Null),
                new ConditionExpression("primarycontactname", ConditionOperator.Null),
                new ConditionExpression("shippingmethodcode", ConditionOperator.Null),
                new ConditionExpression("stateorprovince", ConditionOperator.Null),
                new ConditionExpression("telephone1", ConditionOperator.Null),
                new ConditionExpression("telephone2", ConditionOperator.Null),
                new ConditionExpression("telephone3", ConditionOperator.Null),
                new ConditionExpression("upszone", ConditionOperator.Null),
                new ConditionExpression("utcoffset", ConditionOperator.Null)
            }
        }
    };

    BulkDeleteRequest request = new()
    {
        QuerySet = new QueryExpression[] { query },
        StartDateTime = DateTime.UtcNow,
        RecurrencePattern = string.Empty,
        SendEmailNotification = false,
        JobName = "Delete empty customer address records",
        ToRecipients = new List<Guid>().ToArray(),
        CCRecipients = new List<Guid>().ToArray()

    };

    var response = (BulkDeleteResponse)service.Execute(request);
    return response.JobId;

}

注意

ドキュメントの言語設定についてお聞かせください。 簡単な調査を行います。 (この調査は英語です)

この調査には約 7 分かかります。 個人データは収集されません (プライバシー ステートメント)。