diff --git a/PROMS/DataLoader/PROMSFixes.Sql b/PROMS/DataLoader/PROMSFixes.Sql index 7b605ef0..dc88e401 100644 --- a/PROMS/DataLoader/PROMSFixes.Sql +++ b/PROMS/DataLoader/PROMSFixes.Sql @@ -20952,6 +20952,80 @@ GO ========================================================================================================== */ +/* +========================================================================================================== + Start: B2022-049 Unlink single procedure for enhanced (if data got corrupted) +========================================================================================================== +*/ +If Exists(SELECT * FROM sys.objects Where name = 'vesp_PurgeProcLinkedItemsAndChildren' AND type in (N'P')) +DROP PROCEDURE [dbo].[vesp_PurgeProcLinkedItemsAndChildren] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +/***************************************************************************** + Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE + Copyright 2022 - Volian Enterprises, Inc. All rights reserved. +*****************************************************************************/ + +Create PROCEDURE [dbo].[vesp_PurgeProcLinkedItemsAndChildren](@EnhanceID int, @EnhType int) + +WITH EXECUTE AS OWNER +AS +BEGIN TRY -- Try Block + BEGIN TRANSACTION + -- Only unlink for the input procedure number & its children. Do not follow the links, i.e. source or enhanced. This + -- can be used for removing link information if the links between the 2, source & enhanced, get corrupted. + declare @Enh1 TABLE + ( + ID int, + xConfig xml + ) + insert into @Enh1 + select CC.ContentID, CC.xConfig from (select *, cast(config as xml) xConfig from Contents) CC + JOIN vefn_ChildItems(@EnhanceID) VCI ON VCI.ContentID = CC.ContentID + cross apply VEFN_GetNewEnhancedData(VCI.itemid,@EnhType) VEN + + Update @Enh1 Set xConfig.modify('delete //Enhanced[@Type=sql:variable("@EnhType")]') From @Enh1 + + Update CC Set Config = cast(xconfig as varchar(max)) From Contents CC + Join @Enh1 EE ON EE.ID = CC.ContentID + + + SELECT [ContentID],[Number],[Text],[Type],[FormatID],[Config],[DTS],[UserID],[LastChanged], + (SELECT COUNT(*) FROM [Details] WHERE [Details].[ContentID]=[Contents].[ContentID]) [DetailCount], + (SELECT COUNT(*) FROM [Entries] WHERE [Entries].[ContentID]=[Contents].[ContentID]) [EntryCount], + (SELECT COUNT(*) FROM [Grids] WHERE [Grids].[ContentID]=[Contents].[ContentID]) [GridCount], + (SELECT COUNT(*) FROM [Images] WHERE [Images].[ContentID]=[Contents].[ContentID]) [ImageCount], + (SELECT COUNT(*) FROM [Items] WHERE [Items].[ContentID]=[Contents].[ContentID]) [ItemCount], + (SELECT COUNT(*) FROM [Parts] WHERE [Parts].[ContentID]=[Contents].[ContentID]) [PartCount], + (SELECT COUNT(*) FROM [RoUsages] WHERE [RoUsages].[ContentID]=[Contents].[ContentID]) [RoUsageCount], + (SELECT COUNT(*) FROM [Transitions] WHERE [Transitions].[FromID]=[Contents].[ContentID]) [TransitionCount], + (SELECT COUNT(*) FROM [ZContents] WHERE [ZContents].[ContentID]=[Contents].[ContentID]) [ZContentCount] + FROM [Contents] where ContentID in (Select ID From @Enh1) + + IF( @@TRANCOUNT > 0 ) COMMIT +END TRY +BEGIN CATCH -- Catch Block + IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level + ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit. Top level will rollback + EXEC vlnErrorHandler +END CATCH +GO + +IF (@@Error = 0) PRINT 'Procedure Creation: [vesp_PurgeProcLinkedItemsAndChildren] Succeeded' +ELSE PRINT 'Procedure Creation: [vesp_PurgeProcLinkedItemsAndChildren] Error on Creation' +GO + +/* +========================================================================================================== + End: B2022-049 Unlink single procedure for enhanced (if data got corrupted) [Version 2.xx] +========================================================================================================== +*/ + ----------------------------------------------------------------------------- /* --------------------------------------------------------------------------- @@ -20986,8 +21060,8 @@ BEGIN TRY -- Try Block DECLARE @RevDate varchar(255) DECLARE @RevDescription varchar(255) - set @RevDate = '07/29/2022 9:00 AM' - set @RevDescription = 'B2022-082: Search not finding occurrences that use bold and underline' + set @RevDate = '08/03/2022 9:00 AM' + set @RevDescription = 'B2022-049 Unlink single procedure for enhanced (if data got corrupted) ' Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription diff --git a/PROMS/VEPROMS User Interface/PROMSFixes.Sql b/PROMS/VEPROMS User Interface/PROMSFixes.Sql index 7b605ef0..dc88e401 100644 --- a/PROMS/VEPROMS User Interface/PROMSFixes.Sql +++ b/PROMS/VEPROMS User Interface/PROMSFixes.Sql @@ -20952,6 +20952,80 @@ GO ========================================================================================================== */ +/* +========================================================================================================== + Start: B2022-049 Unlink single procedure for enhanced (if data got corrupted) +========================================================================================================== +*/ +If Exists(SELECT * FROM sys.objects Where name = 'vesp_PurgeProcLinkedItemsAndChildren' AND type in (N'P')) +DROP PROCEDURE [dbo].[vesp_PurgeProcLinkedItemsAndChildren] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +/***************************************************************************** + Volian Enterprises - Proprietary Information - DO NOT COPY OR DISTRIBUTE + Copyright 2022 - Volian Enterprises, Inc. All rights reserved. +*****************************************************************************/ + +Create PROCEDURE [dbo].[vesp_PurgeProcLinkedItemsAndChildren](@EnhanceID int, @EnhType int) + +WITH EXECUTE AS OWNER +AS +BEGIN TRY -- Try Block + BEGIN TRANSACTION + -- Only unlink for the input procedure number & its children. Do not follow the links, i.e. source or enhanced. This + -- can be used for removing link information if the links between the 2, source & enhanced, get corrupted. + declare @Enh1 TABLE + ( + ID int, + xConfig xml + ) + insert into @Enh1 + select CC.ContentID, CC.xConfig from (select *, cast(config as xml) xConfig from Contents) CC + JOIN vefn_ChildItems(@EnhanceID) VCI ON VCI.ContentID = CC.ContentID + cross apply VEFN_GetNewEnhancedData(VCI.itemid,@EnhType) VEN + + Update @Enh1 Set xConfig.modify('delete //Enhanced[@Type=sql:variable("@EnhType")]') From @Enh1 + + Update CC Set Config = cast(xconfig as varchar(max)) From Contents CC + Join @Enh1 EE ON EE.ID = CC.ContentID + + + SELECT [ContentID],[Number],[Text],[Type],[FormatID],[Config],[DTS],[UserID],[LastChanged], + (SELECT COUNT(*) FROM [Details] WHERE [Details].[ContentID]=[Contents].[ContentID]) [DetailCount], + (SELECT COUNT(*) FROM [Entries] WHERE [Entries].[ContentID]=[Contents].[ContentID]) [EntryCount], + (SELECT COUNT(*) FROM [Grids] WHERE [Grids].[ContentID]=[Contents].[ContentID]) [GridCount], + (SELECT COUNT(*) FROM [Images] WHERE [Images].[ContentID]=[Contents].[ContentID]) [ImageCount], + (SELECT COUNT(*) FROM [Items] WHERE [Items].[ContentID]=[Contents].[ContentID]) [ItemCount], + (SELECT COUNT(*) FROM [Parts] WHERE [Parts].[ContentID]=[Contents].[ContentID]) [PartCount], + (SELECT COUNT(*) FROM [RoUsages] WHERE [RoUsages].[ContentID]=[Contents].[ContentID]) [RoUsageCount], + (SELECT COUNT(*) FROM [Transitions] WHERE [Transitions].[FromID]=[Contents].[ContentID]) [TransitionCount], + (SELECT COUNT(*) FROM [ZContents] WHERE [ZContents].[ContentID]=[Contents].[ContentID]) [ZContentCount] + FROM [Contents] where ContentID in (Select ID From @Enh1) + + IF( @@TRANCOUNT > 0 ) COMMIT +END TRY +BEGIN CATCH -- Catch Block + IF( @@TRANCOUNT = 1 ) ROLLBACK -- Only rollback if top level + ELSE IF( @@TRANCOUNT > 1 ) COMMIT -- Otherwise commit. Top level will rollback + EXEC vlnErrorHandler +END CATCH +GO + +IF (@@Error = 0) PRINT 'Procedure Creation: [vesp_PurgeProcLinkedItemsAndChildren] Succeeded' +ELSE PRINT 'Procedure Creation: [vesp_PurgeProcLinkedItemsAndChildren] Error on Creation' +GO + +/* +========================================================================================================== + End: B2022-049 Unlink single procedure for enhanced (if data got corrupted) [Version 2.xx] +========================================================================================================== +*/ + ----------------------------------------------------------------------------- /* --------------------------------------------------------------------------- @@ -20986,8 +21060,8 @@ BEGIN TRY -- Try Block DECLARE @RevDate varchar(255) DECLARE @RevDescription varchar(255) - set @RevDate = '07/29/2022 9:00 AM' - set @RevDescription = 'B2022-082: Search not finding occurrences that use bold and underline' + set @RevDate = '08/03/2022 9:00 AM' + set @RevDescription = 'B2022-049 Unlink single procedure for enhanced (if data got corrupted) ' Select cast(@RevDate as datetime) RevDate, @RevDescription RevDescription PRINT 'SQL Code Revision ' + @RevDate + ' - ' + @RevDescription diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ContentExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ContentExt.cs index 3ec3e229..af11181a 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ContentExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ContentExt.cs @@ -1718,9 +1718,11 @@ namespace VEPROMS.CSLA.Library [Serializable()] private class EnhancedUnlinkCriteria { - public EnhancedUnlinkCriteria(int? enhancedID) + public EnhancedUnlinkCriteria(int? enhancedID, int? enhType, bool onlyCur) { _EnhancedID = enhancedID; + _EnhType = enhType; + _OnlyCur = onlyCur; } private int? _EnhancedID; public int? EnhancedID @@ -1728,10 +1730,58 @@ namespace VEPROMS.CSLA.Library get { return _EnhancedID; } set { _EnhancedID = value; } } + private int? _EnhType; + public int? EnhType + { + get { return _EnhType; } + set { _EnhType = value; } + } + private bool _OnlyCur; + public bool OnlyCur + { + get { return _OnlyCur; } + set { _OnlyCur = value; } + } } private void DataPortal_Fetch(EnhancedUnlinkCriteria criteria) { + // B2022-049: Copy/paste of enhanced procedure and bad links between source and enhanced. To fix this problem, + // a sql script was added 'vesp_PurgeProcLinkedItemsAndChildren' that only removes link information within the + // input procedure, i.e. does not remove them from linked procedure. + if (criteria.OnlyCur) + { + try + { + using (SqlConnection cn = Database.VEPROMS_SqlConnection) + { + using (SqlCommand cm = cn.CreateCommand()) + { + cm.CommandType = CommandType.StoredProcedure; + cm.CommandText = "vesp_PurgeProcLinkedItemsAndChildren"; + cm.Parameters.AddWithValue("@EnhanceID", criteria.EnhancedID); // note query had 'EnhanceID', not 'EnhancedID' + cm.Parameters.AddWithValue("@EnhType", criteria.EnhType); + cm.CommandTimeout = Database.DefaultTimeout; + using (SafeDataReader dr = new SafeDataReader(cm.ExecuteReader())) + { + IsReadOnly = false; + while (dr.Read()) + { + ContentInfo contentInfo = new ContentInfo(dr); + this.Add(contentInfo); + } + IsReadOnly = true; + } + } + } + } + catch (Exception ex) + { + Database.LogException("EnhancedUnlinkCriteria.DataPortal_Fetch", ex); + throw new DbCslaException("EnhancedUnlinkCriteria.DataPortal_Fetch", ex); + } + return; + } try { using (SqlConnection cn = Database.VEPROMS_SqlConnection) @@ -1762,11 +1812,11 @@ namespace VEPROMS.CSLA.Library } } - public static ContentInfoList DoEnhancedUnlink(int enhancedID) + public static ContentInfoList DoEnhancedUnlink(int enhancedID, int enhType, bool onlyCur) { try { - ContentInfoList tmp = DataPortal.Fetch(new EnhancedUnlinkCriteria(enhancedID)); + ContentInfoList tmp = DataPortal.Fetch(new EnhancedUnlinkCriteria(enhancedID, enhType, onlyCur)); return tmp; } catch (Exception ex) diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs index fc52d69f..3bcb0e61 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ItemExt.cs @@ -2602,11 +2602,13 @@ namespace VEPROMS.CSLA.Library //} #endregion #region UnlinkEnhanced - public void DoUnlinkEnhanced(ItemInfo enhii) + // B2022-049: Copy/paste of enhanced procedure and bad links between source and enhanced + // Add parameters to be passed down to query to only remove links from current procedure + public void DoUnlinkEnhanced(ItemInfo enhii, int enhType, bool onlyCur) { try { - using (ContentInfoList cil = ContentInfoList.DoEnhancedUnlink(enhii.ItemID)) + using (ContentInfoList cil = ContentInfoList.DoEnhancedUnlink(enhii.ItemID, enhType, onlyCur)) { foreach (ContentInfo ci in cil) { @@ -7373,7 +7375,8 @@ namespace VEPROMS.CSLA.Library if (seds != null && seds.Count != 0) { ItemInfo srcItem = ItemInfo.Get(seds[0].ItemID); - if (srcItem.DisplayTextKeepSpecialChars != ii.DisplayTextKeepSpecialChars) + // B2022-049: Copy/paste of enhanced procedure and bad links between source and enhanced. Null reference check + if (srcItem != null && srcItem.DisplayTextKeepSpecialChars != ii.DisplayTextKeepSpecialChars) { if (retiil == null) retiil = new ItemInfoList(ii); else retiil.AddItem(ii); diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ItemInsertExt.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ItemInsertExt.cs index 4f963f72..8a84e18c 100644 --- a/PROMS/VEPROMS.CSLA.Library/Extension/ItemInsertExt.cs +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ItemInsertExt.cs @@ -1474,22 +1474,26 @@ namespace VEPROMS.CSLA.Library // Find hls in enhanced in order to get its notes to set their config to // point back to the new source's note itemid. ItemInfo enhCtItem = null; - while (enhCtItem == null && enhIndxCt < enhHls.Cautions.Count) + // B2022-049: Copy/paste of enhanced procedure and bad links between source and enhanced. Null reference check + if (enhHls.Cautions != null) { - ItemInfo enhTstCaut = enhHls.Cautions[enhIndxCt]; - StepConfig enhTstCautCfg = enhTstCaut.MyConfig as StepConfig; - if (enhTstCautCfg.MyEnhancedDocuments.Count > 0) + while (enhCtItem == null && enhIndxCt < enhHls.Cautions.Count) { - foreach (EnhancedDocument enhCt in enhTstCaut.GetMyEnhancedDocuments()) + ItemInfo enhTstCaut = enhHls.Cautions[enhIndxCt]; + StepConfig enhTstCautCfg = enhTstCaut.MyConfig as StepConfig; + if (enhTstCautCfg.MyEnhancedDocuments.Count > 0) { - if (enhCt.Type == 0) + foreach (EnhancedDocument enhCt in enhTstCaut.GetMyEnhancedDocuments()) { - enhCtItem = enhTstCaut; - break; + if (enhCt.Type == 0) + { + enhCtItem = enhTstCaut; + break; + } } } + if (enhCtItem == null) enhIndxCt++; } - if (enhCtItem == null) enhIndxCt++; } if (enhCtItem != null) { diff --git a/PROMS/Volian.Controls.Library/EditItem.cs b/PROMS/Volian.Controls.Library/EditItem.cs index e3cc8b90..b8fb98a6 100644 --- a/PROMS/Volian.Controls.Library/EditItem.cs +++ b/PROMS/Volian.Controls.Library/EditItem.cs @@ -1686,7 +1686,9 @@ namespace Volian.Controls.Library } public void UnlinkEnhanced(ItemInfo enhII) { - enhII.DoUnlinkEnhanced(enhII); + // B2022-049: Copy/paste of enhanced procedure and bad links between source and enhanced + // Pass in to unlink as before this change + enhII.DoUnlinkEnhanced(enhII, 0, false); SetFocus(); } public ItemInfo AddMissingEnhancedStep(ItemInfo ii, int EnhType) diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.cs b/PROMS/Volian.Controls.Library/StepTabRibbon.cs index 794574b1..63170843 100644 --- a/PROMS/Volian.Controls.Library/StepTabRibbon.cs +++ b/PROMS/Volian.Controls.Library/StepTabRibbon.cs @@ -183,7 +183,9 @@ namespace Volian.Controls.Library if (bi.Name.StartsWith("btnEnhanced")) existingEnhancedButtons.Add(bi.Name); bool inSource = dveds[0].Type != 0; - int buttonsNeeded = inSource ? dveds.Count : (dveds.Count * 2); // enhanced items need unlink button also. + int buttonsNeeded = inSource ? dveds.Count : (dveds.Count * 2); // enhanced items need unlink button also. + // if in view only mode, don't do unlink + if (!inSource && MyEditItem != null && MyEditItem.MyStepPanel.VwMode == E_ViewMode.View) buttonsNeeded--; if (MyItemInfo.IsSection && !MyItemInfo.IsStepSection) buttonsNeeded = 0; // no buttons for word sections if (buttonsNeeded > existingEnhancedButtons.Count) // add buttons { @@ -195,7 +197,8 @@ namespace Volian.Controls.Library biEnhanced.Click += btnEnhancedGoTo_Click; myButtonItem.SubItems.Add(biEnhanced); existingEnhancedButtons.Add(biEnhanced.Name); - if (!inSource) + // if in view only mode, don't do unlink + if (!inSource && MyEditItem != null && MyEditItem.MyStepPanel.VwMode != E_ViewMode.View) { // add unlink buttons: buttonName = string.Format("btnEnhancedUnlink{0}", dved.Type); diff --git a/PROMS/Volian.Controls.Library/vlnTreeView.cs b/PROMS/Volian.Controls.Library/vlnTreeView.cs index cf48beb2..60881566 100644 --- a/PROMS/Volian.Controls.Library/vlnTreeView.cs +++ b/PROMS/Volian.Controls.Library/vlnTreeView.cs @@ -1024,6 +1024,54 @@ namespace Volian.Controls.Library cm.MenuItems.Add("Incoming Transitions", new EventHandler(mi_Click)); } #endregion + #region Menu_UnLinkEnhanced + // B2022-049: provide for way to unlink a procedure from the tree view. Also unlinks procedure if no + // connected (linked) procedure. + if (tn.VEObject is ProcedureInfo) + { + ItemInfo prc = (ItemInfo)tn.VEObject; + if (ui.IsAdministrator() || ui.IsSetAdministrator(prc.MyDocVersion) || ui.IsWriter(prc.MyDocVersion)) + { + DVEnhancedDocuments dveds = prc.MyDocVersion.DocVersionConfig.MyEnhancedDocuments; + EnhancedDocuments eds = prc.GetMyEnhancedDocuments(); + + // if just one link, add single menu item to unlink. If more than one, need a list with all. + if (eds != null && eds.Count == 1) + { + // Get menu string, must start with 'Unlink Source ' + string doclink = null; + doclink = dveds.GetByType(eds[0].Type).Name; // need background/dev if on source + if (eds[0].Type == 0) + { + ItemInfo prl = ItemInfo.Get(eds[0].ItemID); + DVEnhancedDocuments dvedsl = prl.MyDocVersion.DocVersionConfig.MyEnhancedDocuments; + foreach (DVEnhancedDocument dvel in dvedsl) if (dvel.VersionID == prc.MyDocVersion.VersionID) doclink = dvel.Name; + } + doclink = string.Format("Unlink Source and {0} Procedure", doclink); + MenuItem mix = cm.MenuItems.Add(doclink, new EventHandler(miEnhanced_Click)); + mix.Tag = -1; // NOTE this is what flags what gets processed on menu click, i.e. -1 + } + // if this is a source procedure that has enhanced, for example Background and/or deviation, ask which should be unlinked including all + else if (eds != null && eds.Count > 1) + { + MenuItem miu = new MenuItem("Unlink Enhanced Procedure(s) from Source"); + miu.Tag = -2; // this menu item doesn't get used. + int k = 0; + foreach (EnhancedDocument ed in eds) + { + // add submenu item for it + k++; + MenuItem mp = miu.MenuItems.Add(dveds.GetByType(ed.Type).Name, new EventHandler(miEnhanced_Click)); + mp.Tag = k; + } + // add all submenu item + MenuItem mp1 = miu.MenuItems.Add("All", new EventHandler(miEnhanced_Click)); + mp1.Tag = 0; // Tag of 0 flags All + cm.MenuItems.Add(miu); + } + } + } + #endregion #region Menu_Properties // Add Properties to the menu unless at the very 'top' node or on a grouping (partinfo) // node (RNOs, Steps, Cautions, Notes) or at the step level. @@ -1687,6 +1735,73 @@ namespace Volian.Controls.Library } } //end jcb multiunit + private bool CheckForValidEnhLink(ItemInfo prc) // Check if this procedure has valid link + { + EnhancedDocuments eds = prc.GetMyEnhancedDocuments(); + foreach (EnhancedDocument ed in eds) // only unlink those that are selected + { + ItemInfo lprc = ItemInfo.Get(ed.ItemID); + EnhancedDocuments edsl = lprc.GetMyEnhancedDocuments(); + foreach (EnhancedDocument edl in edsl) if (edl.ItemID == prc.ItemID) return true; + } + return false; + } + // B2022-049: Copy/paste of enhanced procedure and bad links between source and enhanced + // Handle menu selection for unlinking the source/enhanced OR if not valid links, just the procedure selected + void miEnhanced_Click(object sender, EventArgs e) + { + MenuItem mi = sender as MenuItem; + VETreeNode tnprc = SelectedNode as VETreeNode; + ItemInfo selprc = tnprc.VEObject as ItemInfo; + EnhancedDocuments seleds = selprc.GetMyEnhancedDocuments(); + // if tag on menu = -1, it is a single document, no need to loop. This can be from either the source or enhanced. + if ((int)mi.Tag == -1) + { + bool hasValidConnectingProc = CheckForValidEnhLink(selprc); + if (FlexibleMessageBox.Show(this, "Do you want to unlink the Enhanced procedure from its Source?", "Confirm Procedure Unlink", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + if (selprc.IsEnhancedProcedure) + { + selprc.DoUnlinkEnhanced(selprc, 0, !hasValidConnectingProc); // if no valid linked: enhtype = 0 since this an enhanced doc is getting unlinked + } + else // from source + { + // if valid connection, make call from the linked enhanced, otherwise just unlink the source only + if (hasValidConnectingProc) + { + ItemInfo lprc = ItemInfo.Get(seleds[0].ItemID); + lprc.DoUnlinkEnhanced(lprc, 0, !hasValidConnectingProc); + } + else + selprc.DoUnlinkEnhanced(selprc, seleds[0].Type, !hasValidConnectingProc); + } + } + } + else + { + // The following code is run if selection made from source. There may be moore than one enhanced, for example background + // and deviation + if (FlexibleMessageBox.Show(this, "Do you want to unlink the selected Enhanced procedure(s) from the Source procedure?", "Confirm Procedure Unlink", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int k = 1; + foreach (EnhancedDocument ed in seleds) // only unlink those that are selected + { + if (k == (int)mi.Tag || (int)mi.Tag == 0) + { + ItemInfo lprc = ItemInfo.Get(ed.ItemID); + bool hasValidConnectingProc = CheckForValidEnhLink(lprc); + // if there is a valid connection, unlink both. Otherwise, just unlink this selected procedure. + if (hasValidConnectingProc) + lprc.DoUnlinkEnhanced(lprc, ed.Type, !hasValidConnectingProc); + else + selprc.DoUnlinkEnhanced(selprc, ed.Type, !hasValidConnectingProc); + } + k++; + } + } + + } + } void mi_Click(object sender, EventArgs e) { MenuItem mi = sender as MenuItem;