帳戶和聯繫表對於識別和管理客戶、銷售產品和服務以及為客戶提供優質服務至關重要。 customeraddress 表格會儲存客戶的地址和出貨資訊。
帳戶表格
帳戶表是 Dataverse 中大多數其他資料表所附屬或為其父表的其中一個資料表。 在 Dataverse 中,客戶代表與業務單位有關係的公司。 帳戶中包含的資訊是所有相關的聯絡資訊、公司資訊、類別、關係類型和地址資訊。 其他適用的資訊包括以下項目:
- 帳戶可以是大部分資料表類型的父項,包括另一個帳戶。
- 帳戶可以是獨立表格。
- 一個帳戶只能有一個帳戶作為其父帳戶。
- 帳戶可以有多個子帳戶和子聯絡人。
客戶管理是企業對企業客戶關係管理 (Dynamics 365) 的重要概念之一,因為組織想要查看他們與另一家公司的所有活動。 所有這些活動都會在帳戶層級匯集在一起。 查看帳戶表格參照。
聯絡表
在 Dataverse 中,連絡人代表與業務單位有關係的人員 (通常是個人),例如客戶、供應商或同事。 聯絡人資料表是大多數其他資料表所連結的資料表之一。 連絡人可以是一個獨立的資料表。 此表中包含專業、個人和家庭資訊,以及多個地址。 查看連絡人表格參考。
帳戶和連絡人都是客戶管理系統的一部分,並透過以下方式彼此相關:
- 連絡人可以成為除帳戶和連絡人之外所有其他資料表的父表。
- 一個連絡人只能有一個帳戶作為其上層帳戶。
- 可將連絡人設定為帳戶的主要連絡人,這是透過設定 Account.PrimaryContactId 資料行來完成的。
聯絡表格會儲存人員的相關資訊,例如電子郵件地址、街道地址和電話號碼。 它還包括其他相關信息,例如此人的生日或週年紀念日。 根據業務單位擁有的客戶類型,它只需要連絡人,或連絡人和帳戶,即可全面了解其客戶。
將活動和附註等表格連結至 contact 表格,可讓使用者查看使用者與客戶的所有通訊、使用者代表客戶採取的任何動作,以及使用者需要的有關客戶的所有資訊。
CustomerAddress 資料表
此表格包含客戶記錄 (帳戶和連絡人) 的更多地址和運送資訊。 根據預設,Dataverse 會在建立新客戶記錄時在此資料表中建立至少兩 customeraddress 筆記錄,即使這些記錄沒有資料也是如此。
瞭解如何改變此行為
與客戶和連絡人記錄相關的所有 customeraddress 記錄均可分別透過 Account_CustomerAddress 和 Contact_CustomerAddress 關係取得。 這些關聯性都使用 parentid 查閱,而 parentidtypecode 欄會告訴您地址與之相關的客戶記錄類型。
融入於客戶記錄中的地址數據
您可以擷取或修改與客戶記錄相關的兩或三個內嵌 customeraddress 記錄的資料。
- 帳戶記錄具有欄位
address1_addressid和address2_addressid。 - 連絡人記錄有欄
address1_addressid、address2_addressid和address3_addressid。
這些資料行會儲存 customeraddressid 值,而且還有其他客戶資料行,每個資料行都以 address1*、 address2*或 address3* 為前置詞,其中包含資料表中的 customeraddress 對應地址資訊。
customeraddress
addressnumber 欄會告訴您哪個地址適用於父客戶記錄欄。 您無法將 addressnumber 欄位設定為同一父客戶相關的另一個 customeraddress 記錄所使用的值。 您可以將現有 addressnumber 值設定為 0 或 Null,然後如果您想要交換客戶記錄的記錄相對位置,請變更另一筆記錄的值。 雖然 addressnumber 的值在為客戶建立的每筆記錄中會遞增,並且控制客戶記錄中內嵌地址的位置(1、2 或 3),addressnumber 資料行的值則不會用於其他任何用途。
Dataverse 僅透過對應的客戶記錄欄更新這些 customeraddress 記錄,而不是直接更新 customeraddress 資料列。 不過,任何人都可以將這些記錄編輯為 customeraddress 記錄,或新增更多與 customeraddress 、 account 或 contact 記錄相關聯的記錄,這些記錄未嵌入在帳戶和連絡人記錄中。
不允許刪除內嵌的客戶地址列
預設情況下,如果您嘗試刪除一個嵌入的 customeraddress 記錄,該記錄被用於客戶記錄的 address1_addressid、address2_addressid 或 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 容量,因此您可能想要將此成本降到最低。
您可以變更 customeraddress中的停用空地址記錄建立設定,告訴 Dataverse 不要為每個客戶記錄建立空資料表列。 在變更此行為之前,您應該先考慮是否有相依於預設行為的現有自訂。
進一步瞭解此設定
開啟此設定時,建立新客戶記錄時不會建立新的空 customeraddress 資料表列。 只有在傳入承載包含地址資料時,才會建立記錄。 通常,資料只包含有資料的欄位。 如果欄位沒有資料,該欄位將不包含在資料中,並且在記錄儲存時值為 null。 不過,如果承載包含值設定為 Null 的位址資料行,則會使用 Null 值建立位址。 如果您繼續看到有空白記錄被建立,請檢查它們是如何被建立的,以及該用戶端應用程式是否正在傳送具有空值的資料行資料。
如果關閉停用 空白地址記錄建立設定 ,則預設行為會恢復。 開啟此設定不會刪除任何現有 customeraddress 的表格列。 關閉此設定後重新開啟,不會重新建立未建立的記錄。
檢測是否已停用空白地址記錄的建立
這些範例函式示範如何偵測環境中是否啟用了停用 空白地址記錄建立 設定。
此靜態 IsEmptyAddressRecordCreationDisabled 方法會使用 WhoAmIRequest 類別 和 IOrganizationService.Retrieve 方法 來檢查 Organization.OrgDbOrgSettings 資料行中的值。
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";
}
刪除內嵌地址記錄
根據預設,您無法刪除客戶資料表中由address1_addressid、address2_addressid或address3_addressid資料行所參考的內嵌customeraddress資料表資料列。 請參閱 不允許刪除內嵌客戶地址列
Power Platform 系統管理中心中的啟用刪除地址記錄設定會變更此行為。 進一步瞭解此設定
偵測是否啟用刪除地址記錄
這些範例函式示範如何偵測環境中是否已啟用 [啟用刪除位址記錄 ] 設定。
此靜態IsDeleteAddressRecordsEnabled方法會使用 WhoAmIRequest 類別和 IOrganizationService.Retrieve 方法來檢查 Organization.OrgDbOrgSettings 資料行中的值
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";
}
大量刪除空白客戶地址記錄
在停用建立空白地址記錄並啟用刪除地址記錄後,您可以使用以下範例函數,透過BulkDelete訊息以非同步方式刪除空白customeraddress記錄。
這些函式是以 地址 (CustomerAddress) 可寫入資料行/屬性 為基礎,不包含您環境中可能存在的任何自訂資料行。 如果您需要包含自訂資料行,您可能需要變更這些查詢。
靜態BulkDeleteEmptyCustomerAddressRecords方法會建立系統作業,以使用 customeradddress刪除空白記錄。
此方法分別使用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;
}