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.
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>
/// Validates that cross company data sharing is not enabled when
enabling Dual Write.
/// </summary>
/// <param name = "_entityName">The name of the entity
containing the table being enabled</param>
/// <param name = "_tableName">Table in
entity</param>
/// <param name = "_dataAreaId">Company
info</param>
[SubscribesTo(classStr(BusinessEventsRegistrationBase), staticdelegatestr(BusinessEventsRegistrationBase, onTableEnabled))]
public static void
validateDataSharingEnabledForEntityTableBeforDualWriteEnable(str _entityName, str _tableName, DataAreaId _dataAreaId)
{
SysDataSharingOrganization sysDataSharingOrganizationTable;
SysDataSharingRuleEnabled
sysDataSharingRuleEnabledTable;
select firstonly SharedTableName from sysDataSharingRuleEnabledTable
where
sysDataSharingRuleEnabledTable.SharedTableName == _tableName
join DataSharingPolicy, DataSharingCompany from sysDataSharingOrganizationTable
where sysDataSharingRuleEnabledTable.DataSharingPolicy ==
sysDataSharingOrganizationTable.DataSharingPolicy
&&
sysDataSharingOrganizationTable.DataSharingCompany == _dataAreaId;
if (sysDataSharingRuleEnabledTable)
{
throw
error(strFmt("@DataSharing:CrossCompanySharingError", _entityName,
sysDataSharingOrganizationTable.DataSharingPolicy));
}
}
Comments
Post a Comment
I will appreciate your comments !