Partilhar via


Resolução de problemas de sincronização ao vivo

Este tópico fornece informações de resolução de problemas para a integração de escrita dupla entre aplicações de Finanças e Operações e o Microsoft Dataverse. Especificamente, fornece informações que podem ajudá-lo a corrigir problemas com a sincronização ao vivo.

Importante

Alguns dos problemas que este tópico aborda podem requerer quer a função de administrador do sistema, quer credenciais de administrador de inquilinos do Azure Active Directory (Azure AD). Cada secção explica se é necessária uma função ou credenciais específicas.

A sincronização ao vivo mostra um erro quando cria uma linha

Pode receber a seguinte mensagem de erro quando criar uma linha numa aplicação de Finanças e Operações:

[{\"erro\":{\"código\":\"0x80072560\","\mensagem\":\"O utilizador não é membro da organização."\"}}], O servidor remoto devolveu um erro: (403) Proibido."}}.

Para corrigir o problema, siga os passos em Requisitos do sistema e pré-requisitos. Para concluir esses passos, os utilizadores de aplicações de escrita dupla que foram criadas no Dataverse têm de ter a função de administrador do sistema. A equipa proprietária predefinida também tem de ter a função de administrador do sistema.

A sincronização ao vivo mostra um erro quando tenta guardar dados de tabela

Função necessária para corrigir o problema: Administrador do sistema

Pode receber a seguinte mensagem de erro quando tenta guardar dados de tabela numa aplicação de Finanças e Operações:

Não é possível guardar as alterações à base de dados. A Unidade de Trabalho não pode consolidar a transação. Não foi possível escrever dados nas UMs da entidade. Falhas nas escritas em UnitOfMeasureEntity com mensagem de erro Não foi possível sincronizar com UMs da entidade.

Para corrigir o problema, certifique-se de que existem os dados de referência pré-requeridos tanto na aplicação de Finanças e Operações, como no Dataverse. Por exemplo, se um registo de cliente pertencer a um grupo de clientes específico, certifique-se de que o registo do grupo de clientes existe no Dataverse.

Se os dados existirem em ambos os locais e tiver confirmado que o problema não está relacionado com dados, siga estes passos.

  1. Abra a entidade DualWriteProjectConfigurationEntity o suplemento do Excel. Para utilizar o suplemento, ative o modo de estrutura no suplemento do Excel de Finanças e Operações e adicione DualWriteProjectConfigurationEntity à folha de cálculo. Para obter mais informações, consulte Ver e atualizar dados da entidade com o Excel.
  2. Selecione e elimine os registos que têm problemas no mapa e no projeto de escrita dupla. Haverá dois registos para cada mapeamento de escrita dupla.
  3. Publique as alterações utilizando o suplemento do Excel. Este passo é importante porque elimina os registos da entidade e das tabelas subjacentes.

Resolver erros de privilégios de leitura ou escrita quando cria dados numa aplicação de Finanças e Operações

Pode receber uma mensagem de erro "Pedido Inválido" quando cria dados numa aplicação de Finanças e Operações.

Exemplo da mensagem de erro Pedido Inválido.

Para corrigir o problema, tem de ativar o privilégio em falta atribuindo a função de segurança correta à equipa das unidades de negócio mapeadas do Dynamics 365 Sales ou do Dynamics 365 Customer Service.

  1. Na aplicação de Finanças e Operações, localize a unidade de negócio que está mapeada no conjunto de ligação à Integração de Dados.

    Mapeamento de organizações.

  2. Na aplicação do Customer Engagement, inicie sessão no ambiente, aceda a Definição > Segurança e procure a equipa da unidade de negócio mapeada.

    Equipa da unidade de negócio mapeada.

  3. Abra a página da equipa para edição e, em seguida, selecione Gerir funções.

    Botão Gerir funções.

  4. Na caixa de diálogo Gerir Funções da Equipa, atribua a função que tem privilégios de leitura/escrita para as tabelas relevantes e, em seguida, selecione OK.

Corrigir problemas de sincronização num ambiente que tenha um ambiente do Dataverse recentemente alterado

Função necessária para corrigir o problema: Administrador do sistema

Pode receber a seguinte mensagem de erro quando criar dados numa aplicação de Finanças e Operações:

{"entityName":"CustCustomerV3Entity","executionStatus":2,"fieldResponses":[],"recordResponses":[{"errorMessage":"Não foi possível gerar payload para a entidade CustCustomerV3Entity","logDateTime":"2019-08-27T18:51:52.5843124Z","verboseError":"Criação de payload falhou com o erro URI Inválido: O URI está vazio."}],"isErrorCountUpdated":true}

Esta é a mensagem de erro na aplicação de Customer Engagement:

Ocorreu um erro inesperado do código ISV. (ErrorType = ClientError) Exceção inesperada do plug-in (Executar): Microsoft.Dynamics.Integrator.DualWriteRuntime.Plugins.PostCommitPlugin: Sistema.Exceção: não foi possível processar conta da entidade - (Uma tentativa de ligação falhou porque a parte ligada não respondeu corretamente após um período de tempo, ou a ligação estabelecida falhou porque o anfitrião ligado não respondeu.

Este erro ocorre se o ambiente do Dataverse for incorretamente reposto quando tenta criar dados na aplicação de Finanças e Operações.

Importante

Se voltou a ligar os ambientes, tem de parar todos os mapas de entidade antes de continuar com os passos de mitigação.

Para corrigir o problema, tem de concluir os passos tanto no Dataverse como na aplicação de Finanças e Operações.

  1. Na aplicação de Finanças e Operações, siga estes passos:

    1. Abra a entidade DualWriteProjectConfigurationEntity o suplemento do Excel. Para utilizar o suplemento, ative o modo de estrutura no suplemento do Excel de Finanças e Operações e adicione DualWriteProjectConfigurationEntity à folha de cálculo. Para obter mais informações, consulte Ver e atualizar dados da entidade com o Excel.
    2. Selecione e elimine os registos que têm problemas no mapa e no projeto de escrita dupla. Haverá dois registos para cada mapeamento de escrita dupla.
    3. Publique as alterações utilizando o suplemento do Excel. Este passo é importante porque elimina os registos da entidade e das tabelas subjacentes.
    4. Para evitar erros quando voltar a ligar ambientes de Finanças e Operações ou do Dataverse, certifique-se de que não restam quaisquer configurações de escrita dupla.
  2. No Dataverse, siga estes passos:

    1. Inicie sessão no seu ambiente do Dataverse (por exemplo, https://*****.crm.dynamics.com/).
    2. Aceda a Definições Avançadas > Localização Avançada.
    3. Selecione Configuração de Runtime de Escrita Dupla.
    4. Selecione a coluna a visualizar.
    5. Selecione Resultados para visualizar as configurações.
    6. Elimine todas as instâncias.
  3. Na aplicação de Finanças e Operações, siga estes passos:

    1. Abra a entidade DualWriteProjectConfigurationEntity o suplemento do Excel. Para utilizar o suplemento, ative o modo de estrutura no suplemento do Excel de Finanças e Operações e adicione DualWriteProjectConfigurationEntity à folha de cálculo. Para obter mais informações, consulte Ver e atualizar dados da entidade com o Excel.
    2. Selecione e elimine os registos que têm problemas no mapa e no projeto de escrita dupla. Haverá dois registos para cada mapeamento de escrita dupla.
    3. Publique as alterações utilizando o suplemento do Excel. Este passo é importante porque elimina os registos da entidade e das tabelas subjacentes.
    4. Para evitar erros quando voltar a ligar ambientes de Finanças e Operações ou do Dataverse, certifique-se de que não restam quaisquer configurações de escrita dupla.

Erro de sincronização ao vivo depois de efetuar uma cópia completa da base de dados

Pode receber a seguinte mensagem de erro depois de executar uma cópia completa da base de dados de um sistema para outro e, em seguida, tentar executar uma operação de base de dados:

A Organização SecureConfig (???) não corresponde à Organização CRM real (???).

A mensagem de erro é mostrada a partir do plug-in de runtime de escrita dupla para assegurar que a configuração de escrita dupla que está configurada num sistema não pode ser utilizada noutro sistema.

Para corrigir o problema, elimine todos os registos da tabela msdyn_dualwriteruntimeconfig depois de restaurar a base de dados. Para obter mais informações, consulte Desassociar e voltar a associar ambientes de escrita dupla.

Problemas de sincronização ao vivo que são causados por sintaxe de filtro de consulta incorreta nos mapas de escrita dupla

Mesmo que a expressão de consulta para um filtro de mapa de escrita dupla esteja sintaticamente correta, pode não funcionar conforme esperado. A expressão do filtro está numa entidade, não numa origem de dados individual de um objeto de consulta. Por conseguinte, a consulta SQL que é gerada não devolve os resultados esperados.

Vejamos um exemplo.

Query entity = PROJECTENTITY
Query expression = (ParentProject == "")

Pode esperar que projetos que não têm elemento principal sejam filtrados. No entanto, o filtro não funciona porque é traduzido para uma consulta que se assemelha ao seguinte exemplo.

SELECT T1.RECID,T1.MODIFIEDDATETIME,T1.RECVERSION,T1.RECID,T1.DIMENSION,
T1.LOCATION,T1.PROJECTCONTROLLER,T1.PROJECTID,T1.PROJECTMANAGER,T1.REFERENCE,
T1.SALESMANAGER,T1.SCHEDULED,T1.RECVERSION#8,T1.RECVERSION#7,
T1.RECVERSION#6,T1.RECVERSION#5,T1.RECVERSION#4,T1.RECVERSION#3,
T1.RECVERSION#2,T1.RECID#8,T1.RECID#7,T1.RECID#6,T1.RECID#5,
T1.RECID#4,T1.RECID#3,T1.RECID#2,T1.PARTITION FROM PROJECTENTITY T1 
WHERE(((((((((((PARTITION=5637144576) AND (DATAAREAID=N'usmf')) AND 
((PARTITION#2=5637144576) OR (PARTITION#2 IS NULL))) AND 
((PARTITION#3=5637144576) OR (PARTITION#3 IS NULL))) AND 
((PARTITION#4=5637144576) OR (PARTITION#4 IS NULL))) AND 
((PARTITION#5=5637144576) OR (PARTITION#5 IS NULL))) AND 
((PARTITION#6=5637144576) OR (PARTITION#6 IS NULL))) AND 
((PARTITION#7=5637144576) OR (PARTITION#7 IS NULL))) AND 
((PARTITION#8=5637144576) OR (PARTITION#8 IS NULL))) AND 
((DATAAREAID#8=N'usmf') OR (DATAAREAID#8 IS NULL))) AND 
(PARENTPROJECT='')) 
ORDER BY T1.PROJECTID

O resultado real é que o campo parentProject é avaliado como null. No entanto, null não é o mesmo que a cadeia vazia. Devido a esta incompatibilidade, o filtro de consulta não devolve resultados válidos.

Para corrigir o problema, siga estes passos.

  1. Adicione uma coluna calculada que pode ser adicionada num modelo de extensão e que é apoiada pela lógica que converte null na cadeia vazia.

    SysComputedColumn::if(SysComputedColumn::isNullExpression(ParentProject), SysComputedColumn::returnLiteral(""), fieldName);
    
  2. Utilize o filtro da nova coluna calculada, em vez da coluna predefinida.

Para avaliar o filtro num ambiente de programação, pode utilizar o código X++ para validar os resultados. Execute este código como um programa autónomo. Pode utilizá-lo para avaliar diferentes tipos de filtros que são aplicáveis a uma entidade antes de utilizar esses filtros em mapas de escrita dupla. A consulta pode ser executada na base de dados para avaliar discrepâncias.

var entityName = "PROJECTENTITY";
var filterExpression = '(ParentProject == "")';
Query query = new Query();
query.literals(NoYes::Yes); 
QueryBuildDataSource qbd = query.addDataSource(tablename2id(entityName));
qbd.addRange(fieldname2id(qbd.table(),identifierStr(RecVersion))).value(filterExpression);
qbd.addSelectionField(fieldname2id(qbd.table(),identifierStr(RecId)));
QueryRun qRun = new QueryRun(query);
// This provides the actual sql statement to execute
var actualSqlStatement = query.getSQLStatement();
while(qRun.next())
{
    var rec = qRun.get(tableName2Id(entityName));
}

Os dados das aplicações de Finanças e Operações não são sincronizados com o Dataverse

Durante a sincronização ao vivo, pode encontrar um problema em que apenas uma parte dos dados é sincronizada a partir de aplicações de Finanças e Operações com o Dataverse, ou em que os dados não são sincronizados de todo.

Nota

Tem de resolver este problema durante a programação.

Antes de começar a corrigir o problema, reveja os seguintes pré-requisitos:

  • Certifique-se de que as alterações personalizadas estão escritas num único âmbito de transação.
  • Os eventos empresariais e a estrutura de escrita dupla não processam operações doinsert(), doUpdate() e recordset(), ou registos onde skipBusinessEvents(true) esteja marcado. Se o seu código estiver dentro destas funções, a escrita dupla não será acionada.
  • Os eventos empresariais têm de ser registados para a origem de dados mapeada. Algumas origens de dados podem utilizar uma associação externa e podem ser marcadas como só de leitura em aplicações de Finanças e Operações. Estas origens de dados não são rastreadas.
  • As alterações só serão acionadas se as modificações estiverem nos campos mapeados. Modificações de campos não mapeados não acionam a escrita dupla.
  • Certifique-se de que as avaliações do filtro fornecem um resultado válido.

Passos da resolução de problemas

  1. Rever mapeamentos de campo na página de administração de escrita dupla. Se um campo não for mapeado a partir de aplicações de Finanças e Operações para o Dataverse, não será rastreado. Por exemplo, na ilustração seguinte, o campo Descrição é rastreado a partir do Dataverse, mas não das aplicações de Finanças e Operações. Alterações nesse campo efetuadas dentro das aplicações de Finanças e Operações não serão rastreadas.

    Campo rastreado.

  2. Determine se a origem de dados é rastreada na definição de eventos empresariais. Por exemplo, na seguinte ilustração, nenhum campo da tabela DefaultDimensionDAVs e tabelas subjacentes serão rastreados quanto a alterações. As origens de dados que utilizam uma associação externa e que estão marcadas como só de leitura não são rastreadas.

    Campo que não é rastreado.

  3. Determine se os campos da tabela mapeada aparecem na tabela BUSINESSEVENTSDEFINITION, como mostrado na ilustração seguinte. Se não encontrar o campo que procura no resultado da consulta, ele não será acionado pela escrita dupla.

    Campo rastreado na tabela.

Cenário de exemplo

Nas aplicações de Finanças e Operações, existe uma atualização do endereço para um registo de contacto, mas a alteração de endereço não é sincronizada com o Dataverse. Este cenário ocorre porque nenhum registo na tabela BusinessEventsDefinition tem a combinação da tabela afetada e da entidade. Especificamente, a tabela LogisticsPostalAddress não é a origem de dados direta para a entidade smmContactpersonCDSV2Entity. A entidade smmContactpersonCDSV2Entity tem smmContactPersonV2Entity como origem de dados e smmContactPersonV2Entity, por sua vez, tem LogisticsPostalAddressBaseEntity como origem de dados. A tabela LogisticsPostalAddress é a origem de dados de LogisticsPostalAddressBaseEntity.

Uma situação semelhante pode ocorrer nalguns padrões não standardizados, como em casos em que a tabela que está a ser modificada em aplicações de Finanças e Operações não está obviamente associada à entidade que a contém. Por exemplo, os dados do endereço principal são calculados na entidade smmContactPersonCDSV2Entity. A estrutura de escrita dupla tenta determinar como uma alteração numa tabela subjacente é mapeada de novo para as entidades. Normalmente, esta abordagem é suficiente. No entanto, nalguns casos a associação é tão complexa que tem de ser específico. Tem de se certificar de que o RecId da tabela relacionada está diretamente disponível na entidade. Em seguida, adicione um método estático para monitorizar a tabela quanto a alterações.

Por exemplo, reveja o método smmContactPersonCDSV2Entity::getEntityDataSourceToFieldMapping(). CustCustomerV3entity e VendVendorV2Entity foram modificadas para processar esta situação.

Para corrigir o problema, siga estes passos.

  1. Adicione um campo PrimaryPostalAddressRecId à entidade smmContactPersonV2Entity. Torne-o interno.

    Campo adicionado à entidade smmContactPersonV2Entity.

  2. Adicione o mesmo campo à entidade smmContactPersonCDSV2Entity.

    Campo adicionado à entidade smmContactPersonCDSV2Entity.

  3. Adicione o seguinte método à classe smmContactPersonCDSV2Entity.

    public static container getEntityDataSourceToFieldMapping(container mapping)
    {
        mapping += [[tablestr(smmContactPersonCDSV2Entity), tablenum(LogisticsPostalAddress), fieldstr(smmContactPersonCDSV2Entity, PrimaryPostalAddressRecId)]];
        return mapping;
    }
    
  4. Sincronize a base de dados e compile a aplicação.

  5. Pare todos os mapas de escrita dupla que são criados na entidade smmContactPersonCDSV2Entity.

  6. Inicie o mapa. Deverá ver a nova tabela (LogisticsPostalAddress neste exemplo) que começou a rastrear utilizando a coluna RefTableName para a linha onde o valor do nome refentityname é igual a smmContactPersonCDSV2Entity na tabela BusinessEventsDefinition.

Erro ao criar um registo onde vários registos são enviados a partir de uma aplicação de Finanças e Operações para o Dataverse no mesmo lote

Para qualquer transação, uma aplicação de Finanças e Operações cria dados num lote e envia-os como lote para o Dataverse. Se forem criados dois registos como parte da mesma transação e se referirem entre si, poderá receber uma mensagem de erro semelhante ao exemplo seguinte na aplicação de Finanças e Operações:

Não é possível escrever dados na entidade aaa_fundingsources. Não é possível procurar ebecsfs_contracts com valores {PC00...}. Não é possível procurar aaa_fundingsources com valores {PC00...}. Escrita em aaa_fundingsources falhou com mensagem de erro Mensagem de exceção: O servidor remoto devolveu um erro: (400) Pedido Inválido.

Para corrigir o problema, crie relações de entidade na aplicação de Finanças e Operações para indicar que as duas entidades estão relacionadas uma com a outra e que os registos relacionados são processados na mesma transação.

Ativar o registo verboso de mensagens de erro

Numa aplicação de Finanças e Operações, pode encontrar erros relacionados com o ambiente do Dataverse. A mensagem de erro pode não conter o texto completo da mensagem ou outros dados relevantes. Para obter mais informações, pode ativar o registo verboso definindo o sinalizador IsDebugMode que está presente na entidade DualWriteProjectConfigurationEntity em todas as configurações de projetos em aplicações de Finanças e Operações.

  1. Abra a entidade DualWriteProjectConfigurationEntity o suplemento do Excel. Para utilizar o suplemento, ative o modo de estrutura no suplemento do Excel de Finanças e Operações e adicione DualWriteProjectConfigurationEntity à folha de cálculo. Para obter mais informações, consulte Ver e atualizar dados da entidade com o Excel.
  2. Defina o sinalizador IsDebugMode como Sim no projeto.
  3. Execute o cenário.
  4. Os registos verbosos estão disponíveis na tabela DualWriteErrorLog. Para procurar dados utilizando o browser da tabela, utilize o seguinte URL: https://XXXaos.cloudax.dynamics.com/?mi=SysTableBrowser&tableName=DualWriteErrorLog.
  5. Para capturar mais registos no modo de depuração, instale a atualização em KB 4595434 (Correção para valores em branco que estão a ser propagados na sincronização ao vivo de escrita dupla).

Erro quando adiciona um endereço para um cliente ou contacto

Pode receber a seguinte mensagem de erro quando tenta adicionar um endereço para um cliente ou contacto em aplicações de Finanças e Operações ou no Dataverse:

Não é possível escrever dados na entidade msdyn_partypostaladdresses.Escrita para DirPartyPostalAddressLocationCDSEntity falhou com mensagem de erro O pedido falhou com o código de estado BadRequest e o código de erro do CDS: 0x80040265 mensagem de resposta: Ocorreu um erro no plug-in. Um registo com os valores de atributo ID de localização já existe. A chave da ID de Localização da chave da entidade requer que este conjunto de atributos contenha valores únicos. Selecione valores únicos e tente novamente.

Para corrigir o problema, instale a versão do pacote de orquestração de escrita dupla (2.2.2.60), para que as chaves na tabela Endereço estejam definidas como mostrado na tabela seguinte.

Propriedade Valor
Nome a Apresentar Chave de Localização
Nome msdyn_locationkey
Campos msdyn_locationid, parentid
Estado Ativo
Tarefa do sistema Em branco

Erro quando adiciona um cliente no Dataverse

Pode receber a seguinte mensagem de erro quando tenta adicionar um cliente no Dataverse:

"RecordError0":"Escrita falhou para entidade Clientes V3 com exceção desconhecida - Registo da parte não encontrado para o tipo de parte 'Organização'"}.

Quando um cliente é criado no Dataverse, é gerado um novo número de parte. A mensagem de erro é mostrada quando o registo do cliente, juntamente com a parte, é sincronizado com as aplicações de Finanças e Operações, mas já existe um registo de cliente que tem um número de parte diferente.

Para corrigir o problema, localize o cliente através da procura de parte. Se o cliente não existir, crie um novo registo de cliente. Se o cliente existir, utilize a parte existente para criar o novo registo de cliente.

Erro ao criar um novo cliente, fornecedor ou contacto no Dataverse

Pode receber a seguinte mensagem de erro quando tenta criar um novo cliente, fornecedor ou contacto no Dataverse:

Não é possível atualizar o tipo de uma parte de 'DirOrganization' para 'DirPerson'; em vez disso, deverá ser executada uma eliminação da parte existente, seguida de uma inserção com o novo tipo.

No Dataverse há uma sequência de números na tabela msdyn_party. Quando uma conta é criada no Dataverse, é criada uma nova parte (por exemplo, Parte-001 do tipo Organização). Estes dados são enviados para a aplicação de Finanças e Operações. Se o ambiente do Dataverse for reposto ou se o ambiente de Finanças e Operações estiver associado a um ambiente diferente do Dataverse, e for criado um novo registo de contacto no Dataverse, é criado um novo valor de parte que começa com Parte-001. Desta vez, o registo de parte que é criado será Parte-001 do tipo Pessoa. Quando estes dados são sincronizados, as aplicações de Finanças e Operações mostram a mensagem de erro anterior, porque o registo de parte Parte-001 do tipo Organização já existe.

Para corrigir o problema, altere a sequência automática de números para o campo msdyn_partynumber da tabela msdyn_party no Dataverse para obter uma sequência automática de números diferente.

Problema de desempenho com mapeamentos de clientes ou contactos

Pode melhorar marginalmente o desempenho da sincronização ao vivo para clientes e contactos, personalizando o método getEntityDataSourceToFieldMapping (na entidade CustCustomerV3Entity) e o método getEntityDataSourceToFieldMapping (na entidade smmContactPersonCDSV2Entity). Estas personalizações reduzem o número de registos na tabela BusinessEventsDefinition. Esta redução do número de registos, por sua vez, reduz o número de eventos que são levantados.

O método getEntityDataSourceToFieldMapping na entidade CustCustomerV3Entity assegura que uma atualização do endereço eletrónico ou do endereço postal do cliente aciona eventos empresariais, de modo que os dados atualizados sejam enviados para o Dataverse. Se não utilizar todos os campos e não precisar da informação em escrita dupla, comente as linhas apropriadas no método. Cada campo e tabela rastreados que são adicionados neste método adicionam um registo na tabela BusinessEventsDefinition para a combinação da tabela rastreada e da entidade rastreada.

public static container getEntityDataSourceToFieldMapping(container mapping)
{
    mapping += [
        [tablestr(DirPartyBaseEntity), tablenum(LogisticsPostalAddress), fieldstr(CustCustomerV3Entity, AddressRecordId)],
        [identifierstr(DirPartyBaseEntity), tablenum(LogisticsElectronicAddress), fieldstr(CustCustomerV3Entity, PrimaryContactURLRecordId)],
        [identifierstr(DirPartyBaseEntity1), tablenum(LogisticsElectronicAddress), fieldstr(CustCustomerV3Entity, PrimaryContactPhoneRecordId)],
        [identifierstr(DirPartyBaseEntity2), tablenum(LogisticsElectronicAddress), fieldstr(CustCustomerV3Entity, PrimaryContactEmailRecordId)],
        [identifierstr(DirPartyBaseEntity3), tablenum(LogisticsElectronicAddress), fieldstr(CustCustomerV3Entity, PrimaryContactFaxRecordId)],
        [identifierstr(DirPartyBaseEntity4), tablenum(DirPartyLocation), fieldstr(CustCustomerV3Entity, DirPartyLocationRecordId)],
        [identifierstr(DirPartyBaseEntity5), tablenum(LogisticsPostalAddress), fieldstr(CustCustomerV3Entity, InvoiceAddressRecordId)],
        [identifierstr(DirPartyBaseEntity6), tablenum(LogisticsPostalAddress), fieldstr(CustCustomerV3Entity, DeliveryAddressRecordId)],
        [identifierStr(DirPartyBaseEntity7), tablenum(DirPartyTable), fieldstr(CustCustomerV3Entity, PartyRecordId)]];
    return mapping;
}

De maneira semelhante, o método getEntityDataSourceToFieldMapping na entidade smmContactPersonCDSV2Entity assegura que qualquer atualização do endereço eletrónico ou do endereço postal do contacto aciona eventos empresariais, de modo que os dados atualizados sejam enviados para o Dataverse. No método, pode comentar as linhas de quaisquer campos que não utilize.

public static container getEntityDataSourceToFieldMapping(container mapping)
{
    mapping += [
        [tablestr(DirPartyBaseEntity), tablenum(LogisticsPostalAddress), fieldstr(smmContactPersonCDSV2Entity, PrimaryPostalAddressRecId)],
        [identifierStr(DirPartyBaseEntity), tablenum(DirPartyTable), fieldstr(smmContactPersonCDSV2Entity, PrimaryAddressLocation)],
        [identifierStr(DirPartyBaseEntity1), tablenum(LogisticsElectronicAddress), fieldstr(smmContactPersonCDSV2Entity, PrimaryContactEmailRecordId)],
        [identifierStr(DirPartyBaseEntity2), tablenum(LogisticsElectronicAddress), fieldstr(smmContactPersonCDSV2Entity, PrimaryContactFaxRecordId)],
        [identifierStr(DirPartyBaseEntity3), tablenum(LogisticsElectronicAddress), fieldstr(smmContactPersonCDSV2Entity, PrimaryContactPhoneRecordId)],
        [identifierStr(DirPartyBaseEntity4), tablenum(LogisticsElectronicAddress), fieldstr(smmContactPersonCDSV2Entity, PrimaryContactFacebookRecordId)],
        [identifierStr(DirPartyBaseEntity5), tablenum(LogisticsElectronicAddress), fieldstr(smmContactPersonCDSV2Entity, PrimaryContactTwitterRecordId)],
        [identifierStr(DirPartyBaseEntity6), tablenum(LogisticsElectronicAddress), fieldstr(smmContactPersonCDSV2Entity, PrimaryContactURLRecordId)],
        [identifierStr(DirPartyBaseEntity7), tablenum(LogisticsElectronicAddress), fieldstr(smmContactPersonCDSV2Entity, PrimaryContactLinkedInRecordId)],
        [identifierStr(DirPartyBaseEntity8), tablenum(LogisticsElectronicAddress), fieldstr(smmContactPersonCDSV2Entity, PrimaryContactTelexRecordId)],
        [identifierStr(DirPartyBaseEntity9), tablenum(DirPartyTable), fieldstr(smmContactPersonCDSV2Entity, PartyRecordId)]];
    return mapping;
}

Depois de atualizar os métodos, siga estes passos.

  1. Sincronize a base de dados e compile a aplicação.
  2. Pare todos os mapas de escrita dupla que são criados nas entidades smmContactPersonCDSV2Entity e CustCustomerV3Entity.
  3. Inicie os mapas. Deverá ver menos registos nas entidades smmContactPersonCDSV2Entity e CustCustomerV3Entity, bem como na tabela BusinessEventsDefinition, e o desempenho poderá melhorar marginalmente.