Compartir a través de


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

Las tablas de cuentas y contactos son esenciales para identificar y gestionar clientes, vender productos y servicios y brindar un servicio superior a los clientes. La tabla customeraddress 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 entre empresas (Dynamics 365) porque una organización desea ver todas las actividades que tiene con otra empresa. Todas estas actividades se unen a nivel de cuenta. Ver 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 puede marcarse 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 la fecha de cumpleaños o 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 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 los 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. Aprenda cómo puede cambiar este comportamiento

Todos los registros relacionados con los registros de cuenta y contacto están disponibles a través de customeraddress Account_CustomerAddress y Contact_CustomerAddress Relaciones respectivamente. Estos Relaciones utilizan la búsqueda parentid , y la columna parentidtypecode le indica el tipo de registro de cliente con el que está relacionada la dirección.

Datos de dirección integrados con 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 columnas address1_addressid y address2_addressid.
  • Los registros de contacto tienen columnas address1_addressid, address2_addressid y address3_addressid.

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

La columna customeraddress número de dirección le indica qué dirección se aplica a las columnas de registro de cliente elemento primario. No se puede establecer la columna en un valor utilizado por otro registro relacionado con el mismo cliente elemento primario. addressnumber customeraddress 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 de los registros del cliente. Si bien el valor se incrementa para cada registro creado para un cliente, además de controlar la posición de la dirección incorporada respectiva en el registro del cliente (ya sea addressnumber , 1 o 2), el valor de la columna 3 no se utiliza para ningún otro propósito. addressnumber

Dataverse solo actualiza estos customeraddress registros a través de las columnas de registros de cliente correspondientes en lugar de actualizar las customeraddress filas directamente. Sin embargo, cualquiera puede editar estos registros como customeraddress registros, o agregar más customeraddress registros asociados con el account o contact registro que no estén integrados con los registros de cuenta y 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, obtendrá 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

Aprenda cómo puede cambiar este comportamiento

Deshabilitar la creación de registros vacíos

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

Puede indicarle a Dataverse no crear filas de tabla vacías customeraddress para cada registro de cliente cambiando la configuración Deshabilitar creación de registros de direcciones vacíos en Power Platform Centro de administración. Antes de cambiar este comportamiento, debe considerar si tiene personalizaciones existentes que dependen del comportamiento predeterminado. Obtenga más información sobre esta configuración

Mientras esta configuración esté activada, no se crearán nuevas filas de tabla vacías cuando se creen nuevos registros de clientes. customeraddress 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 útil contiene columnas de dirección con valores establecidos en nulos, la dirección se crea con valores nulos. Si continúa viendo que se crean registros vacíos, verifique cómo se crean y si esa aplicación cliente está enviando datos de columna con valores nulos.

Si la configuración Deshabilitar creación de registros de direcciones vacíos está desactivada, se reanuda el comportamiento predeterminado. Al activar esta configuración no se elimina ninguna fila de tabla existente. customeraddress 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ías está deshabilitada

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

Este método estático utiliza la clase WhoAmIRequest y el método IOrganizationService.Retrieve para comprobar un valor en la columna Organización.OrgDbOrgSettings. IsEmptyAddressRecordCreationDisabled ... ... ...

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 se pueden eliminar las filas de tablas incrustadas a las que hacen referencia las columnas customeraddress , address1_addressid o address2_addressid en las tablas de clientes. address3_addressid Consulte No se permite la eliminación de filas de direcciones de clientes incrustadas

La configuración Habilitar eliminación de registros de direcciones en Power Platform Centro de administración cambia este comportamiento. Obtenga 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 ambiente.

Este método estático utiliza la clase WhoAmIRequest y el método IOrganizationService.Retrieve para comprobar un valor en la columna Organización.OrgDbOrgSettings. IsDeleteAddressRecordsEnabled ... ... ...

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 vacíos mediante el mensaje customeraddress . BulkDelete

Estas funciones se basan en las columnas/atributos escribibles de Dirección (CustomerAddress) y no incluyen ninguna columna personalizada que pueda estar en su ambiente. Es posible que desees modificar estas consultas si necesitas incluir tus columnas personalizadas.

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

Este método utiliza los métodos de ejemplo IsDeleteAddressRecordsEnabled y IsEmptyAddressRecordCreationDisabled estáticos descritos en Detectar si la eliminación de registros de direcciones está habilitada y Detectar 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).