Partager via


Tables client (compte, contact et adresse client)

Les tables de compte et de contact sont essentielles pour identifier et gérer les clients, vendre des produits et des services et fournir un service supérieur aux clients. La table customeraddress stocke les informations d’adresse et d’expédition d’un client.

Table de compte

La table de compte est l’une des tables de Dataverse auxquelles la plupart des autres tables sont attachées ou parentées. Dans Dataverse, un compte représente une entreprise avec laquelle l’unité commerciale a une relation. Les informations incluses dans un compte sont toutes les coordonnées appropriées, les informations sur la société, la catégorie, le type de relation et l’adresse. D’autres informations utiles incluent les éléments suivants :

  • Un compte peut être parent de la plupart des types de tables, y compris un autre compte.
  • Un compte peut être une table autonome.
  • Un compte ne peut avoir qu’un compte parent.
  • Les comptes peuvent avoir plusieurs comptes enfants et plusieurs contacts enfants.

La gestion des comptes est l’un des concepts importants de la gestion des relations client métier à entreprise (Dynamics 365), car une organisation souhaite voir toutes les activités qu’elle possède avec une autre entreprise. Toutes ces activités se réunissent au niveau du compte. Consultez la référence de la table Account.

Table de contacts

Dans Dataverse, un contact représente une personne, généralement une personne avec laquelle une unité commerciale a une relation, telle qu’un client, un fournisseur ou un collègue. La table de contacts est l’une des tables auxquelles la plupart des autres tables sont liées. Un contact peut être une table autonome. Ce tableau contient des informations professionnelles, personnelles et familiales, ainsi que plusieurs adresses. Consultez la référence de la table Contact.

Les comptes et les contacts font partie de la gestion des clients et sont associés les uns aux autres des façons suivantes :

  • Un contact peut être un parent de toute autre table, à l’exception des comptes et des contacts.
  • Un contact ne peut avoir qu’un compte parent.
  • Un contact peut être marqué comme personne de contact principale pour un compte définissant la colonne Account.PrimaryContactId .

La table de contacts stocke des informations sur une personne telle qu’une adresse e-mail, une adresse postale et des numéros de téléphone. Il inclut également d’autres informations connexes, telles que l’anniversaire ou la date anniversaire de la personne. En fonction du type de client d’une division, elle n’a besoin que de contacts, ou de contacts et de comptes, pour afficher une vue d’ensemble de ses clients.

La liaison de tables telles que les activités et les notes à la contact table permet à l’utilisateur de voir toutes les communications qu’il avait avec un client, toutes les actions effectuées par l’utilisateur pour le compte du client et toutes les informations dont l’utilisateur a besoin au sujet du client.

Tableau "CustomerAddress"

Ce tableau contient plus d’informations d’adresse et d’expédition pour les enregistrements client (compte et contact). Par défaut, Dataverse crée au moins deux customeraddress enregistrements dans cette table lorsqu’un nouvel enregistrement client est créé, même s’il n’y a pas de données pour ces enregistrements. Découvrez comment modifier ce comportement

Tous les customeraddress enregistrements liés aux enregistrements de compte et de contact sont disponibles via les relations Account_CustomerAddress et Contact_CustomerAddress respectivement. Ces relations utilisent à la fois la recherche parentid et la colonne parentidtypecode vous indique le type d’enregistrement client auquel l’adresse est liée.

Données d'adresse intégrées aux enregistrements clients

Vous pouvez récupérer ou modifier les données des deux ou trois enregistrements incorporés customeraddress avec l’enregistrement client.

  • Les enregistrements de compte ont des colonnes address1_addressid et address2_addressid.
  • Les enregistrements de contact ont des colonnes address1_addressid, address2_addressidet address3_addressid.

Ces colonnes stockent des valeurs customeraddressid et il existe d'autres colonnes de client chacun précédée des préfixes address1*, address2* ou address3* contenant les informations d'adresse correspondantes provenant de la table customeraddress.

La customeraddress colonne addressnumber vous indique l’adresse qui s’applique aux colonnes d’enregistrement client parent. Vous ne pouvez pas définir la addressnumber colonne sur une valeur utilisée par un autre customeraddress enregistrement lié au même client parent. Vous pouvez définir une valeur existante addressnumber sur 0 ou null, puis modifier la valeur d’un autre enregistrement si vous souhaitez échanger la position relative des enregistrements pour les enregistrements clients. Bien que la addressnumber valeur incrémente pour chaque enregistrement créé pour un client, autre que le contrôle de la position d’adresse incorporée correspondante dans l’enregistrement client (soit 1, 2soit 3), la addressnumber valeur de colonne n’est utilisée à aucun autre usage.

Dataverse met uniquement à jour ces customeraddress enregistrements via les colonnes d’enregistrement client correspondantes au lieu de mettre directement à jour les customeraddress lignes. Toutefois, tout le monde peut modifier ces enregistrements en tant qu’enregistrements customeraddress, ou ajouter d’autres enregistrements customeraddress associés à l’enregistrement account ou contact qui ne sont pas incorporés avec les enregistrements de compte et de contact.

La suppression de lignes d’adresses client incorporées n’est pas autorisée

Par défaut, si vous tentez de supprimer l’un des enregistrements incorporés customeraddress référencés dans le address1_addressid, address2_addressidou address3_addressid pour un enregistrement client, vous obtenez une erreur comme suit :

Nom : CannotDeleteDueToAssociation
Code : 0x80040227
Nombre : -2147220953
Message : 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

Découvrez comment modifier ce comportement

Désactiver la création d’enregistrements vides

Étant donné que chaque ligne de la customeraddress table compte par rapport à la capacité Dataverse que vous payez, vous pouvez réduire ce coût.

Vous pouvez indiquer à Dataverse de ne pas créer de lignes de table vides customeraddress pour chaque enregistrement client en modifiant le paramètre de désactivation de la création de lignes d'adresses vides dans le Centre d’administration Power Platform. Avant de modifier ce comportement, vous devez déterminer si vous avez des personnalisations existantes qui dépendent du comportement par défaut. En savoir plus sur ce paramètre

Pendant que ce paramètre est activé, aucune nouvelle ligne de table vide customeraddress n’est créée lorsque de nouveaux enregistrements clients sont créés. Les enregistrements sont créés uniquement si la charge utile entrante contient des données d’adresse. Normalement, la charge utile inclut uniquement les colonnes qui ont des données. S’il n’existe aucune donnée pour les colonnes, les colonnes ne sont pas incluses dans la charge utile et les valeurs sont null lorsque l’enregistrement est enregistré. Toutefois, si la charge utile contient des colonnes d’adresse avec des valeurs définies sur Null, l’adresse est créée avec des valeurs Null. Si vous continuez à voir les enregistrements vides créés, vérifiez comment ils sont créés et si cette application cliente envoie des données de colonne avec des valeurs Null.

Si le paramètre Désactiver la création d’enregistrement d’adresse vide est désactivé, le comportement par défaut reprend. L’activation de ce paramètre ne supprime aucune ligne de table existante customeraddress . Le fait de réactiver ce paramètre une fois qu’il a été désactivé ne recrée pas d’enregistrements qui n’ont pas été créés.

Détecter si la création d’un enregistrement d’adresse vide est désactivée

Ces exemples de fonctions montrent comment détecter si le paramètre Désactiver la création d’enregistrements d’adresse vide est activé dans l’environnement.

Cette méthode statique IsEmptyAddressRecordCreationDisabled utilise la classe WhoAmIRequest et la méthode IOrganizationService.Retrieve pour vérifier une valeur dans la colonne 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";
}

Supprimer les enregistrements d’adresses incorporés

Par défaut, vous ne pouvez pas supprimer les lignes du tableau intégrées customeraddress, référencées par les colonnes address1_addressid, address2_addressid ou address3_addressid, dans les tables client. Voir Suppression des lignes d’adresses client incorporées n’est pas autorisée

Le paramètre Activer la suppression des enregistrements d’adresses dans le Centre d’administration Power Platform modifie ce comportement. En savoir plus sur ce paramètre

Détecter si la suppression des enregistrements d’adresses est activée

Ces exemples de fonctions montrent comment détecter si le paramètre Activer la suppression des enregistrements d’adresse est activé dans l’environnement.

Cette méthode statique IsDeleteAddressRecordsEnabled utilise la classe WhoAmIRequest et la méthode IOrganizationService.Retrieve pour vérifier une valeur dans la colonne 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";

}

Suppression en bloc des enregistrements d’adresses client vides

Après avoir désactivé la création d’enregistrements d’adresses vides et activé la suppression des enregistrements d’adresses, vous pouvez utiliser les exemples de fonctions suivants pour supprimer de manière asynchrone des enregistrements vides customeraddress à l’aide du BulkDelete message.

Ces fonctions sont basées sur les colonnes/attributs accessibles en écriture Address (CustomerAddress) et n’incluent pas de colonnes personnalisées qui peuvent se trouver dans votre environnement. Vous pouvez modifier ces requêtes si vous devez inclure vos colonnes personnalisées.

La méthode statique BulkDeleteEmptyCustomerAddressRecords crée un travail système pour supprimer des enregistrements vides customeradddress à l’aide de la classe BulkDeleteRequest.

Cette méthode utilise l’exemple IsDeleteAddressRecordsEnabled et IsEmptyAddressRecordCreationDisabled les méthodes statiques décrites dans Détecter si la suppression des enregistrements d’adresses est activée et détecter si la création d’enregistrements d’adresses vides est désactivée respectivement pour vous assurer que ces paramètres sont configurés pour autoriser la suppression de tous les enregistrements d’adresses client vides et vérifier qu’aucun nouvel enregistrement n’est créé.

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

}