From 8a760dae4d76123c61c4f173d084e194d221719e Mon Sep 17 00:00:00 2001 From: Daniel Schick Date: Sun, 13 Nov 2016 04:35:08 +0000 Subject: [PATCH] Implementierung CoreDeleteTool im Zug nach Hamburg --- Stundensheet.xlsx | Bin 24459 -> 24511 bytes nsw/Source/CoreDeleteTool/App.config | 10 +- .../CoreDeleteTool/CoreDeleteTool.csproj | 5 +- nsw/Source/CoreDeleteTool/CoreDeleteTool.sln | 11 +- nsw/Source/CoreDeleteTool/Main.Designer.cs | 24 +++++ nsw/Source/CoreDeleteTool/Main.cs | 55 ++++++++-- nsw/Source/CoreDeleteTool/Main.resx | 3 + .../Properties/Resources.Designer.cs | 42 +++----- .../Properties/Settings.Designer.cs | 2 +- nsw/Source/CoreDeleteTool/PropertyComparer.cs | 50 +++++++++ .../CoreDeleteTool/SortableBindingList.cs | 99 ++++++++++++++++++ nsw/Source/bsmd.database/BPOL.cs | 8 ++ nsw/Source/bsmd.database/DBManager.cs | 21 ++++ nsw/Source/bsmd.database/HAZ.cs | 14 +++ nsw/Source/bsmd.database/ISublistContainer.cs | 4 + nsw/Source/bsmd.database/MDH.cs | 25 +++++ nsw/Source/bsmd.database/Message.cs | 12 +++ nsw/Source/bsmd.database/MessageCore.cs | 10 +- nsw/Source/bsmd.database/NOA_NOD.cs | 8 ++ .../bsmd.database/PortOfCallLast30Days.cs | 8 ++ nsw/Source/bsmd.database/SEC.cs | 10 ++ nsw/Source/bsmd.database/WAS.cs | 13 +++ nsw/Source/bsmd.database/bsmd.database.csproj | 5 +- 23 files changed, 391 insertions(+), 48 deletions(-) create mode 100644 nsw/Source/CoreDeleteTool/PropertyComparer.cs create mode 100644 nsw/Source/CoreDeleteTool/SortableBindingList.cs diff --git a/Stundensheet.xlsx b/Stundensheet.xlsx index 0daca6a22d137e915182e1d6b131ceb37e814054..78c056f73952892400511eda92509e7c1d2533e5 100644 GIT binary patch delta 21242 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

T3bH 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 diff --git a/nsw/Source/CoreDeleteTool/App.config b/nsw/Source/CoreDeleteTool/App.config index e03650e7..c54f737e 100644 --- a/nsw/Source/CoreDeleteTool/App.config +++ b/nsw/Source/CoreDeleteTool/App.config @@ -1,12 +1,12 @@ - + - -

+ +
- + @@ -15,4 +15,4 @@ - \ No newline at end of file + diff --git a/nsw/Source/CoreDeleteTool/CoreDeleteTool.csproj b/nsw/Source/CoreDeleteTool/CoreDeleteTool.csproj index ead1461d..04c3080b 100644 --- a/nsw/Source/CoreDeleteTool/CoreDeleteTool.csproj +++ b/nsw/Source/CoreDeleteTool/CoreDeleteTool.csproj @@ -9,9 +9,10 @@ Properties CoreDeleteTool CoreDeleteTool - v4.5.2 + v4.5 512 true + AnyCPU @@ -63,6 +64,8 @@ + + Main.cs diff --git a/nsw/Source/CoreDeleteTool/CoreDeleteTool.sln b/nsw/Source/CoreDeleteTool/CoreDeleteTool.sln index 9975d6ab..4735f83a 100644 --- a/nsw/Source/CoreDeleteTool/CoreDeleteTool.sln +++ b/nsw/Source/CoreDeleteTool/CoreDeleteTool.sln @@ -1,12 +1,19 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoreDeleteTool", "CoreDeleteTool.csproj", "{45FBE68D-7554-479E-9E24-E3D59FD606CE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "bsmd.database", "..\bsmd.database\bsmd.database.csproj", "{19945AF2-379B-46A5-B27A-303B5EC1D557}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{5D4CFD96-E411-4C63-86A0-8874326C539E}" + ProjectSection(SolutionItems) = preProject + .nuget\NuGet.Config = .nuget\NuGet.Config + .nuget\NuGet.exe = .nuget\NuGet.exe + .nuget\NuGet.targets = .nuget\NuGet.targets + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/nsw/Source/CoreDeleteTool/Main.Designer.cs b/nsw/Source/CoreDeleteTool/Main.Designer.cs index 58196b87..6e58e014 100644 --- a/nsw/Source/CoreDeleteTool/Main.Designer.cs +++ b/nsw/Source/CoreDeleteTool/Main.Designer.cs @@ -28,11 +28,15 @@ /// private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); this.dataGridView = new System.Windows.Forms.DataGridView(); this.buttonClose = new System.Windows.Forms.Button(); this.buttonDelete = new System.Windows.Forms.Button(); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); + this.contextMenuStrip.SuspendLayout(); this.SuspendLayout(); // // dataGridView @@ -44,12 +48,15 @@ | System.Windows.Forms.AnchorStyles.Right))); this.dataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells; this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView.ContextMenuStrip = this.contextMenuStrip; this.dataGridView.Location = new System.Drawing.Point(12, 12); this.dataGridView.MultiSelect = false; this.dataGridView.Name = "dataGridView"; + this.dataGridView.ReadOnly = true; this.dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; this.dataGridView.Size = new System.Drawing.Size(624, 328); this.dataGridView.TabIndex = 0; + this.dataGridView.DataBindingComplete += new System.Windows.Forms.DataGridViewBindingCompleteEventHandler(this.dataGridView_DataBindingComplete); // // buttonClose // @@ -73,6 +80,20 @@ this.buttonDelete.UseVisualStyleBackColor = true; this.buttonDelete.Click += new System.EventHandler(this.buttonDelete_Click); // + // contextMenuStrip + // + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.deleteToolStripMenuItem}); + this.contextMenuStrip.Name = "contextMenuStrip"; + this.contextMenuStrip.Size = new System.Drawing.Size(108, 26); + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.deleteToolStripMenuItem.Text = "Delete"; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.buttonDelete_Click); + // // Main // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -85,6 +106,7 @@ this.Name = "Main"; this.Text = "ENI message core removal tool"; ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); + this.contextMenuStrip.ResumeLayout(false); this.ResumeLayout(false); } @@ -94,6 +116,8 @@ private System.Windows.Forms.DataGridView dataGridView; private System.Windows.Forms.Button buttonClose; private System.Windows.Forms.Button buttonDelete; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; } } diff --git a/nsw/Source/CoreDeleteTool/Main.cs b/nsw/Source/CoreDeleteTool/Main.cs index 3864b078..0f3e9b73 100644 --- a/nsw/Source/CoreDeleteTool/Main.cs +++ b/nsw/Source/CoreDeleteTool/Main.cs @@ -14,7 +14,7 @@ namespace CoreDeleteTool { public partial class Main : Form { - List messageCores = new List(); + SortableBindingList messageCores = new SortableBindingList(); public Main() { @@ -29,10 +29,30 @@ namespace CoreDeleteTool if (DBManager.Instance.Connect(Properties.Settings.Default.ConnectionString)) { - this.messageCores.AddRange(DBManager.Instance.GetMessageCoresByStatus(MessageCore.BSMDStatus.PREPARE)); - } else + foreach (MessageCore mc in DBManager.Instance.GetMessageCoresByStatus(MessageCore.BSMDStatus.PREPARE)) + this.messageCores.Add(mc); + } + else { MessageBox.Show("Cannot connect to database!"); + + // create a dummy cores + MessageCore mc = new MessageCore(); + mc.IMO = "1234567"; + mc.ETA = DateTime.Now; + mc.PoC = "ZZUKN"; + mc.Portname = "Hamburg"; + + this.messageCores.Add(mc); + + mc = new MessageCore(); + mc.IMO = "9999999"; + mc.ETA = DateTime.Now + TimeSpan.FromHours(1); + mc.PoC = "DEBRE"; + mc.Portname = "Bremen"; + + this.messageCores.Add(mc); + } this.dataGridView.DataSource = this.messageCores; @@ -44,18 +64,23 @@ namespace CoreDeleteTool private void buttonDelete_Click(object sender, EventArgs e) { - if(this.dataGridView.SelectedRows.Count > 0) + if ((this.dataGridView.SelectedRows.Count > 0) && DBManager.Instance.IsConnected) { - MessageCore selectedCore = this.dataGridView.SelectedRows[0].DataBoundItem as MessageCore; - if(selectedCore != null) + if (MessageBox.Show("Delete selected item(s)?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) { - if(MessageBox.Show("Delete selected item?", "Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes) + for (int i = 0; i < this.dataGridView.SelectedRows.Count; i++) { - DBManager.Instance.DeleteCore(selectedCore); + MessageCore selectedCore = this.dataGridView.SelectedRows[i].DataBoundItem as MessageCore; + if (selectedCore != null) + { + DBManager.Instance.DeleteCore(selectedCore); + + this.messageCores.Remove(selectedCore); + } } + // TODO:refresh data source? } } - } private void buttonClose_Click(object sender, EventArgs e) @@ -63,8 +88,18 @@ namespace CoreDeleteTool this.Close(); } - #endregion + private void dataGridView_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) + { + foreach (DataGridViewColumn column in dataGridView.Columns) + column.SortMode = DataGridViewColumnSortMode.Automatic; + } + private void menuStripDelete_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + this.buttonDelete_Click(sender, new EventArgs()); + } + + #endregion } } diff --git a/nsw/Source/CoreDeleteTool/Main.resx b/nsw/Source/CoreDeleteTool/Main.resx index bfb063c5..b8a508a8 100644 --- a/nsw/Source/CoreDeleteTool/Main.resx +++ b/nsw/Source/CoreDeleteTool/Main.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 17, 17 + diff --git a/nsw/Source/CoreDeleteTool/Properties/Resources.Designer.cs b/nsw/Source/CoreDeleteTool/Properties/Resources.Designer.cs index 9646eba7..139fb477 100644 --- a/nsw/Source/CoreDeleteTool/Properties/Resources.Designer.cs +++ b/nsw/Source/CoreDeleteTool/Properties/Resources.Designer.cs @@ -8,10 +8,10 @@ // //------------------------------------------------------------------------------ -namespace CoreDeleteTool.Properties -{ - - +namespace CoreDeleteTool.Properties { + using System; + + /// /// A strongly-typed resource class, for looking up localized strings, etc. /// @@ -22,48 +22,40 @@ namespace CoreDeleteTool.Properties [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - + internal class Resources { + private static global::System.Resources.ResourceManager resourceMan; - + private static global::System.Globalization.CultureInfo resourceCulture; - + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { + internal Resources() { } - + /// /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CoreDeleteTool.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; } } - + /// /// Overrides the current thread's CurrentUICulture property for all /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { + internal static global::System.Globalization.CultureInfo Culture { + get { return resourceCulture; } - set - { + set { resourceCulture = value; } } diff --git a/nsw/Source/CoreDeleteTool/Properties/Settings.Designer.cs b/nsw/Source/CoreDeleteTool/Properties/Settings.Designer.cs index 5f17706a..5777101a 100644 --- a/nsw/Source/CoreDeleteTool/Properties/Settings.Designer.cs +++ b/nsw/Source/CoreDeleteTool/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace CoreDeleteTool.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/nsw/Source/CoreDeleteTool/PropertyComparer.cs b/nsw/Source/CoreDeleteTool/PropertyComparer.cs new file mode 100644 index 00000000..92540ff9 --- /dev/null +++ b/nsw/Source/CoreDeleteTool/PropertyComparer.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Reflection; + +// Gratitude:http://betimvwframework.codeplex.com/ + +namespace CoreDeleteTool +{ + public class PropertyComparer : IComparer + { + private readonly IComparer comparer; + private PropertyDescriptor propertyDescriptor; + private int reverse; + + public PropertyComparer(PropertyDescriptor property, ListSortDirection direction) + { + this.propertyDescriptor = property; + Type comparerForPropertyType = typeof(Comparer<>).MakeGenericType(property.PropertyType); + this.comparer = (IComparer)comparerForPropertyType.InvokeMember("Default", BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.Public, null, null, null); + this.SetListSortDirection(direction); + } + + #region IComparer Members + + public int Compare(T x, T y) + { + return this.reverse * this.comparer.Compare(this.propertyDescriptor.GetValue(x), this.propertyDescriptor.GetValue(y)); + } + + #endregion + + private void SetPropertyDescriptor(PropertyDescriptor descriptor) + { + this.propertyDescriptor = descriptor; + } + + private void SetListSortDirection(ListSortDirection direction) + { + this.reverse = direction == ListSortDirection.Ascending ? 1 : -1; + } + + public void SetPropertyAndDirection(PropertyDescriptor descriptor, ListSortDirection direction) + { + this.SetPropertyDescriptor(descriptor); + this.SetListSortDirection(direction); + } + } +} \ No newline at end of file diff --git a/nsw/Source/CoreDeleteTool/SortableBindingList.cs b/nsw/Source/CoreDeleteTool/SortableBindingList.cs new file mode 100644 index 00000000..49191fad --- /dev/null +++ b/nsw/Source/CoreDeleteTool/SortableBindingList.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; + +// Gratitude:http://betimvwframework.codeplex.com/ + +namespace CoreDeleteTool +{ + public class SortableBindingList : BindingList + { + private readonly Dictionary> comparers; + private bool isSorted; + private ListSortDirection listSortDirection; + private PropertyDescriptor propertyDescriptor; + + public SortableBindingList() + : base(new List()) + { + this.comparers = new Dictionary>(); + } + + public SortableBindingList(IEnumerable enumeration) + : base(new List(enumeration)) + { + this.comparers = new Dictionary>(); + } + + protected override bool SupportsSortingCore + { + get { return true; } + } + + protected override bool IsSortedCore + { + get { return this.isSorted; } + } + + protected override PropertyDescriptor SortPropertyCore + { + get { return this.propertyDescriptor; } + } + + protected override ListSortDirection SortDirectionCore + { + get { return this.listSortDirection; } + } + + protected override bool SupportsSearchingCore + { + get { return true; } + } + + protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction) + { + List itemsList = (List)this.Items; + + Type propertyType = property.PropertyType; + PropertyComparer comparer; + if (!this.comparers.TryGetValue(propertyType, out comparer)) + { + comparer = new PropertyComparer(property, direction); + this.comparers.Add(propertyType, comparer); + } + + comparer.SetPropertyAndDirection(property, direction); + itemsList.Sort(comparer); + + this.propertyDescriptor = property; + this.listSortDirection = direction; + this.isSorted = true; + + this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); + } + + protected override void RemoveSortCore() + { + this.isSorted = false; + this.propertyDescriptor = base.SortPropertyCore; + this.listSortDirection = base.SortDirectionCore; + + this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); + } + + protected override int FindCore(PropertyDescriptor property, object key) + { + int count = this.Count; + for (int i = 0; i < count; ++i) + { + T element = this[i]; + if (property.GetValue(element).Equals(key)) + { + return i; + } + } + + return -1; + } + } +} \ No newline at end of file diff --git a/nsw/Source/bsmd.database/BPOL.cs b/nsw/Source/bsmd.database/BPOL.cs index 2997a6b7..40467e76 100644 --- a/nsw/Source/bsmd.database/BPOL.cs +++ b/nsw/Source/bsmd.database/BPOL.cs @@ -118,6 +118,14 @@ namespace bsmd.database } } + public void DeleteElements() + { + foreach(PortOfItinerary poi in this.PortOfItineraries) + { + DBManager.Instance.Delete(poi); + } + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/DBManager.cs b/nsw/Source/bsmd.database/DBManager.cs index 7d8437bc..c5f0a8cf 100644 --- a/nsw/Source/bsmd.database/DBManager.cs +++ b/nsw/Source/bsmd.database/DBManager.cs @@ -80,6 +80,11 @@ namespace bsmd.database this._con.Close(); } + public bool IsConnected + { + get { return (this._con != null) && (this._con.State == ConnectionState.Open); } + } + #endregion #region public helper funcs @@ -364,6 +369,22 @@ namespace bsmd.database } return result; } + + public void DeleteCore(MessageCore messageCore) + { + if(messageCore == null) return; + + foreach(Message message in this.GetMessagesForCore(messageCore, MessageLoad.ALL)) + { + if (message is ISublistContainer) + { + ((ISublistContainer)message).DeleteElements(); + } + this.Delete(message); + } + + this.Delete(messageCore); + } public void Save(DatabaseEntity entity) { diff --git a/nsw/Source/bsmd.database/HAZ.cs b/nsw/Source/bsmd.database/HAZ.cs index e8ed0234..d05fe8c4 100644 --- a/nsw/Source/bsmd.database/HAZ.cs +++ b/nsw/Source/bsmd.database/HAZ.cs @@ -275,6 +275,20 @@ namespace bsmd.database } + public void DeleteElements() + { + foreach (IMDGPosition imdg in this.IMDGPositions) + DBManager.Instance.Delete(imdg); + foreach (IMSBCPosition imsbc in this.IMSBCPositions) + DBManager.Instance.Delete(imsbc); + foreach (IBCPosition ibc in this.IBCPositions) + DBManager.Instance.Delete(ibc); + foreach (IGCPosition igc in this.IGCPositions) + DBManager.Instance.Delete(igc); + foreach (MARPOL_Annex_I_Position marpol in this.MARPOLPositions) + DBManager.Instance.Delete(marpol); + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/ISublistContainer.cs b/nsw/Source/bsmd.database/ISublistContainer.cs index afb43c04..6d213eb4 100644 --- a/nsw/Source/bsmd.database/ISublistContainer.cs +++ b/nsw/Source/bsmd.database/ISublistContainer.cs @@ -28,6 +28,10 @@ namespace bsmd.database /// void SaveElements(); + /// + /// Löscht die untergeordneten Objekte + /// + void DeleteElements(); } /// diff --git a/nsw/Source/bsmd.database/MDH.cs b/nsw/Source/bsmd.database/MDH.cs index f01b5d29..64342e28 100644 --- a/nsw/Source/bsmd.database/MDH.cs +++ b/nsw/Source/bsmd.database/MDH.cs @@ -320,6 +320,31 @@ namespace bsmd.database } } + public void DeleteElements() + { + foreach (PortOfCallLast30Days poc30d in this.PortOfCallLast30Days) + { + ((ISublistContainer)poc30d).DeleteElements(); + DBManager.Instance.Delete(poc30d); + + } + + foreach (SanitaryMeasuresDetail smd in this.SanitaryMeasuresDetails) + { + DBManager.Instance.Delete(smd); + } + + foreach (StowawaysJoiningLocation sjl in this.stowawaysJoiningLocations) + { + DBManager.Instance.Delete(sjl); + } + + foreach (InfectedArea ia in this.InfectedAreas) + { + DBManager.Instance.Delete(ia); + } + } + public SanitaryMeasuresDetail GetSanitaryMeasuresDetailWithIdentifier(string identifier) { foreach (SanitaryMeasuresDetail sd in this.sanitaryMeasuresDetails) diff --git a/nsw/Source/bsmd.database/Message.cs b/nsw/Source/bsmd.database/Message.cs index 72e41333..a5c47958 100644 --- a/nsw/Source/bsmd.database/Message.cs +++ b/nsw/Source/bsmd.database/Message.cs @@ -483,6 +483,18 @@ namespace bsmd.database } } + public void DeleteElements() + { + foreach (DatabaseEntity dbEntity in this.Elements) + { + if (dbEntity is ISublistContainer) + { + ((ISublistContainer)dbEntity).DeleteElements(); + } + DBManager.Instance.Delete(dbEntity); + } + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/MessageCore.cs b/nsw/Source/bsmd.database/MessageCore.cs index 92f5eca5..6c7e6c3b 100644 --- a/nsw/Source/bsmd.database/MessageCore.cs +++ b/nsw/Source/bsmd.database/MessageCore.cs @@ -12,6 +12,8 @@ namespace bsmd.database { private Guid? previous; private Guid? next; + private DateTime? created; + private DateTime? changed; private Guid? customerId; private int? wetris_zz_56_datensatz_id; @@ -111,6 +113,10 @@ namespace bsmd.database public Guid? DefaultReportingPartyId { get; set; } + public DateTime? Changed { get { return this.changed; } } + + public DateTime? Created { get { return this.created; } } + #endregion #region DatabaseEntity implementation @@ -188,7 +194,7 @@ namespace bsmd.database "ETA, CustomerId, Previous, Next, IsTransit, Wetris_zz_56_datensatz_id, BSMDStatus, InitialHIS, " + "HerbergFormGuid, HerbergFormTemplateGuid, HerbergReportType, HerbergEmailContactReportingVessel, " + "HerbergEmail24HrsContact, ETAKielCanal, HerbergRevDate, ReportStatus, SietasSheetVersion, Incoming, " + - "DefaultReportingPartyId FROM {0} ", + "DefaultReportingPartyId, Created, Changed FROM {0} ", this.Tablename); switch (filter) @@ -283,6 +289,8 @@ namespace bsmd.database if (!reader.IsDBNull(23)) core.SietasSheetVersion = reader.GetString(23); if (!reader.IsDBNull(24)) core.Incoming = reader.GetBoolean(24); if (!reader.IsDBNull(25)) core.DefaultReportingPartyId = reader.GetGuid(25); + if (!reader.IsDBNull(26)) core.created = reader.GetDateTime(26); + if (!reader.IsDBNull(27)) core.changed = reader.GetDateTime(27); result.Add(core); } diff --git a/nsw/Source/bsmd.database/NOA_NOD.cs b/nsw/Source/bsmd.database/NOA_NOD.cs index 4ba1060d..1033abec 100644 --- a/nsw/Source/bsmd.database/NOA_NOD.cs +++ b/nsw/Source/bsmd.database/NOA_NOD.cs @@ -163,6 +163,14 @@ namespace bsmd.database } } + public void DeleteElements() + { + foreach (CallPurpose cp in this.CallPurposes) + { + DBManager.Instance.Delete(cp); + } + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/PortOfCallLast30Days.cs b/nsw/Source/bsmd.database/PortOfCallLast30Days.cs index de96e4db..614fbebf 100644 --- a/nsw/Source/bsmd.database/PortOfCallLast30Days.cs +++ b/nsw/Source/bsmd.database/PortOfCallLast30Days.cs @@ -138,6 +138,14 @@ namespace bsmd.database } } + public void DeleteElements() + { + foreach (PortOfCallLast30DaysCrewJoinedShip cjs in this.CrewJoinedShip) + { + DBManager.Instance.Delete(cjs); + } + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/SEC.cs b/nsw/Source/bsmd.database/SEC.cs index 3c0266d3..9d0f9416 100644 --- a/nsw/Source/bsmd.database/SEC.cs +++ b/nsw/Source/bsmd.database/SEC.cs @@ -340,6 +340,16 @@ namespace bsmd.database } + void ISublistContainer.DeleteElements() + { + foreach (LastTenPortFacilitiesCalled l10c in this.LastTenPortFacilitesCalled) + DBManager.Instance.Delete(l10c); + + foreach (ShipToShipActivitiesDuringLastTenPortFacilitiesCalled s2s in this.ShipToShipActivitiesDuringLastTenPortFacilitiesCalled) + DBManager.Instance.Delete(s2s); + + } + #endregion } diff --git a/nsw/Source/bsmd.database/WAS.cs b/nsw/Source/bsmd.database/WAS.cs index ed6bde34..21e19e83 100644 --- a/nsw/Source/bsmd.database/WAS.cs +++ b/nsw/Source/bsmd.database/WAS.cs @@ -160,6 +160,19 @@ namespace bsmd.database } } + public void DeleteElements() + { + foreach (Waste waste in this.Waste) + { + DBManager.Instance.Delete(waste); + } + + foreach (WasteDisposalServiceProvider wdsp in this.WasteDisposalServiceProvider) + { + DBManager.Instance.Delete(wdsp); + } + } + #endregion #region IMessageParagraph implementation diff --git a/nsw/Source/bsmd.database/bsmd.database.csproj b/nsw/Source/bsmd.database/bsmd.database.csproj index d1046e7b..55a8d790 100644 --- a/nsw/Source/bsmd.database/bsmd.database.csproj +++ b/nsw/Source/bsmd.database/bsmd.database.csproj @@ -39,9 +39,8 @@ ..\bsmdKey.snk - - ..\packages\log4net.2.0.5\lib\net45-full\log4net.dll - True + + ..\CoreDeleteTool\packages\log4net.2.0.5\lib\net45-full\log4net.dll