Compartilhar via


Tabelas de clientes (conta, contato e endereço do cliente)

As tabelas de conta e contato são essenciais para identificar e gerenciar clientes, vender produtos e serviços e fornecer serviços superiores aos clientes. A tabela customeraddress armazena informações de endereço e envio para um cliente.

Tabela de contas

A tabela de contas é uma das tabelas do Dataverse às quais a maioria das outras tabelas são anexadas ou subordinadas. No Dataverse, uma conta representa uma empresa com a qual a unidade de negócios tem uma relação. As informações incluídas em uma conta são todas informações de contato relevantes, informações da empresa, categoria, tipo de relacionamento e informações de endereço. Outras informações que se aplicam incluem os seguintes itens:

  • Uma conta pode ser pai da maioria dos tipos de tabela, incluindo outra conta.
  • Uma conta pode ser uma tabela autônoma.
  • Uma conta pode ter apenas uma conta como pai.
  • As contas podem ter várias contas filho e contatos filho.

O gerenciamento de contas é um dos conceitos importantes do gerenciamento de relacionamento do cliente entre empresas (Dynamics 365) porque uma organização deseja ver todas as atividades que tem com outra empresa. Todas essas atividades se reúnem no nível da conta. Exiba a referência da tabela de Conta

Tabela de contatos

No Dataverse, um contato representa uma pessoa, geralmente uma pessoa, com quem uma unidade de negócios tem uma relação, como um cliente, um fornecedor ou um colega. A tabela de contatos é uma das tabelas às quais a maioria das outras tabelas estão vinculadas. Um contato pode ser uma tabela autônoma. Incluem-se nesta tabela informações profissionais, pessoais e familiares e vários endereços. Exiba a referência da tabela Contato.

Contas e contatos fazem parte do gerenciamento de clientes e estão relacionados entre si das seguintes maneiras:

  • Um contato pode ser pai de todas as outras tabelas, exceto contas e contatos.
  • Um contato pode ter apenas uma conta como pai.
  • Um contato pode ser marcado como a pessoa de contato principal de uma conta que define a coluna Account.PrimaryContactId .

A tabela de contatos armazena informações sobre uma pessoa, como endereço de email, endereço de rua e números de telefone. Isso também inclui outras informações relacionadas, como data de nascimento ou aniversário da pessoa. Dependendo do tipo de clientes que uma unidade de negócios tem, ela precisa apenas de contatos, contatos e contas, para dar uma visão completa de seus clientes.

Vincular tabelas como atividades e anotações à tabela permite que o contact usuário veja toda a comunicação que o usuário teve com um cliente, todas as ações que o usuário tomou em nome do cliente e todas as informações que o usuário precisa sobre o cliente.

Tabela EndereçoDoCliente

Esta tabela contém mais informações de endereço e envio para registros de clientes (conta e contato). Por padrão, o Dataverse cria pelo menos dois customeraddress registros nesta tabela quando um novo registro de cliente é criado, mesmo quando não há dados para esses registros. Saiba como você pode alterar esse comportamento

Todos os customeraddress registros relacionados a registros de conta e contato estão disponíveis por meio das relações Account_CustomerAddress e Contact_CustomerAddress respectivamente. Essas relações usam a pesquisa parentid e a coluna parentidtypecode informa o tipo de registro do cliente ao qual o endereço está relacionado.

Dados de endereço incorporados nos registros de clientes

Você pode recuperar ou modificar os dados dos dois ou três registros incorporados customeraddress com o registro do cliente.

  • Os registros de conta têm colunas address1_addressid e address2_addressid.
  • Os registros de contato têm colunas address1_addresside address2_addressidaddress3_addressid.

Essas colunas armazenam customeraddressid valores, e há outras colunas de cliente prefixadas com address1*, address2* ou address3* que contêm as informações de endereço correspondentes da tabela customeraddress.

A coluna customeraddressaddressnumber informa qual endereço se aplica às colunas de registro do cliente primário. Não é possível definir a addressnumber coluna como um valor usado por outro customeraddress registro relacionado ao mesmo cliente pai. Você pode definir um valor existente addressnumber como 0 ou nulo e alterar o valor de outro registro se quiser trocar a posição relativa dos registros pelos registros do cliente. Embora o valor addressnumber seja incrementado para cada registro criado para um cliente, além de controlar a respectiva posição de endereço embutido no registro do cliente (ou 1, 2 ou 3), o valor da coluna addressnumber não é usado para nenhuma outra finalidade.

O Dataverse só atualiza esses customeraddress registros por meio das colunas de registro do cliente correspondentes em vez de atualizar as customeraddress linhas diretamente. No entanto, qualquer pessoa pode editar esses registros como registros customeraddress, ou adicionar mais registros customeraddress associados ao registro account ou contact que não estão integrados nos registros de conta e contato.

A exclusão de linhas de endereço do cliente inseridas não é permitida

Por padrão, se você tentar excluir um dos registros inseridos customeraddress que são referenciados no address1_addressid, address2_addressidou address3_addressid para um registro do cliente, você receberá um erro como o seguinte:

Nome: CannotDeleteDueToAssociation
Código: 0x80040227
Número: -2147220953
Mensagem: 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

Saiba como você pode alterar esse comportamento

Desativar a criação de registro vazio

Como cada linha na customeraddress tabela conta com a capacidade do Dataverse que você paga, talvez você queira minimizar esse custo.

Você pode instruir o Dataverse a não criar linhas de tabela vazias customeraddress para cada registro do cliente alterando a configuração Desativar criação de registros de endereço vazios no Centro de administração do Power Platform. Antes de alterar esse comportamento, você deve considerar se você tem personalizações existentes que dependem do comportamento padrão. Saiba mais sobre essa configuração

Enquanto essa configuração está ativada, nenhuma nova linha de tabela vazia customeraddress é criada quando novos registros de cliente são criados. Os registros só serão criados se o conteúdo de entrada contiver dados de endereço. Normalmente, o conteúdo inclui apenas colunas que têm dados. Se não houver dados para as colunas, as colunas não serão incluídas no conteúdo e os valores serão nulos quando o registro for salvo. No entanto, se o conteúdo contiver colunas de endereço com valores definidos como nulos, o endereço será criado com valores nulos. Se você continuar a ver registros vazios sendo criados, verifique como eles são criados e se esse aplicativo cliente está enviando dados de coluna com valores nulos.

Se a configuração Desabilitar a criação de registro de endereço vazia estiver desativada, o comportamento padrão será retomado. Ativar essa configuração não exclui nenhuma linha de tabela existente customeraddress . Ativar essa configuração novamente depois que ela foi desativada não cria novamente registros que não foram criados.

Detectar se a criação de registro de endereço vazio está desabilitada

Essas funções de exemplo mostram como detectar se a configuração Desabilitar a criação de registro de endereço vazio está habilitada no ambiente.

Esse método estático IsEmptyAddressRecordCreationDisabled usa a classe WhoAmIRequest e o método IOrganizationService.Retrieve para verificar um valor na coluna 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";
}

Excluir registros de endereço inseridos

Por padrão, você não pode excluir linhas de tabela incorporadas referenciadas pelas colunas customeraddress, address1_addressid, address2_addressid ou address3_addressid em tabelas de clientes. Consulte Não é permitido excluir linhas de endereço de cliente incorporadas

A configuração Habilitar Exclusão de Registros de Endereço no centro de administração do Power Platform altera esse comportamento. Saiba mais sobre essa configuração

Detectar se a exclusão de registros de endereço está habilitada

Essas funções de exemplo mostram como detectar se a configuração Habilitar Exclusão de Registros de Endereço está habilitada no ambiente.

Esse método estático IsDeleteAddressRecordsEnabled usa a classe WhoAmIRequest e o método IOrganizationService.Retrieve para verificar um valor na coluna 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";

}

Exclusão em massa de registros de endereços de cliente vazios

Depois de desabilitar a criação de registro de endereço vazio e habilitar a exclusão de registros de endereço, você pode usar as funções de exemplo a seguir para excluir de forma assíncrona registros vazios customeraddress usando a BulkDelete mensagem.

Essas funções são baseadas nas colunas/atributos editáveis do Endereço (CustomerAddress) e não incluem colunas personalizadas que possam existir no seu ambiente. Talvez você queira alterar essas consultas se precisar incluir suas colunas personalizadas.

O método estático BulkDeleteEmptyCustomerAddressRecords cria um trabalho do sistema para excluir registros vazios customeradddress usando a classe BulkDeleteRequest.

Esse método usa o exemplo IsDeleteAddressRecordsEnabled e os métodos estáticos descritos em IsEmptyAddressRecordCreationDisabled e detectar se a criação de registro de endereço vazio está desabilitada, respectivamente, para garantir que essas configurações sejam configuradas para permitir a exclusão de todos os registros de endereço do cliente vazios e garantir que nenhuma nova seja criada.

/// <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;

}