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();
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

View File

@ -8,6 +8,7 @@
xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:p="clr-namespace:ENI2.Properties"
xmlns:local="clr-namespace:ENI2.Controls"
xmlns:db="clr-namespace:bsmd.database;assembly=bsmd.database"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
@ -54,16 +55,29 @@
<local:ENIDataGrid.RowStyle>
<Style TargetType="DataGridRow">
<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>
</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>
</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>
</local:ENIDataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Status" Binding="{Binding Status}" IsReadOnly="True" />
<DataGridTextColumn Header="Col A" Binding="{Binding ColA}" IsReadOnly="True" />
<DataGridTextColumn Header="Col B" Binding="{Binding ColB}" 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
/// </summary>
public partial class MaerskListControl : UserControl
{
{
#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 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
private void PerformSearch()
private async void PerformSearch()
{
this.dataGridPOCores.ItemsSource = null;
this.filteredResult.Clear();
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");
// 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
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)
searchResult.Sort((x, y) => DateTime.Compare(x.ETADisplay ?? DateTime.MaxValue, y.ETADisplay ?? DateTime.MaxValue));
// alles entfernen was keine Maersk Xtra-Data hat (=noch nicht schon einmal importiert wurde)
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.filteredResult.AddRange(searchResult);
}
private string ReadFieldAsString(IExcelDataReader reader, int fieldNum)
@ -248,11 +252,23 @@ namespace ENI2.Controls
// sort
// 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)
{
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);
}
this.dataGridPOCores.Items.Refresh();
}
@ -281,6 +297,29 @@ namespace ENI2.Controls
private void buttonRequestIds_Click(object sender, RoutedEventArgs e)
{
// 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

View File

@ -417,11 +417,11 @@ namespace ENI2.DetailViewControls
mhd.MessageHistories = DBManager.Instance.GetMessageHistories(historyMessage.Id.Value);
mhd.RequestReload += () => this.OnRequestReload(this.Core.Id.Value);
mhd.Show();
}
}
}
private void contextSendMessage(object sender, RoutedEventArgs e)
{
{
MessageBoxResult result = MessageBox.Show(Properties.Resources.textConfirmSend, Properties.Resources.textConfirm, MessageBoxButton.YesNo, MessageBoxImage.Question);
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
// app later
using log4net;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
@ -10,16 +11,13 @@ using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
using log4net;
namespace bsmd.database
{
public static class DBManagerAsync
{
#region Fields
private static ILog _log = LogManager.GetLogger(typeof(DBManagerAsync));
private static readonly SemaphoreSlim _asyncSemaphore = new SemaphoreSlim(1);
private static readonly ILog _log = LogManager.GetLogger(typeof(DBManagerAsync));
#endregion
@ -66,6 +64,24 @@ namespace bsmd.database
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
@ -75,15 +91,13 @@ namespace bsmd.database
internal static async Task<SqlDataReader> PerformCommandAsync(SqlCommand cmd)
{
SqlDataReader reader = null;
// await _asyncSemaphore.WaitAsync();
try
{
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
await connection.OpenAsync();
reader = await cmd.ExecuteReaderAsync();
}
SqlConnection connection = new SqlConnection(ConnectionString);
await connection.OpenAsync();
cmd.Connection = connection;
reader = await cmd.ExecuteReaderAsync();
}
catch (SqlException ex)
{
@ -96,10 +110,6 @@ namespace bsmd.database
_log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
}
}
finally
{
// _asyncSemaphore.Release();
}
return reader;
}
@ -113,6 +123,7 @@ namespace bsmd.database
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
await connection.OpenAsync();
cmd.Connection = connection;
result = await cmd.ExecuteNonQueryAsync();
}
}
@ -139,6 +150,7 @@ namespace bsmd.database
{
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
cmd.Connection = connection;
object r = await cmd.ExecuteScalarAsync();
if (r == null) { result = null; }
else if (r == DBNull.Value) { result = null; }

View File

@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
@ -29,6 +30,26 @@ namespace bsmd.database
#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
/// <summary>
@ -41,9 +62,7 @@ namespace bsmd.database
/// </summary>
public MessageCore Core { get; set; }
public bool HasNoIdea => ColM.IsNullOrEmpty();
public bool IsNextThreeDays => ETA.HasValue && ETA.Value.IsNextXDays(3);
public MDStatus Status { get; set; }
public DateTime? ETA { get; set; }
@ -106,36 +125,56 @@ namespace bsmd.database
{
while (reader.Read())
{
MaerskData 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;
result.Add(md);
result.Add(ReadRowFromReader(reader));
}
reader.Close();
}
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)
{
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)
{
this.PrepareLoadCommand(cmd, filter, false, criteria);
}
public void PrepareLoadCommand(System.Data.IDbCommand cmd, Message.LoadFilter filter, bool joinXtraData, params object[] criteria)
public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria)
{
StringBuilder sb = new StringBuilder("SELECT ");
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);
if(joinXtraData)
{
sb.AppendFormat(" LEFT JOIN XtraData ON [{0}].Id = [XtraData].[ReferenceId] ", this.Tablename);
}
this.SetFilters(sb, cmd, filter, criteria);
bool latestIdSearch = false;
if(filter == Message.LoadFilter.SEARCH_CORE_FILTERS)