계정 및 연락처 테이블은 고객을 식별하고 관리하고, 제품 및 서비스를 판매하고, 고객에게 우수한 서비스를 제공하는 데 필수적입니다. 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 열은 부모 고객 레코드 열에 적용되는 주소를 알려줍니다. 다른 customeraddress 레코드에서 사용하는 값을 동일한 부모 고객과 관련된 열 addressnumber에 설정할 수 없습니다. 기존 addressnumber 값을 0 또는 null로 설정한 다음 고객 레코드에 대한 레코드의 상대 위치를 교환하려는 경우 다른 레코드의 값을 변경할 수 있습니다.
addressnumber값은 고객을 위해 생성된 각 레코드마다 증가하지만, 고객 레코드에 포함된 각 주소 위치 (즉, 1, 2, 3)를 제어하는 것 외에는 addressnumber 열 값이 다른 목적으로 사용되지 않습니다.
Dataverse는 customeraddress 행을 직접 업데이트하는 대신 해당 고객 레코드 열을 통해서만 이러한 customeraddress 레코드를 업데이트합니다. 그러나 누구나 이러한 레코드를 customeraddress로 편집하거나, 계정 및 연락처 레코드에 포함되지 않은 customeraddress 레코드와 관련된 추가 account 레코드를 contact에 추가할 수 있습니다.
포함된 고객 주소 행 삭제는 허용되지 않습니다.
기본적으로, 고객 레코드의 address1_addressid, address2_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 테이블 행은 삭제되지 않습니다. 이 설정이 꺼진 후 다시 켜지는 것은 생성되지 않은 레코드를 다시 만들지 않습니다.
빈 주소 레코드 만들기를 사용할 수 없는지 여부를 검색합니다.
다음 예제 함수는 환경에서 빈 주소 레코드 만들기 설정 사용 안 함을 감지하는 방법을 보여 줍니다.
이 정적 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";
}
빈 고객 주소 레코드 대량 삭제
빈 주소 레코드 만들기를 사용하지 않도록 설정하고 주소 레코드 삭제를 사용하도록 설정한 후 다음 예제 함수를 사용하여 메시지를 사용하여 customeraddress 빈 BulkDelete 레코드를 비동기적으로 삭제할 수 있습니다.
이러한 함수는 주소(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;
}