Dual-write integration for Cross-Company data in D365 Finance and SCM

Dual-write integration for Cross-Company data in D365 Finance and SCM

MCP · Azure DevOpsYour delivery board, readable by an agentMCP · DataverseOne consent, and the data layer opensMCP · Dynamics 365 F&OConnecting F&O to an agent Microsoft hasn’t documented



Dual-write does not work with the cross company data sharing policies in D365 FinOps (there are so many names but I am using this name for reference 😊).

Brief overview about cross company data sharing policy first to set the base for the readers, the Cross-Company data sharing lets you have your data accessible from multiple legal entities (companies in D365 FinOps). For example, if you setup a policy for vendors to be crossed-company then whenever you create a new vendor it will be created in all data sharing legal entities.

https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/sysadmin/cross-company-data-sharing

Now, What happened when you a table under cross-company data sharing (e.g. VendTable) and want to sync vendors through dual-write?

Since, VendTable is one of the data sources for Vendors data entity (dual-write entity map) and we know dual-write does not work well with cross-company data sharing by design. You get following error message when you try to Run the entity map.

"Copying pre-existing data completed with errors.
For additional details, go to initial sync details tab."




The error message is confusing and does not reflect the actual issue behind the scene - you will never be able to figured it out what is wrong until you raise it with MS dual-write team and share the activity Id of the job with them to investigate the telemetry (you don't have access to check this one 😒) then they share the root cause.

However, You can also investigate by putting a breakpoint in method validateDataSharingEnabledForEntityTableBeforDualWriteEnable() of class SysDataSharingValidation.


/// <summary>

Code

    /// Validates that cross company data sharing is not enabled when enabling Dual Write.

    /// </summary>

Code

    /// <param name = "_entityName">The name of the entity containing the table being enabled</param>

Code

    /// <param name = "_tableName">Table in entity</param>

Code

    /// <param name = "_dataAreaId">Company info</param>

Code

    [SubscribesTo(classStr(BusinessEventsRegistrationBase), staticdelegatestr(BusinessEventsRegistrationBase, onTableEnabled))]

Code

    public static void validateDataSharingEnabledForEntityTableBeforDualWriteEnable(str _entityName, str _tableName, DataAreaId _dataAreaId)

    {

Code

        SysDataSharingOrganization sysDataSharingOrganizationTable;

Code

        SysDataSharingRuleEnabled sysDataSharingRuleEnabledTable;

 

X++

        select firstonly SharedTableName from sysDataSharingRuleEnabledTable

Code

                where sysDataSharingRuleEnabledTable.SharedTableName == _tableName

Code

                    join DataSharingPolicy, DataSharingCompany from sysDataSharingOrganizationTable

Code

                         where sysDataSharingRuleEnabledTable.DataSharingPolicy == sysDataSharingOrganizationTable.DataSharingPolicy

Code

                &&  sysDataSharingOrganizationTable.DataSharingCompany == _dataAreaId;

 

        if (sysDataSharingRuleEnabledTable)

        {

X++

            throw error(strFmt("@DataSharing:CrossCompanySharingError", _entityName, sysDataSharingOrganizationTable.DataSharingPolicy));

        }

    }


Previous article← D365FO: 𝙇𝘾𝙎 𝙚𝙭𝙥𝙤𝙧𝙩𝙚𝙙 𝙗𝙖𝙘𝙥𝙖𝙘 𝙁𝙞𝙡𝙚 𝙘𝙤𝙣𝙩𝙖𝙞𝙣𝙨 𝙘𝙤𝙧𝙧𝙪𝙥𝙩𝙚𝙙 𝙙𝙖𝙩𝙖
Discussion

Ask a question or leave feedback

This is a review interaction. The WordPress version will store, thread and moderate comments.

Thanks — submitted for moderation in this review.
Search the whole site · Ctrl/⌘ + K