Tablas de clientes (cuenta, contacto y dirección de cliente)

Las tablas cuenta y contacto son esenciales para identificar y administrar clientes, vender productos y servicios y brindar un servicio superior. a los clientes. La tabla dirección del cliente almacena la dirección y la información de envío de un cliente.

Tabla de cuentas

La tabla de cuentas es una de las tablas en Dataverse a la que se asocian o relacionan la mayoría del resto de tablas. En Dataverse, una cuenta representa una compañía con la que la unidad de negocio tiene una relación. La información incluida en una cuenta es toda la información de contacto, información de la compañía, categoría, tipo de relación e información de dirección pertinentes. Otra información pertinente incluye los siguientes elementos:

  • Una cuenta puede ser un elemento primario de la mayoría de los tipos de tablas, incluida otra cuenta.
  • Una cuenta puede ser una tabla independiente.
  • Una cuenta puede tener únicamente una cuenta como elemento primario.
  • Las cuentas pueden tener varias cuentas y contactos secundarios.

La gestión de cuentas es uno de los conceptos importantes de la gestión de relaciones con los clientes de empresa a empresa (Dynamics 365) porque una organización quiere ver todas las actividades que tiene con otra empresa. Todas estas actividades se reúnen a nivel de cuenta. Vea la referencia de la tabla Cuenta.

Tabla de contactos

En Dataverse, un contacto representa una persona, normalmente un individuo, con el que una unidad de negocio tiene una relación, como un cliente, un proveedor o un compañero. La tabla de contacto es una de las tablas a las que se vinculan la mayoría de las otras tablas. Un contacto puede ser una tabla independiente. En esta tabla se incluyen información profesional, personal y familiar, y varias direcciones. Ver la referencia de la tabla de contactos.

Tanto cuentas como contactos se consideran parte de la administración de clientes y se relacionan unos con otros de las siguientes formas:

  • Un contacto puede ser un elemento primario para cualquier otra tabla, excepto cuentas y contactos.
  • Un contacto puede tener únicamente una cuenta como elemento primario.
  • Un contacto se puede marcar como la persona de contacto principal para una cuenta configurando la columna Account.PrimaryContactId .

La tabla de contactos almacena información sobre una persona, como una dirección de correo electrónico, una dirección postal y números de teléfono. También incluye otra información relacionada, como el cumpleaños o la fecha de aniversario de la persona. Según el tipo de clientes que tiene una unidad de negocio, se necesitan solo los contactos, o contactos y cuentas, para ofrecer una vista completa de los clientes.

Vincular tablas como actividades y notas a la tabla contact le permite al usuario ver toda la comunicación que tuvo con un cliente, cualquier acción que el usuario realizó en nombre del cliente y toda la información que el usuario necesita sobre el cliente. .

Tabla CustomerAddress

Esta tabla contiene más información de dirección y envío para registros de clientes (cuenta y contacto). De forma predeterminada, Dataverse crea al menos dos customeraddress registros en esta tabla cuando se crea un nuevo registro de cliente, incluso cuando no hay datos para estos registros. Descubra cómo puede cambiar este comportamiento

Todos los customeraddress registros relacionados con registros de cuentas y contactos están disponibles a través de Account_CustomerAddress y Contact_CustomerAddress . Relaciones respectivamente. Estos Relaciones usan la búsqueda parentid y la columna parentidtypecode le indica el tipo de cliente, registra la dirección. está relacionado con.

Datos de direcciones integrados en los registros de clientes

Puede recuperar o modificar los datos de los dos o tres registros customeraddress incrustados con el registro del cliente.

  • Los registros de cuenta tienen las columnas address1_addressid y address2_addressid.
  • Los registros de contacto tienen columnas address1_addressid, address2_addressid y address3_addressid.

Estas columnas almacenan customeraddressid valores y hay otras columnas de clientes, cada una con el prefijo address1*, address2* o address3* que contienen los valores correspondientes. información de dirección de la tabla customeraddress .

La columna customeraddress número de dirección le indica qué dirección se aplica a las columnas del registro de cliente principal. No puede establecer la columna addressnumber en un valor utilizado por otro registro customeraddress relacionado con el mismo cliente principal. Puede establecer un valor addressnumber existente en 0 o nulo y luego cambiar el valor de otro registro si desea intercambiar la posición relativa de los registros por los registros del cliente. Mientras que el valor addressnumber incrementa para cada registro creado para un cliente, además de controlar la posición de la dirección incrustada respectiva en el registro del cliente (ya sea 1, 2 o 3), el valor de la columna addressnumber no se utiliza para ningún otro propósito.

Dataverse solo actualiza estos customeraddress registros a través de las columnas de registros de clientes correspondientes en lugar de actualizar las filas customeraddress directamente. Sin embargo, cualquiera puede editar estos registros como customeraddress registros o agregar más customeraddress registros asociados con el registro account o contact que no están disponibles. t integrado con la cuenta y los registros de contacto.

No se permite la eliminación de filas de direcciones de clientes incrustadas

De forma predeterminada, si intenta eliminar uno de los registros customeraddress incrustados a los que se hace referencia en address1_addressid, address2_addressid o address3_addressid para un registro de cliente, obtiene un error como el siguiente:

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

Descubra cómo puede cambiar este comportamiento

Deshabilitar la creación de registros vacíos

Dado que cada fila de la tabla customeraddress cuenta para la capacidad Dataverse que paga, es posible que desee minimizar este costo.

Puede indicar a Dataverse que no cree filas de tabla customeraddress vacías para cada registro de cliente cambiando la configuración Desactivar creación de registros de direcciones vacíos . en el Power Platform centro de administración. Antes de cambiar este comportamiento, debe considerar si tiene personalizaciones existentes que dependan del comportamiento predeterminado. Más información sobre esta configuración

Mientras esta configuración esté activada, no se crearán nuevas filas de tabla customeraddress vacías cuando se creen nuevos registros de clientes. Los registros solo se crean si la carga útil entrante contiene datos de dirección. Normalmente, la carga útil solo incluye columnas que tienen datos. Si no hay datos para las columnas, las columnas no se incluyen en la carga útil y los valores son nulos cuando se guarda el registro. Sin embargo, si la carga contiene columnas de direcciones con valores establecidos en nulos, la dirección se crea con valores nulos. Si continúa viendo la creación de registros vacíos, verifique cómo se crean y si esa aplicación cliente envía datos de columna con valores nulos.

Si la configuración Desactivar creación de registros de direcciones vacías está desactivada, se reanuda el comportamiento predeterminado. Activar esta configuración no elimina ninguna fila de la tabla customeraddress existente. Volver a activar esta configuración después de desactivarla no vuelve a crear registros que no se crearon.

Detectar si la creación de registros de direcciones vacíos está deshabilitada

Estas funciones de ejemplo muestran cómo detectar si la configuración Desactivar creación de registros de direcciones vacíos está habilitada en el entorno.

Este método IsEmptyAddressRecordCreationDisabled estático utiliza la clase WhoAmIRequest y el método IOrganizationService.Retrieve para verificar un valor en la columna 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";
}

Eliminar registros de direcciones incrustados

De forma predeterminada, no puede eliminar las filas de la tabla customeraddress incrustadas a las que hacen referencia las columnas address1_addressid, address2_addressid o address3_addressid en las tablas de clientes. Ver No se permite la eliminación de filas de direcciones de clientes integradas.

La configuración Habilitar eliminación de registros de direcciones en el Power Platform centro de administración cambia este comportamiento. Más información sobre esta configuración

Detectar si la eliminación de registros de direcciones está habilitada

Estas funciones de ejemplo muestran cómo detectar si la configuración Habilitar eliminación de registros de direcciones está habilitada en el entorno.

Este método IsDeleteAddressRecordsEnabled estático utiliza la clase WhoAmIRequest y el método IOrganizationService.Retrieve para verificar un valor en la columna 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";

}

Eliminación masiva de registros de direcciones de clientes vacíos

Después de deshabilitar la creación de registros de direcciones vacíos y habilitar la eliminación de registros de direcciones, puede usar las siguientes funciones de ejemplo para eliminar de forma asincrónica registros customeraddress vacíos mediante el mensaje BulkDelete .

Estas funciones se basan en las columnas/atributos de escritura Dirección (Dirección del cliente) y no incluyen ninguna columna personalizada que pueda estar en su entorno. Es posible que desee modificar estas consultas si necesita incluir sus columnas personalizadas.

El método estático BulkDeleteEmptyCustomerAddressRecords crea un trabajo del sistema para eliminar registros customeradddress vacíos utilizando la clase BulkDeleteRequest.

Este método utiliza los métodos estáticos de ejemplo IsDeleteAddressRecordsEnabled y IsEmptyAddressRecordCreationDisabled descritos en Detectar si la eliminación de registros de direcciones está habilitada y . Detecte si la creación de registros de direcciones vacíos está deshabilitada respectivamente para garantizar que estas configuraciones estén configuradas para permitir la eliminación de todos los registros de direcciones de clientes vacíos y garantizar que no se creen nuevos.

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

}

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).