Laden korrigiert, Status Enum statt Flags

This commit is contained in:
Daniel Schick 2023-02-13 09:38:42 +01:00
parent 6031b5df94
commit 9f31b3cea4
7 changed files with 171 additions and 79 deletions

View File

@ -60,7 +60,10 @@ namespace ENI2
ResetSplashCreated.WaitOne(); ResetSplashCreated.WaitOne();
base.OnStartup(e); base.OnStartup(e);
// set connectnion string to async loader
DBManagerAsync.ConnectionString = ENI2.Properties.Settings.Default.ConnectionString;
// initialize static / localized lookups from sqlite database // initialize static / localized lookups from sqlite database

View File

@ -8,6 +8,7 @@
xmlns:col="clr-namespace:System.Collections;assembly=mscorlib" xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:p="clr-namespace:ENI2.Properties" xmlns:p="clr-namespace:ENI2.Properties"
xmlns:local="clr-namespace:ENI2.Controls" xmlns:local="clr-namespace:ENI2.Controls"
xmlns:db="clr-namespace:bsmd.database;assembly=bsmd.database"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"> d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources> <UserControl.Resources>
@ -54,16 +55,29 @@
<local:ENIDataGrid.RowStyle> <local:ENIDataGrid.RowStyle>
<Style TargetType="DataGridRow"> <Style TargetType="DataGridRow">
<Style.Triggers> <Style.Triggers>
<DataTrigger Binding="{Binding IsNextThreeDays}" Value="true"> <DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.ID}">
<Setter Property="Background" Value="LightGreen"></Setter> <Setter Property="Background" Value="LightGreen"></Setter>
</DataTrigger> </DataTrigger>
<DataTrigger Binding="{Binding HasNoIdea}" Value="true"> <DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.NO_ID}">
<Setter Property="Background" Value="LightPink"></Setter> <Setter Property="Background" Value="LightPink"></Setter>
</DataTrigger> </DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.UPDATED}">
<Setter Property="Background" Value="LightYellow"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.REQUESTING_ID}">
<Setter Property="Background" Value="Yellow"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.ID_ASSIGNED}">
<Setter Property="Background" Value="GreenYellow"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="{x:Static db:MaerskData+MDStatus.NO_ID_AND_DUE}">
<Setter Property="Background" Value="Red"></Setter>
</DataTrigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
</local:ENIDataGrid.RowStyle> </local:ENIDataGrid.RowStyle>
<DataGrid.Columns> <DataGrid.Columns>
<DataGridTextColumn Header="Status" Binding="{Binding Status}" IsReadOnly="True" />
<DataGridTextColumn Header="Col A" Binding="{Binding ColA}" IsReadOnly="True" /> <DataGridTextColumn Header="Col A" Binding="{Binding ColA}" IsReadOnly="True" />
<DataGridTextColumn Header="Col B" Binding="{Binding ColB}" IsReadOnly="True" /> <DataGridTextColumn Header="Col B" Binding="{Binding ColB}" IsReadOnly="True" />
<DataGridTextColumn Header="Ship. Area" Binding="{Binding ColC}" IsReadOnly="True" /> <DataGridTextColumn Header="Ship. Area" Binding="{Binding ColC}" IsReadOnly="True" />

View File

@ -23,12 +23,10 @@ namespace ENI2.Controls
/// Interaction logic for MaerskListControl.xaml /// Interaction logic for MaerskListControl.xaml
/// </summary> /// </summary>
public partial class MaerskListControl : UserControl public partial class MaerskListControl : UserControl
{ {
#region Fields #region Fields
private List<MessageCore> searchResult = new List<MessageCore>();
private readonly List<MessageCore> filteredResult = new List<MessageCore>();
private readonly ObservableCollection<MaerskData> maerskDataList = new ObservableCollection<MaerskData>(); private readonly ObservableCollection<MaerskData> maerskDataList = new ObservableCollection<MaerskData>();
private const uint MAX_EMPTY_ROWS_ON_IMPORT = 3; // import breaks if more than this count of empty rows have been read private const uint MAX_EMPTY_ROWS_ON_IMPORT = 3; // import breaks if more than this count of empty rows have been read
@ -116,10 +114,8 @@ namespace ENI2.Controls
#region private methods #region private methods
private void PerformSearch() private async void PerformSearch()
{ {
this.dataGridPOCores.ItemsSource = null;
this.filteredResult.Clear();
Dictionary<MessageCore.SearchFilterType, string> filterDict = new Dictionary<MessageCore.SearchFilterType, string>(); Dictionary<MessageCore.SearchFilterType, string> filterDict = new Dictionary<MessageCore.SearchFilterType, string>();
@ -131,17 +127,25 @@ namespace ENI2.Controls
filterDict.Add(MessageCore.SearchFilterType.FILTER_FLAG_EQ, "0"); filterDict.Add(MessageCore.SearchFilterType.FILTER_FLAG_EQ, "0");
// suche auslösen // suche auslösen
this.searchResult = DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).GetMessageCoresWithFilters(filterDict); List<MessageCore> searchResult = DBManager.GetSingleCon(Properties.Settings.Default.ConnectionString).GetMessageCoresWithFilters(filterDict);
// alle anderen Häfen weg // alle anderen Häfen weg
this.searchResult.RemoveAll(item => (item.PoC == null) || (!item.PoC.Equals("DEBRV") && !item.PoC.Equals("DEWHV") && !item.PoC.Equals("DEWVN"))); searchResult.RemoveAll(item => (item.PoC == null) || (!item.PoC.Equals("DEBRV") && !item.PoC.Equals("DEWHV") && !item.PoC.Equals("DEWVN")));
// sortieren nach ETA (kombiniert) // alles entfernen was keine Maersk Xtra-Data hat (=noch nicht schon einmal importiert wurde)
searchResult.Sort((x, y) => DateTime.Compare(x.ETADisplay ?? DateTime.MaxValue, y.ETADisplay ?? DateTime.MaxValue)); foreach(MessageCore core in searchResult)
{
MaerskData md = await DBManagerAsync.LoadMaerskDataForCoreAsync(core.Id.Value);
if(md != null)
{
md.MessageCore = core;
md.MessageCoreId = core.Id.Value;
if(!maerskDataList.Contains(md)) // DatabaseEntity implements IEquatable
this.maerskDataList.Add(md);
}
}
this.dataGridPOCores.SelectedItem = null; this.dataGridPOCores.SelectedItem = null;
this.filteredResult.AddRange(searchResult);
} }
private string ReadFieldAsString(IExcelDataReader reader, int fieldNum) private string ReadFieldAsString(IExcelDataReader reader, int fieldNum)
@ -248,11 +252,23 @@ namespace ENI2.Controls
// sort // sort
// importData.Sort((x, y) => DateTime.Compare(x.ETA ?? DateTime.MaxValue, y.ETA ?? DateTime.MaxValue)); // importData.Sort((x, y) => DateTime.Compare(x.ETA ?? DateTime.MaxValue, y.ETA ?? DateTime.MaxValue));
// merge the result into our grid data source list
// TODO
foreach (MaerskData md in importData) foreach (MaerskData md in importData)
{
md.Status = MaerskData.MDStatus.ID;
if (md.ColM.IsNullOrEmpty())
{
md.Status = MaerskData.MDStatus.NO_ID;
if (md.ETA.HasValue && md.ETA.Value.IsNextXDays(3))
md.Status = MaerskData.MDStatus.NO_ID_AND_DUE;
}
// TODO: check if data has been updated
// TODO: Check if data is already present
maerskDataList.Add(md); maerskDataList.Add(md);
}
this.dataGridPOCores.Items.Refresh(); this.dataGridPOCores.Items.Refresh();
} }
@ -281,6 +297,29 @@ namespace ENI2.Controls
private void buttonRequestIds_Click(object sender, RoutedEventArgs e) private void buttonRequestIds_Click(object sender, RoutedEventArgs e)
{ {
// find all entries from now until 3 days into the future and track parallel requests // find all entries from now until 3 days into the future and track parallel requests
List<MaerskData> requestList = new List<MaerskData>();
foreach (MaerskData md in this.dataGridPOCores.SelectedItems)
{
if ((md.MessageCore != null) || (!md.ColM.IsNullOrEmpty())) continue; // already requested
requestList.Add(md);
md.Status = MaerskData.MDStatus.REQUESTING_ID;
}
if(requestList.Count == 0)
{
MessageBox.Show("No valid rows selected", "Warning", MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
else
{
// Todo:
// 1) create MessageCore and message classes
// 2) request dbh Id
// 3) register watchdog for request completion
}
this.dataGridPOCores.Items.Refresh();
} }
#endregion #endregion

View File

@ -417,11 +417,11 @@ namespace ENI2.DetailViewControls
mhd.MessageHistories = DBManager.Instance.GetMessageHistories(historyMessage.Id.Value); mhd.MessageHistories = DBManager.Instance.GetMessageHistories(historyMessage.Id.Value);
mhd.RequestReload += () => this.OnRequestReload(this.Core.Id.Value); mhd.RequestReload += () => this.OnRequestReload(this.Core.Id.Value);
mhd.Show(); mhd.Show();
} }
} }
private void contextSendMessage(object sender, RoutedEventArgs e) private void contextSendMessage(object sender, RoutedEventArgs e)
{ {
MessageBoxResult result = MessageBox.Show(Properties.Resources.textConfirmSend, Properties.Resources.textConfirm, MessageBoxButton.YesNo, MessageBoxImage.Question); MessageBoxResult result = MessageBox.Show(Properties.Resources.textConfirmSend, Properties.Resources.textConfirm, MessageBoxButton.YesNo, MessageBoxImage.Question);
if (result == MessageBoxResult.Yes) if (result == MessageBoxResult.Yes)
{ {

View File

@ -3,6 +3,7 @@
// connection pooling.. will try it out in Maersk/PO numbers and expand over the whole // connection pooling.. will try it out in Maersk/PO numbers and expand over the whole
// app later // app later
using log4net;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data.SqlClient; using System.Data.SqlClient;
@ -10,16 +11,13 @@ using System.Diagnostics;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using log4net;
namespace bsmd.database namespace bsmd.database
{ {
public static class DBManagerAsync public static class DBManagerAsync
{ {
#region Fields #region Fields
private static ILog _log = LogManager.GetLogger(typeof(DBManagerAsync)); private static readonly ILog _log = LogManager.GetLogger(typeof(DBManagerAsync));
private static readonly SemaphoreSlim _asyncSemaphore = new SemaphoreSlim(1);
#endregion #endregion
@ -66,6 +64,24 @@ namespace bsmd.database
return result; return result;
} }
public static async Task<MaerskData> LoadMaerskDataForCoreAsync(Guid messageCoreId)
{
SqlCommand cmd = new SqlCommand();
MaerskData md = new MaerskData();
md.PrepareLoadCommand(cmd, Message.LoadFilter.BY_CORE, messageCoreId);
SqlDataReader reader = await PerformCommandAsync(cmd);
List<MaerskData> resultList = await md.LoadListAsync(reader);
MaerskData result = null;
if(resultList.Count > 0)
{
if(resultList.Count > 1)
_log.WarnFormat("more than one xtra data found for core id {0}", messageCoreId);
result = resultList[0];
}
return result;
}
#endregion #endregion
#endregion #endregion
@ -75,15 +91,13 @@ namespace bsmd.database
internal static async Task<SqlDataReader> PerformCommandAsync(SqlCommand cmd) internal static async Task<SqlDataReader> PerformCommandAsync(SqlCommand cmd)
{ {
SqlDataReader reader = null; SqlDataReader reader = null;
// await _asyncSemaphore.WaitAsync();
try try
{ {
using (SqlConnection connection = new SqlConnection(ConnectionString)) SqlConnection connection = new SqlConnection(ConnectionString);
{ await connection.OpenAsync();
await connection.OpenAsync(); cmd.Connection = connection;
reader = await cmd.ExecuteReaderAsync(); reader = await cmd.ExecuteReaderAsync();
}
} }
catch (SqlException ex) catch (SqlException ex)
{ {
@ -96,10 +110,6 @@ namespace bsmd.database
_log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value); _log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
} }
} }
finally
{
// _asyncSemaphore.Release();
}
return reader; return reader;
} }
@ -113,6 +123,7 @@ namespace bsmd.database
using (SqlConnection connection = new SqlConnection(ConnectionString)) using (SqlConnection connection = new SqlConnection(ConnectionString))
{ {
await connection.OpenAsync(); await connection.OpenAsync();
cmd.Connection = connection;
result = await cmd.ExecuteNonQueryAsync(); result = await cmd.ExecuteNonQueryAsync();
} }
} }
@ -139,6 +150,7 @@ namespace bsmd.database
{ {
using (SqlConnection connection = new SqlConnection(ConnectionString)) using (SqlConnection connection = new SqlConnection(ConnectionString))
{ {
cmd.Connection = connection;
object r = await cmd.ExecuteScalarAsync(); object r = await cmd.ExecuteScalarAsync();
if (r == null) { result = null; } if (r == null) { result = null; }
else if (r == DBNull.Value) { result = null; } else if (r == DBNull.Value) { result = null; }

View File

@ -3,6 +3,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel;
using System.Data; using System.Data;
using System.Data.SqlClient; using System.Data.SqlClient;
using System.Linq; using System.Linq;
@ -29,6 +30,26 @@ namespace bsmd.database
#endregion #endregion
#region Enums
public enum MDStatus
{
[Description("No id")]
NO_ID,
[Description("Updated")]
UPDATED,
[Description("Requesting id")]
REQUESTING_ID,
[Description("Id assigned")]
ID_ASSIGNED,
[Description("upcoming without id")]
NO_ID_AND_DUE,
[Description("Has id")]
ID
}
#endregion
#region Properties #region Properties
/// <summary> /// <summary>
@ -41,9 +62,7 @@ namespace bsmd.database
/// </summary> /// </summary>
public MessageCore Core { get; set; } public MessageCore Core { get; set; }
public bool HasNoIdea => ColM.IsNullOrEmpty(); public MDStatus Status { get; set; }
public bool IsNextThreeDays => ETA.HasValue && ETA.Value.IsNextXDays(3);
public DateTime? ETA { get; set; } public DateTime? ETA { get; set; }
@ -106,36 +125,56 @@ namespace bsmd.database
{ {
while (reader.Read()) while (reader.Read())
{ {
MaerskData md = new MaerskData(); result.Add(ReadRowFromReader(reader));
md.id = reader.GetGuid(0);
if (!reader.IsDBNull(1)) md.MessageCoreId = reader.GetGuid(1);
if (!reader.IsDBNull(2)) md.ColA = reader.GetString(2);
if (!reader.IsDBNull(3)) md.ColB = reader.GetString(3);
if (!reader.IsDBNull(4)) md.ColC = reader.GetString(4);
if (!reader.IsDBNull(5)) md.ColD = reader.GetString(5);
if (!reader.IsDBNull(6)) md.ColE = reader.GetString(6);
if (!reader.IsDBNull(7)) md.ColF = reader.GetString(7);
if (!reader.IsDBNull(8)) md.ColG = reader.GetString(8);
if (!reader.IsDBNull(9)) md.ColH = reader.GetString(9);
if (!reader.IsDBNull(10)) md.ColI = reader.GetString(10);
if (!reader.IsDBNull(11)) md.ColJ = reader.GetString(11);
if (!reader.IsDBNull(12)) md.ColK = reader.GetString(12);
if (!reader.IsDBNull(13)) md.ColL = reader.GetString(13);
if (!reader.IsDBNull(14)) md.ColM = reader.GetString(14);
if (!reader.IsDBNull(15)) md.Remark = reader.GetString(15);
// try parsing the column to datetime
if (DateTime.TryParse(md.ColK, out DateTime eta))
ETA = eta;
result.Add(md);
} }
reader.Close(); reader.Close();
} }
return result; return result;
} }
public async Task<List<MaerskData>> LoadListAsync(SqlDataReader reader)
{
List<MaerskData> result = new List<MaerskData>();
while (await reader.ReadAsync())
{
result.Add(ReadRowFromReader(reader));
}
reader.Close();
return result;
}
private MaerskData ReadRowFromReader(IDataReader reader)
{
MaerskData md = null;
if (reader != null)
{
md = new MaerskData();
md.id = reader.GetGuid(0);
if (!reader.IsDBNull(1)) md.MessageCoreId = reader.GetGuid(1);
if (!reader.IsDBNull(2)) md.ColA = reader.GetString(2);
if (!reader.IsDBNull(3)) md.ColB = reader.GetString(3);
if (!reader.IsDBNull(4)) md.ColC = reader.GetString(4);
if (!reader.IsDBNull(5)) md.ColD = reader.GetString(5);
if (!reader.IsDBNull(6)) md.ColE = reader.GetString(6);
if (!reader.IsDBNull(7)) md.ColF = reader.GetString(7);
if (!reader.IsDBNull(8)) md.ColG = reader.GetString(8);
if (!reader.IsDBNull(9)) md.ColH = reader.GetString(9);
if (!reader.IsDBNull(10)) md.ColI = reader.GetString(10);
if (!reader.IsDBNull(11)) md.ColJ = reader.GetString(11);
if (!reader.IsDBNull(12)) md.ColK = reader.GetString(12);
if (!reader.IsDBNull(13)) md.ColL = reader.GetString(13);
if (!reader.IsDBNull(14)) md.ColM = reader.GetString(14);
if (!reader.IsDBNull(15)) md.Remark = reader.GetString(15);
// try parsing the column to datetime
if (DateTime.TryParse(md.ColK, out DateTime eta))
ETA = eta;
}
return md;
}
public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria) public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria)
{ {
string query = string.Format("SELECT Id, ReferenceId, Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8, Field9, Field10, Field11, Field12 , Field13, Field14 FROM {0} ", this.Tablename); string query = string.Format("SELECT Id, ReferenceId, Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8, Field9, Field10, Field11, Field12 , Field13, Field14 FROM {0} ", this.Tablename);

View File

@ -466,12 +466,7 @@ namespace bsmd.database
} }
} }
public override void PrepareLoadCommand(System.Data.IDbCommand cmd, Message.LoadFilter filter, params object[] criteria) public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria)
{
this.PrepareLoadCommand(cmd, filter, false, criteria);
}
public void PrepareLoadCommand(System.Data.IDbCommand cmd, Message.LoadFilter filter, bool joinXtraData, params object[] criteria)
{ {
StringBuilder sb = new StringBuilder("SELECT "); StringBuilder sb = new StringBuilder("SELECT ");
if (this.ResultLimit > 0) if (this.ResultLimit > 0)
@ -498,18 +493,8 @@ namespace bsmd.database
} }
} }
if(joinXtraData)
{
sb.Append(", [XtraData].[Id], [XtraData].[Field1], "); // ist das so schlau?
}
sb.AppendFormat(" FROM {0} ", this.Tablename); sb.AppendFormat(" FROM {0} ", this.Tablename);
if(joinXtraData)
{
sb.AppendFormat(" LEFT JOIN XtraData ON [{0}].Id = [XtraData].[ReferenceId] ", this.Tablename);
}
this.SetFilters(sb, cmd, filter, criteria); this.SetFilters(sb, cmd, filter, criteria);
bool latestIdSearch = false; bool latestIdSearch = false;
if(filter == Message.LoadFilter.SEARCH_CORE_FILTERS) if(filter == Message.LoadFilter.SEARCH_CORE_FILTERS)