Freigeben über


Kundentabellen (Konto, Kontakt und Kundenadresse)

Die Konto- - und Kontakttabellen sind von entscheidender Bedeutung für die Identifizierung und Verwaltung von Kunden, den Verkauf von Produkten und Dienstleistungen sowie die Bereitstellung eines erstklassigen Kundendienstes. In der Tabelle customeraddress werden Adress- und Versandinformationen eines Kunden gespeichert.

Konto-Tabelle

Die Tabelle „Konto“ ist eine der Tabellen in Dataverse, an die die meisten anderen Tabellen angehängt oder übergeordnet sind. In Dataverse steht eine Firma für ein Unternehmen, mit dem die Unternehmenseinheit eine Geschäftsbeziehung unterhält. Informationen, die zu einer Firma erfasst werden, sind alle relevanten Kontaktinformationen, Unternehmensinformationen, Kategorien, Beziehungstypen und Adresseinformationen. Weitere Informationen, die verwendet werden können, sind die folgenden Elemente:

  • Ein Konto kann den meisten Tabellentypen übergeordnet sein, einschließlich eines anderen Kontos.
  • Ein Konto kann eine eigenständige Tabelle sein.
  • Eine Firma kann nur eine einzige Firma als übergeordnetes Element haben.
  • Firmen können mehrere untergeordnete Firmen und untergeordnete Kontakte aufweisen.

Die Kontoverwaltung ist eines der wichtigsten Konzepte des Business-to-Business-Kundenbeziehungsmanagements (Dynamics 365), da ein Unternehmen alle Aktivitäten sehen möchte, die es mit einem anderen Unternehmen durchführt. Alle diese Aktivitäten werden auf Kontoebene zusammengeführt. Sehen Sie sich die Referenz zur Kontotabelle an.

Kontakt-Tabelle

In Dataverse kann ein Kontakt eine Person, in der Regel ein Individuum, mit dem eine Unternehmenseinheit eine Geschäftsbeziehung wie Kunde, Lieferant oder Kollege unterhält, darstellen. Die Kontakttabelle ist eine der Tabellen, mit denen die meisten anderen Tabellen verknüpft sind. Ein Kontakt kann eine eigenständige Tabelle sein. In dieser Tabelle sind berufliche, persönliche und familiäre Informationen sowie mehrere Adressen enthalten. Sehen Sie sich die Referenz zur Kontakttabelle an.

Firmen und Kontakte sind Bestandteil der Verwaltung von Kunden und stehen folgendermaßen in Beziehungen zueinander:

  • Ein Kontakt kann übergeordnet zu jeder anderen Tabelle außer Konten und Kontakten sein.
  • Ein Kontakt kann nur eine einzige Firma als übergeordnetes Element haben.
  • Ein Kontakt kann als primäre Kontaktperson für ein Konto markiert werden, indem die Spalte Account.PrimaryContactId festgelegt wird.

In der Kontakttabelle werden Informationen zu einer Person gespeichert, beispielsweise E-Mail-Adresse, Anschrift und Telefonnummern. Es enthält außerdem weitere zugehörige Informationen, beispielsweise den Geburtstag oder den Jahrestag der Person. Je nach Kundentyp einer Unternehmenseinheit werden entweder nur Kontakte oder Kontakte und Firmen benötigt, um einen vollständigen Überblick über ihre Kunden bereitzustellen.

Durch die Verknüpfung von Tabellen wie Aktivitäten und Notizen mit der contact Tabelle kann der Benutzer die gesamte Kommunikation sehen, die der Benutzer mit einem Kunden hatte, alle Aktionen, die der Benutzer im Namen des Kunden ausgeführt hat, und alle Informationen, die der Benutzer über den Kunden benötigt.

customeraddress-Tabelle

Diese Tabelle enthält weitere Adress- und Versandinformationen für Kundendatensätze (Konto und Kontakt). Standardmäßig werden bei der Erstellung eines neuen Kundendatensatzes mindestens zwei Datensätze in dieser Tabelle erstellt, auch wenn für diese Datensätze keine Daten vorhanden sind. Dataverse customeraddress Erfahren Sie, wie Sie dieses Verhalten ändern können

Alle customeraddress Datensätze im Zusammenhang mit Konto- und Kontaktdatensätzen sind über die Account_CustomerAddress bzw. Contact_CustomerAddress Beziehungen verfügbar. Diese Beziehungen verwenden beide die parentid -Suche, und die Spalte parentidtypecode gibt Aufschluss über den Typ des Kundendatensatzes, auf den sich die Adresse bezieht.

In Kundendatensätze eingebettete Adressdaten

Sie können die Daten für die zwei oder drei eingebetteten customeraddress Datensätze mit dem Kundendatensatz abrufen oder ändern.

  • Kontodatensätze haben die Spalten address1_addressid und address2_addressid.
  • Kontaktdatensätze haben die Spalten address1_addressid, address2_addressid und address3_addressid.

In diesen Spalten werden customeraddressid Werte gespeichert. Darüber hinaus gibt es weitere Kundenspalten, die jeweils mit address1*, address2* oder address3* beginnen und die entsprechenden Adressinformationen aus der customeraddress Tabelle enthalten.

Die Spalte customeraddress Adressnummer gibt Aufschluss darüber, welche Adresse für die Kundendatensatzspalten übergeordnetes Element gilt. Sie können die addressnumber Spalte nicht auf einen Wert setzen, der von einem anderen customeraddress Datensatz verwendet wird, der sich auf denselben übergeordnetes Element-Kunden bezieht. Sie können einen vorhandenen addressnumber Wert auf 0 oder Null setzen und dann den Wert eines anderen Datensatzes ändern, wenn Sie die relative Position der Datensätze für die Kundendatensätze vertauschen möchten. Während der addressnumber Wert für jeden für einen Kunden erstellten Datensatz erhöht wird, wird der 1 Spaltenwert für keinen anderen Zweck verwendet, außer zur Steuerung der jeweiligen eingebetteten Adressposition im Kundendatensatz (entweder 2, 3 oder addressnumber ).

Dataverse aktualisiert diese customeraddress Datensätze nur über die entsprechenden Kundendatensatzspalten, anstatt die customeraddress Zeilen direkt zu aktualisieren. Allerdings kann jeder diese Datensätze als customeraddress Datensätze bearbeiten oder weitere customeraddress Datensätze hinzufügen, die mit dem account oder contact Datensatz verknüpft sind, die nicht in die Konto- und Kontaktdatensätze eingebettet sind.

Das Löschen eingebetteter Kundenadresszeilen ist nicht zulässig

Wenn Sie versuchen, einen der eingebetteten customeraddress Datensätze zu löschen, auf die in address1_addressid, address2_addressid oder address3_addressid einem Kundendatensatz verwiesen wird, erhalten Sie standardmäßig eine Fehlermeldung wie die folgende:

Name: CannotDeleteDueToAssociation
Code: 0x80040227
Nummer: -2147220953
Nachricht: 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

Erfahren Sie, wie Sie dieses Verhalten ändern können

Deaktivieren der Erstellung leerer Datensätze

Da jede Zeile in der customeraddress Tabelle auf die Dataverse Kapazität angerechnet wird, für die Sie bezahlen, möchten Sie diese Kosten möglicherweise minimieren.

Sie können festlegen, dass für jeden Kundendatensatz keine leeren Dataverse Tabellenzeilen erstellt werden, indem Sie die Einstellung customeraddress Erstellung leerer Adressdatensätze deaktivieren in Admin Center ändern Power Platform . Bevor Sie dieses Verhalten ändern, sollten Sie prüfen, ob Sie über vorhandene Anpassungen verfügen, die vom Standardverhalten abhängen. Weitere Informationen zu dieser Einstellung

Wenn diese Einstellung aktiviert ist, werden beim Anlegen neuer Kundendatensätze keine neuen leeren customeraddress Tabellenzeilen erstellt. Datensätze werden nur erstellt, wenn die eingehende Nutzlast Adressdaten enthält. Normalerweise enthält die Nutzlast nur Spalten mit Daten. Wenn für die Spalten keine Daten vorhanden sind, werden die Spalten nicht in die Nutzlast aufgenommen und die Werte sind null, wenn der Datensatz gespeichert wird. Wenn die Nutzlast jedoch Adressspalten mit auf Null gesetzten Werten enthält, wird die Adresse mit Nullwerten erstellt. Wenn weiterhin leere Datensätze erstellt werden, überprüfen Sie, wie sie erstellt werden und ob diese Clientanwendung Spaltendaten mit Nullwerten sendet.

Wenn die Einstellung Erstellung leerer Adressdatensätze deaktivieren deaktiviert ist, wird das Standardverhalten wiederhergestellt. Durch das Aktivieren dieser Einstellung werden keine vorhandenen customeraddress Tabellenzeilen gelöscht. Wenn Sie diese Einstellung nach dem Deaktivieren wieder aktivieren, werden nicht erstellte Datensätze nicht neu erstellt.

Erkennen, ob die Erstellung leerer Adressdatensätze deaktiviert ist

Diese Beispielfunktionen zeigen, wie erkannt wird, ob die Einstellung Erstellung leerer Adressdatensätze deaktivieren in Umgebung aktiviert ist.

Diese statische IsEmptyAddressRecordCreationDisabled Methode verwendet die Klasse WhoAmIRequest und die Methode IOrganizationService.Retrieve , um einen Wert in der Spalte Organization.OrgDbOrgSettings zu überprüfen.

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";
}

Eingebettete Adressdatensätze löschen

Standardmäßig können Sie eingebettete customeraddress Tabellenzeilen, auf die in den Spalten address1_addressid, address2_addressid oder address3_addressid in Kundentabellen verwiesen wird, nicht löschen. Siehe Das Löschen eingebetteter Kundenadresszeilen ist nicht zulässig

Die Einstellung Löschen von Adressdatensätzen aktivieren in Power Platform Admin Center ändert dieses Verhalten. Weitere Informationen zu dieser Einstellung

Erkennen, ob das Löschen von Adressdatensätzen aktiviert ist

Diese Beispielfunktionen zeigen, wie erkannt wird, ob die Einstellung Löschen von Adressdatensätzen aktivieren in Umgebung aktiviert ist.

Diese statische IsDeleteAddressRecordsEnabled Methode verwendet die WhoAmIRequest-Klasse und die IOrganizationService.Retrieve-Methode , um einen Wert in der Spalte Organization.OrgDbOrgSettings zu überprüfen.

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

}

Massenlöschung leerer Kundenadressdatensätze

Nachdem Sie die Erstellung leerer Adressdatensätze deaktiviert und das Löschen von Adressdatensätzen aktiviert haben, können Sie die folgenden Beispielfunktionen verwenden, um leere customeraddress Datensätze mithilfe der BulkDelete Nachricht asynchron zu löschen.

Diese Funktionen basieren auf den beschreibbaren Spalten/Attributen der Adresse (CustomerAddress) und schließen keine benutzerdefinierten Spalten ein, die sich möglicherweise in Ihrem Umgebung befinden. Möglicherweise möchten Sie diese Abfragen ändern, wenn Sie Ihre benutzerdefinierten Spalten einschließen müssen.

Die statische BulkDeleteEmptyCustomerAddressRecords Methode erstellt einen Systemjob zum Löschen leerer customeradddress Datensätze mithilfe der BulkDeleteRequest-Klasse.

Diese Methode verwendet die in IsDeleteAddressRecordsEnabled Erkennen, ob das Löschen von Adressdatensätzen aktiviert ist IsEmptyAddressRecordCreationDisabled und Erkennen, ob die Erstellung leerer Adressdatensätze deaktiviert ist beschriebenen beispielhaften und statischen Methoden, um sicherzustellen, dass diese Einstellungen so konfiguriert sind, dass das Löschen aller leeren Kundenadressdatensätze zulässig ist und keine neuen erstellt werden.

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

}

Hinweis

Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)

Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).