顧客テーブル (アカウント、連絡先、顧客住所)

顧客テーブル (accountcontactcustomeraddress) をMicrosoft Dataverseすると、顧客の関係、連絡先の詳細、住所と出荷の情報が格納されます。 この記事では、これらのテーブルの関連付け方法と、埋め込まれた空の顧客住所レコードを管理する方法について説明します。

アカウント表

アカウント テーブルは、Dataverse 内のテーブルの 1 つであり、他のほとんどのテーブルがその下に配置されるか、親テーブルとして機能しています。 Dataverse では、アカウントは、部署がリレーションシップを持つ会社を表します。 取引先企業に含まれている情報は、関連するすべての取引先担当者情報、会社情報、カテゴリ、関係の種類、および住所情報です。 適用されるその他の情報には、次の項目が含まれています。

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

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

連絡先テーブル

Dataverse では、連絡先は通常、顧客、サプライヤー、同僚などの関係を持つ部署の個人を表します。 連絡先テーブルは、他のほとんどのテーブルがリンクされているテーブルの 1 つです。 contact は、スタンドアロン テーブルになることができます。 この表には、プロフェッショナル、個人、家族の情報、および複数の住所が含まれています。 連絡先テーブル参照を表示します。

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

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

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

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

CustomerAddress テーブル

この表には、顧客レコード (アカウントと連絡先) の住所と配送先の情報が含まれています。 既定では、Dataverse は、新しい顧客レコードを作成するときに、これらのレコードのデータがない場合でも、このテーブルに少なくとも 2 つの customeraddress レコードを作成します。 この動作を変更する方法について説明します

Account_CustomerAddressContact_CustomerAddressリレーションシップを使用して、取引先企業レコードと連絡先レコードに関連するすべての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レコードをさらに追加したりできます。

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

既定では、顧客レコードのaddress1_addressidaddress2_addressid、またはaddress3_addressid参照する埋め込みcustomeraddress レコードのいずれかを削除しようとすると、次のようなエラー メッセージが表示されます。

名前: 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 容量に対してカウントされるため、このコストを最小限に抑えることができます。

customeraddressの [空のアドレス レコードの作成を無効にする] 設定を変更することで、顧客レコードごとに空のテーブル行を作成しないように Dataverse に指示できます。 この動作を変更する前に、既定の動作に依存する既存のカスタマイズがあるかどうかを検討してください。 この設定の詳細をご覧ください

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

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

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

次の関数例は、環境内で [空のアドレス レコードの作成を無効にする ] 設定が有効になっているかどうかを検出する方法を示しています。

この Test-IsEmptyAddressRecordCreationDisabled PowerShell 関数では、Microsoft Power Platform CLIpac env list-settings コマンドを使用してOrganization.OrgDbOrgSettingsの値を確認します。

function Test-IsEmptyAddressRecordCreationDisabled {

   $orgdborgsettings = pac env list-settings `
      --filter orgdborgsettings `
   | Where-Object { $_ -match '^orgdborgsettings\s+' } `
   | ForEach-Object { $_ -replace '^orgdborgsettings\s+', '' }

   $xml = [xml]$orgdborgsettings

   $element = $xml.SelectSingleNode("//CreateOnlyNonEmptyAddressRecordsForEligibleEntities")

   # Return true only when the element exists and has the value of 'true'
   return ($null -ne $element) -and ($element.InnerText -eq 'true')
}

Microsoft Power Platform CLI の詳細を確認する

埋め込みアドレス レコードを削除する

既定では、顧客テーブル内のaddress1_addressidaddress2_addressid、またはaddress3_addressid列が参照する埋め込みcustomeraddressテーブル行を削除することはできません。 詳細については、「 埋め込み顧客住所行の削除は許可されていません」を参照してください。

Power Platform 管理センターの [アドレス レコードの削除を有効にする] 設定では、この動作が変更されます。 この設定の詳細をご覧ください

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

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

この Test-IsDeleteAddressRecordsEnabled PowerShell 関数では、Microsoft Power Platform CLIpac env list-settings コマンドを使用して、Organization.OrgDbOrgSettingsEnableDeleteAddressRecords値を確認します。

function Test-IsDeleteAddressRecordsEnabled {

   $orgdborgsettings = pac env list-settings `
      --filter orgdborgsettings `
   | Where-Object { $_ -match '^orgdborgsettings\s+' } `
   | ForEach-Object { $_ -replace '^orgdborgsettings\s+', '' }

   $xml = [xml]$orgdborgsettings

   $element = $xml.SelectSingleNode("//EnableDeleteAddressRecords")

   # Return true only when the element exists and has the value of 'true'
   return ($null -ne $element) -and ($element.InnerText -eq 'true')
}

Microsoft Power Platform CLI の詳細を確認する

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

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

コードの一括削除の例

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

Start-BulkDeleteEmptyCustomerAddressRecords PowerShell 関数は、Microsoft Power Platform CLIpac data bulk-delete schedule コマンドを使用して空のcustomeraddress レコードを削除するシステム ジョブを作成します。

この関数は、「アドレス レコードの削除が有効かどうかを検出する」および「空のアドレス レコードの作成が無効になっているかどうかを検出する」で説明されているTest-IsDeleteAddressRecordsEnabled関数とTest-IsEmptyAddressRecordCreationDisabled関数の例に依存します。 この関数は、両方の設定で空の顧客住所レコードをすべて削除でき、新しい空のレコードが作成されないようにする場合にのみ、ジョブを作成します。

function Start-BulkDeleteEmptyCustomerAddressRecords {

   if (!(Test-IsDeleteAddressRecordsEnabled)) {
      Write-Host 'Enable deletion of address records before running this function.'
      return
   }

   if (!(Test-IsEmptyAddressRecordCreationDisabled)) {
      Write-Host 'Disable empty address record creation before running this function.'
      return
   }

   $fetchXml = @(
      '<fetch>'
      "<entity name='customeraddress'>"
      "<attribute name='customeraddressid' />"
      "<filter type='and'>"
      "<condition attribute='city' operator='null' />"
      "<condition attribute='country' operator='null' />"
      "<condition attribute='county' operator='null' />"
      "<condition attribute='fax' operator='null' />"
      "<condition attribute='freighttermscode' operator='null' />"
      "<condition attribute='latitude' operator='null' />"
      "<condition attribute='line1' operator='null' />"
      "<condition attribute='line2' operator='null' />"
      "<condition attribute='line3' operator='null' />"
      "<condition attribute='longitude' operator='null' />"
      "<condition attribute='postalcode' operator='null' />"
      "<condition attribute='postofficebox' operator='null' />"
      "<condition attribute='primarycontactname' operator='null' />"
      "<condition attribute='shippingmethodcode' operator='null' />"
      "<condition attribute='stateorprovince' operator='null' />"
      "<condition attribute='telephone1' operator='null' />"
      "<condition attribute='telephone2' operator='null' />"
      "<condition attribute='telephone3' operator='null' />"
      "<condition attribute='upszone' operator='null' />"
      "<condition attribute='utcoffset' operator='null' />"
      '</filter>'
      '</entity>'
      '</fetch>'
   ) -join ''

   pac data bulk-delete schedule `
      --entity customeraddress `
      --fetchxml $fetchXml `
      --job-name 'Delete Empty Customer Address Records'
}