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