From 18455700ada751a86886a8cefdb071bd4a76ce71 Mon Sep 17 00:00:00 2001 From: Alexander Drogin <42849285+adrogin@users.noreply.github.com> Date: Tue, 21 May 2024 12:04:32 +0200 Subject: [PATCH] Prevent duplicate record in the Master Data Management - Synchronization Tables list (#26133) Resolves #26105 The loop adding related tables to the synchronization list is triggered before the initial table requested by the user is added, therefore it will be added to the list of related tables if any of the relations points back to the table itself. An additional check is added in the loop precondition to handle this case. Fixes [AB#534785](https://dynamicssmb2.visualstudio.com/1fcb79e7-ab07-432a-a3c6-6cf5a88ba4a5/_workitems/edit/534785) --- Apps/W1/MasterDataManagement/app/app.json | 2 +- .../src/pages/MasterDataSynchTables.Page.al | 11 +++++-- .../src/LibraryMasterDataMgt.Codeunit.al | 7 +++++ .../test library/src/MDMTestTableA.Table.al | 30 +++++++++++++++++++ .../test library/src/MDMTestTableB.Table.al | 25 ++++++++++++++++ .../src/MasterDataMgtSetupTests.Codeunit.al | 19 ++++++++++++ 6 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 Apps/W1/MasterDataManagement/test library/src/MDMTestTableA.Table.al create mode 100644 Apps/W1/MasterDataManagement/test library/src/MDMTestTableB.Table.al diff --git a/Apps/W1/MasterDataManagement/app/app.json b/Apps/W1/MasterDataManagement/app/app.json index 9f80f8cc52..3c24d8b34d 100644 --- a/Apps/W1/MasterDataManagement/app/app.json +++ b/Apps/W1/MasterDataManagement/app/app.json @@ -19,7 +19,7 @@ "name": "_Exclude_Master_Data_Management_Test_Library", "publisher": "Microsoft" } - ], + ], "screenshots": [ ], diff --git a/Apps/W1/MasterDataManagement/app/src/pages/MasterDataSynchTables.Page.al b/Apps/W1/MasterDataManagement/app/src/pages/MasterDataSynchTables.Page.al index 09e105f991..0357b0ceca 100644 --- a/Apps/W1/MasterDataManagement/app/src/pages/MasterDataSynchTables.Page.al +++ b/Apps/W1/MasterDataManagement/app/src/pages/MasterDataSynchTables.Page.al @@ -515,7 +515,12 @@ page 7233 "Master Data Synch. Tables" } } - local procedure FindRelatedTables(var ExistingSynchTableNos: List of [Integer]; var RelatedTablesToAdd: List of [Integer]; var RelatedTablesToAddText: Text; TableId: Integer) + internal procedure FindRelatedTables(var ExistingSynchTableNos: List of [Integer]; var RelatedTablesToAdd: List of [Integer]; var RelatedTablesToAddText: Text; TableId: Integer) + begin + FindRelatedTables(ExistingSynchTableNos, RelatedTablesToAdd, RelatedTablesToAddText, TableId, TableId); + end; + + local procedure FindRelatedTables(var ExistingSynchTableNos: List of [Integer]; var RelatedTablesToAdd: List of [Integer]; var RelatedTablesToAddText: Text; TableId: Integer; TopLevelTableId: Integer) var Field: Record Field; TableMetadata: Record "Table Metadata"; @@ -531,7 +536,7 @@ page 7233 "Master Data Synch. Tables" exit; repeat - if not (ExistingSynchTableNos.Contains(Field.RelationTableNo) or RelatedTablesToAdd.Contains(Field.RelationTableNo)) then + if not ((Field.RelationTableNo = TopLevelTableId) or ExistingSynchTableNos.Contains(Field.RelationTableNo) or RelatedTablesToAdd.Contains(Field.RelationTableNo)) then if TableMetadata.Get(Field.RelationTableNo) then if (TableMetadata.TableType = TableMetadata.TableType::Normal) and TableMetadata.DataPerCompany then begin RecRef.Open(Field.RelationTableNo); @@ -541,7 +546,7 @@ page 7233 "Master Data Synch. Tables" RelatedTablesToAddText := TableMetadata.Name else RelatedTablesToAddText += ', ' + TableMetadata.Name; - FindRelatedTables(ExistingSynchTableNos, RelatedTablesToAdd, RelatedTablesToAddText, Field.RelationTableNo); + FindRelatedTables(ExistingSynchTableNos, RelatedTablesToAdd, RelatedTablesToAddText, Field.RelationTableNo, TopLevelTableId); end; RecRef.Close(); end; diff --git a/Apps/W1/MasterDataManagement/test library/src/LibraryMasterDataMgt.Codeunit.al b/Apps/W1/MasterDataManagement/test library/src/LibraryMasterDataMgt.Codeunit.al index 5517c40915..8ec76df0f8 100644 --- a/Apps/W1/MasterDataManagement/test library/src/LibraryMasterDataMgt.Codeunit.al +++ b/Apps/W1/MasterDataManagement/test library/src/LibraryMasterDataMgt.Codeunit.al @@ -32,6 +32,13 @@ codeunit 139757 "Library - Master Data Mgt." MasterDataMgtSubscribers.HandleOnAfterJobQueueEntryRun(JobQueueEntry); end; + procedure FindRelatedTables(var ExistingSynchTableNos: List of [Integer]; var RelatedTablesToAdd: List of [Integer]; var RelatedTablesToAddText: Text; TableId: Integer) + var + MasterDataSynchTables: Page "Master Data Synch. Tables"; + begin + MasterDataSynchTables.FindRelatedTables(ExistingSynchTableNos, RelatedTablesToAdd, RelatedTablesToAddText, TableId); + end; + var MasterDataMgtSubscribers: Codeunit "Master Data Mgt. Subscribers"; } \ No newline at end of file diff --git a/Apps/W1/MasterDataManagement/test library/src/MDMTestTableA.Table.al b/Apps/W1/MasterDataManagement/test library/src/MDMTestTableA.Table.al new file mode 100644 index 0000000000..5537af2527 --- /dev/null +++ b/Apps/W1/MasterDataManagement/test library/src/MDMTestTableA.Table.al @@ -0,0 +1,30 @@ +table 139757 "MDM Test Table A" +{ + DataClassification = SystemMetadata; + + fields + { + field(1; "Primary Key"; Code[20]) + { + Caption = 'Primary Key'; + } + field(2; "Self-Reference Field"; Code[20]) + { + Caption = 'Self-Reference Field'; + TableRelation = "MDM Test Table A"."Primary Key"; + } + field(3; "TableB Reference"; Code[20]) + { + Caption = 'TableB Reference'; + TableRelation = "MDM Test Table B"."Primary Key"; + } + } + + keys + { + key(PK; "Primary Key") + { + Clustered = true; + } + } +} \ No newline at end of file diff --git a/Apps/W1/MasterDataManagement/test library/src/MDMTestTableB.Table.al b/Apps/W1/MasterDataManagement/test library/src/MDMTestTableB.Table.al new file mode 100644 index 0000000000..e0cc1cbd46 --- /dev/null +++ b/Apps/W1/MasterDataManagement/test library/src/MDMTestTableB.Table.al @@ -0,0 +1,25 @@ +table 139758 "MDM Test Table B" +{ + DataClassification = SystemMetadata; + + fields + { + field(1; "Primary Key"; Code[20]) + { + Caption = 'Primary Key'; + } + field(3; "TableA Reference"; Code[20]) + { + Caption = 'TableA Reference'; + TableRelation = "MDM Test Table A"."Primary Key"; + } + } + + keys + { + key(PK; "Primary Key") + { + Clustered = true; + } + } +} \ No newline at end of file diff --git a/Apps/W1/MasterDataManagement/test/src/MasterDataMgtSetupTests.Codeunit.al b/Apps/W1/MasterDataManagement/test/src/MasterDataMgtSetupTests.Codeunit.al index 532de8a7e5..720dd274b6 100644 --- a/Apps/W1/MasterDataManagement/test/src/MasterDataMgtSetupTests.Codeunit.al +++ b/Apps/W1/MasterDataManagement/test/src/MasterDataMgtSetupTests.Codeunit.al @@ -14,6 +14,7 @@ codeunit 139770 "Master Data Mgt. Setup Tests" LibrarySetupStorage: Codeunit "Library - Setup Storage"; LibraryRandom: Codeunit "Library - Random"; LibraryVariableStorage: Codeunit "Library - Variable Storage"; + LibraryMasterDataMgt: Codeunit "Library - Master Data Mgt."; InitializeHandled: Boolean; [Test] @@ -323,6 +324,24 @@ codeunit 139770 "Master Data Mgt. Setup Tests" Assert.AreEqual(0, MasterDataMgtCoupling.Count(), ''); end; + [Test] + procedure NoDuplicatesAddedToSetupOnSelectingTableWithCyclicReference() + var + SynchTables: List of [Integer]; + RelatedTablesToAdd: List of [Integer]; + TablesToAddText: Text; + IncorrectTablesListErr: Label 'Synchronization tables list is incorrect.'; + begin + // [SCENARIO] When selecting a table that has a self-reference or other reference that create a cycle, duplicate records are not added to the setup list + + Initialize(); + + LibraryMasterDataMgt.FindRelatedTables(SynchTables, RelatedTablesToAdd, TablesToAddText, Database::"MDM Test Table A"); + + Assert.AreEqual(1, RelatedTablesToAdd.Count, IncorrectTablesListErr); + Assert.IsTrue(RelatedTablesToAdd.Contains(Database::"MDM Test Table B"), IncorrectTablesListErr); + end; + local procedure Initialize() var MasterDataManagementSetup: Record "Master Data Management Setup";