WIP, import works now
This commit is contained in:
parent
1ab7641efe
commit
6d07baa4b0
@ -46,20 +46,45 @@
|
||||
<local:BusyControl x:Name="busyControl" Grid.Column="8" />
|
||||
</Grid>
|
||||
<local:ENIDataGrid Grid.Row="1" Margin="2,8,2,2" x:Name="dataGridPOCores" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
|
||||
SelectionMode="Single" AutoGenerateColumns="False" CellEditEnding="dataGridPOCores_CellEditEnding" CanUserAddRows="False">
|
||||
SelectionMode="Extended" AutoGenerateColumns="False" CellEditEnding="dataGridPOCores_CellEditEnding" CanUserAddRows="False">
|
||||
<local:ENIDataGrid.RowStyle>
|
||||
<Style TargetType="DataGridRow">
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding IsNextThreeDays}" Value="true">
|
||||
<Setter Property="Background" Value="LightGreen"></Setter>
|
||||
</DataTrigger>
|
||||
<DataTrigger Binding="{Binding HasNoIdea}" Value="true">
|
||||
<Setter Property="Background" Value="LightPink"></Setter>
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</local:ENIDataGrid.RowStyle>
|
||||
<DataGrid.Columns>
|
||||
<DataGridTextColumn Header="IMO/ENI" Binding="{Binding IMOENIDisplay}" IsReadOnly="True" />
|
||||
<DataGridTextColumn x:Name="gridColumnPONumber" Header="PO number" Binding="{Binding PONumber, Mode=TwoWay}" IsReadOnly="False" />
|
||||
<DataGridComboBoxColumn x:Name="gridColumnGroup" Header="Group" IsReadOnly="False" SelectedValueBinding="{Binding Flags, Mode=TwoWay}"
|
||||
<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" />
|
||||
<DataGridTextColumn Header="Col D" Binding="{Binding ColD}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Name" Binding="{Binding ColE}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="IMO" Binding="{Binding ColF}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Voy-No in" Binding="{Binding ColG}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Voy-No out" Binding="{Binding ColH}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Terminal" Binding="{Binding ColI}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Oper" Binding="{Binding ColJ}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="ETA" Binding="{Binding ColK}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="ETD" Binding="{Binding ColL}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Id" Binding="{Binding ColM}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Remark" Binding="{Binding Remark, Mode=TwoWay}" />
|
||||
|
||||
<!--DataGridTextColumn x:Name="gridColumnPONumber" Header="PO number" Binding="{Binding PONumber, Mode=TwoWay}" IsReadOnly="False" /-->
|
||||
<!--DataGridComboBoxColumn x:Name="gridColumnGroup" Header="Group" IsReadOnly="False" SelectedValueBinding="{Binding Flags, Mode=TwoWay}"
|
||||
ItemsSource="{StaticResource arrList}" DisplayMemberPath="Key" SelectedValuePath="Value">
|
||||
</DataGridComboBoxColumn>
|
||||
<DataGridTextColumn Header="Ship name" Binding="{Binding Shipname}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="ETA" Binding="{Binding ETA_NOA_NOD, StringFormat=\{0:dd.MM.yyyy HH:mm\}, Converter={util:UtcToLocalDateTimeConverter}}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="ETD" Binding="{Binding ETD_NOA_NOD, StringFormat=\{0:dd.MM.yyyy HH:mm\}, Converter={util:UtcToLocalDateTimeConverter}}" IsReadOnly="True" />
|
||||
<DataGridTextColumn x:Name="gridColumnATA" Header="ATA" Binding="{Binding POATA, StringFormat=\{0:dd.MM.yyyy\}, Mode=TwoWay, Converter={util:UtcToLocalDateTimeConverter}}" IsReadOnly="False" />
|
||||
<DataGridTextColumn Header="ATD" Binding="{Binding ATD, StringFormat=\{0:dd.MM.yyyy HH:mm\}, Converter={util:UtcToLocalDateTimeConverter}}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Hafen" Binding="{Binding PortnameDisplay}" IsReadOnly="True" />
|
||||
<DataGridTextColumn Header="Id" Binding="{Binding DisplayId}" IsReadOnly="True" />
|
||||
</DataGridComboBoxColumn-->
|
||||
|
||||
<!--DataGridTextColumn Header="ETA" Binding="{Binding ETA_NOA_NOD, StringFormat=\{0:dd.MM.yyyy HH:mm\}, Converter={util:UtcToLocalDateTimeConverter}}" IsReadOnly="True" /-->
|
||||
|
||||
<!--DataGridTextColumn x:Name="gridColumnATA" Header="ATA" Binding="{Binding POATA, StringFormat=\{0:dd.MM.yyyy\}, Mode=TwoWay, Converter={util:UtcToLocalDateTimeConverter}}" IsReadOnly="False" /-->
|
||||
<!--DataGridTextColumn Header="ATD" Binding="{Binding ATD, StringFormat=\{0:dd.MM.yyyy HH:mm\}, Converter={util:UtcToLocalDateTimeConverter}}" IsReadOnly="True" /-->
|
||||
|
||||
</DataGrid.Columns>
|
||||
</local:ENIDataGrid>
|
||||
</Grid>
|
||||
|
||||
@ -15,6 +15,7 @@ using System.Runtime.InteropServices;
|
||||
|
||||
using bsmd.database;
|
||||
using ExcelDataReader;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
namespace ENI2.Controls
|
||||
{
|
||||
@ -28,6 +29,8 @@ namespace ENI2.Controls
|
||||
|
||||
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
|
||||
|
||||
#endregion
|
||||
|
||||
@ -47,11 +50,12 @@ namespace ENI2.Controls
|
||||
|
||||
private void POList_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
dataGridPOCores.ItemsSource = maerskDataList;
|
||||
}
|
||||
|
||||
private void dataGridPOCores_CellEditEnding(object sender, DataGridCellEditEndingEventArgs e)
|
||||
{
|
||||
/*
|
||||
if (e.EditAction == DataGridEditAction.Commit)
|
||||
{
|
||||
if (e.Column == gridColumnPONumber)
|
||||
@ -105,6 +109,7 @@ namespace ENI2.Controls
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -136,7 +141,22 @@ namespace ENI2.Controls
|
||||
|
||||
this.dataGridPOCores.SelectedItem = null;
|
||||
this.filteredResult.AddRange(searchResult);
|
||||
this.dataGridPOCores.ItemsSource = this.filteredResult;
|
||||
|
||||
}
|
||||
|
||||
private string ReadFieldAsString(IExcelDataReader reader, int fieldNum)
|
||||
{
|
||||
if (fieldNum >= reader.FieldCount) return null;
|
||||
if (reader.GetFieldType(fieldNum) == typeof(string))
|
||||
return reader.GetString(fieldNum).Clean();
|
||||
if (reader.GetFieldType(fieldNum) == typeof(DateTime))
|
||||
return reader.GetDateTime(fieldNum).ToString();
|
||||
if (reader.GetFieldType(fieldNum) == typeof(int))
|
||||
return reader.GetInt32(fieldNum).ToString();
|
||||
if (reader.GetFieldType(fieldNum) == typeof(double))
|
||||
return ((int) reader.GetDouble(fieldNum)).ToString();
|
||||
Type theType = reader.GetFieldType(fieldNum);
|
||||
return null;
|
||||
}
|
||||
|
||||
#endregion
|
||||
@ -160,7 +180,7 @@ namespace ENI2.Controls
|
||||
FileStream stream;
|
||||
try
|
||||
{
|
||||
stream = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read);
|
||||
stream = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -170,40 +190,40 @@ namespace ENI2.Controls
|
||||
|
||||
using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream))
|
||||
{
|
||||
List<MessageCore> importCores = new List<MessageCore>();
|
||||
List<MaerskData> importData = new List<MaerskData>();
|
||||
uint emptyRowCnt = 0;
|
||||
|
||||
try
|
||||
{
|
||||
do
|
||||
while (reader.Read())
|
||||
{
|
||||
while (reader.Read())
|
||||
if (reader.FieldCount < 13)
|
||||
{
|
||||
if (reader.FieldCount < 13)
|
||||
{
|
||||
throw new InvalidDataException("Sheet must have 13 columns of data");
|
||||
}
|
||||
MessageCore core = new MessageCore();
|
||||
if (reader.IsDBNull(0) && reader.IsDBNull(1)) continue;
|
||||
/*
|
||||
if (!reader.IsDBNull(0)) crew.CrewMemberLastName = reader.GetString(0).Clean();
|
||||
|
||||
if (crew.CrewMemberLastName.Equals("Family Name") || (crew.CrewMemberLastName.Trim().Length == 0)) continue;
|
||||
if (!reader.IsDBNull(1)) crew.CrewMemberFirstName = reader.GetString(1).Clean();
|
||||
if (!reader.IsDBNull(2)) crew.CrewMemberGender = GlobalStructures.ParseGender(reader.GetString(2));
|
||||
if (!reader.IsDBNull(3)) crew.CrewMemberDuty = reader.GetString(3).Clean();
|
||||
if (!reader.IsDBNull(4)) crew.CrewMemberNationality = reader.GetString(4).Substring(0, 2).ToUpper();
|
||||
if (!reader.IsDBNull(5)) crew.CrewMemberPlaceOfBirth = reader.GetString(5).Clean();
|
||||
if (!reader.IsDBNull(6)) crew.CrewMemberCountryOfBirth = reader.GetString(6).Substring(0, 2).ToUpper();
|
||||
if (!reader.IsDBNull(7)) crew.CrewMemberDateOfBirth = reader.GetDateTime(7);
|
||||
if (!reader.IsDBNull(8)) crew.CrewMemberIdentityDocumentType = GlobalStructures.ReadIdentityDocumentType(reader.GetString(8));
|
||||
if (!reader.IsDBNull(9)) crew.CrewMemberIdentityDocumentId = this.getValueAsString(reader, 9).Clean();
|
||||
if (!reader.IsDBNull(10)) crew.CrewMemberIdentityDocumentIssuingState = reader.GetString(10).Substring(0, 2).ToUpper();
|
||||
if (!reader.IsDBNull(11)) crew.CrewMemberIdentityDocumentExpiryDate = reader.GetDateTime(11);
|
||||
if (!reader.IsDBNull(12)) crew.CrewMemberVisaNumber = this.getValueAsString(reader, 12).Clean();
|
||||
*/
|
||||
importCores.Add(core);
|
||||
throw new InvalidDataException("Sheet must have 13 columns of data");
|
||||
}
|
||||
} while (reader.NextResult());
|
||||
|
||||
MaerskData md = new MaerskData();
|
||||
md.ColA = ReadFieldAsString(reader, 0);
|
||||
if (!reader.IsDBNull(1)) md.ColB = ReadFieldAsString(reader, 1);
|
||||
if (!reader.IsDBNull(2)) md.ColC = ReadFieldAsString(reader, 2);
|
||||
if (!reader.IsDBNull(3)) md.ColD = ReadFieldAsString(reader, 3);
|
||||
if (!reader.IsDBNull(4)) md.ColE = ReadFieldAsString(reader, 4);
|
||||
if (!reader.IsDBNull(5)) md.ColF = ReadFieldAsString(reader, 5);
|
||||
if (!reader.IsDBNull(6)) md.ColG = ReadFieldAsString(reader, 6);
|
||||
if (!reader.IsDBNull(7)) md.ColH = ReadFieldAsString(reader, 7);
|
||||
if (!reader.IsDBNull(8)) md.ColI = ReadFieldAsString(reader, 8);
|
||||
if (!reader.IsDBNull(9)) md.ColJ = ReadFieldAsString(reader, 9);
|
||||
if (!reader.IsDBNull(10)) { md.ETA = reader.GetDateTime(10); md.ColK = md.ETA.ToString(); }
|
||||
if (!reader.IsDBNull(11)) md.ColL = ReadFieldAsString(reader, 11);
|
||||
if (!reader.IsDBNull(12)) md.ColM = ReadFieldAsString(reader, 12);
|
||||
if (!reader.IsDBNull(13)) md.Remark = ReadFieldAsString(reader, 13);
|
||||
|
||||
if (!md.ColF.IsNullOrEmpty()) // only add this if IMO is set
|
||||
importData.Add(md);
|
||||
else
|
||||
emptyRowCnt++;
|
||||
if (emptyRowCnt > MAX_EMPTY_ROWS_ON_IMPORT) break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -211,11 +231,21 @@ namespace ENI2.Controls
|
||||
}
|
||||
|
||||
// we only want cores for the next 3 days
|
||||
if (importCores.Count > 0)
|
||||
if (importData.Count > 0)
|
||||
{
|
||||
|
||||
// TODO: find matching message cores..
|
||||
|
||||
}
|
||||
|
||||
// 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)
|
||||
maerskDataList.Add(md);
|
||||
this.dataGridPOCores.Items.Refresh();
|
||||
}
|
||||
|
||||
stream.Close();
|
||||
|
||||
30
SQL/table.XtraData.eni.7.9.sql
Normal file
30
SQL/table.XtraData.eni.7.9.sql
Normal file
@ -0,0 +1,30 @@
|
||||
CREATE TABLE [dbo].[XtraData]
|
||||
(
|
||||
[Id] UNIQUEIDENTIFIER NOT NULL PRIMARY KEY,
|
||||
[ParentId] UNIQUEIDENTIFIER NULL,
|
||||
[ReferenceId] UNIQUEIDENTIFIER NOT NULL,
|
||||
[Field1] NVARCHAR(100) NULL,
|
||||
[Field2] NVARCHAR(100) NULL,
|
||||
[Field3] NVARCHAR(100) NULL,
|
||||
[Field4] NVARCHAR(100) NULL,
|
||||
[Field5] NVARCHAR(100) NULL,
|
||||
[Field6] NVARCHAR(100) NULL,
|
||||
[Field7] NVARCHAR(100) NULL,
|
||||
[Field8] NVARCHAR(100) NULL,
|
||||
[Field9] NVARCHAR(100) NULL,
|
||||
[Field10] NVARCHAR(100) NULL,
|
||||
[Field11] NVARCHAR(100) NULL,
|
||||
[Field12] NVARCHAR(100) NULL,
|
||||
[Field13] NVARCHAR(100) NULL,
|
||||
[Field14] NVARCHAR(100) NULL,
|
||||
[Field15] NVARCHAR(100) NULL,
|
||||
[Field16] NVARCHAR(100) NULL,
|
||||
[Field17] NVARCHAR(100) NULL,
|
||||
[Field18] NVARCHAR(100) NULL,
|
||||
[Field19] NVARCHAR(100) NULL,
|
||||
[Field20] NVARCHAR(100) NULL
|
||||
)
|
||||
|
||||
GO
|
||||
|
||||
CREATE INDEX [IX_XtraData_RefId] ON [dbo].[XtraData] ([ReferenceId])
|
||||
@ -34,7 +34,6 @@ namespace bsmd.database
|
||||
private bool _closeConnectionAfterUse = false;
|
||||
private readonly List<string> truncatedFieldCollection = new List<string>();
|
||||
private Dictionary<Type, string> messageHistoryTypeDict;
|
||||
private readonly SemaphoreSlim _asyncSemaphore = new SemaphoreSlim(1);
|
||||
|
||||
#endregion
|
||||
|
||||
@ -804,13 +803,6 @@ namespace bsmd.database
|
||||
this.Connect(this.ConnectionString);
|
||||
}
|
||||
|
||||
private async Task CheckConnectionAsync()
|
||||
{
|
||||
if ((this._con == null) ||
|
||||
(this._con.State == ConnectionState.Closed))
|
||||
await this.ConnectAsync(this.ConnectionString);
|
||||
}
|
||||
|
||||
private void LogNonQueryResult(string query, int queryResult)
|
||||
{
|
||||
switch (queryResult)
|
||||
@ -1690,40 +1682,6 @@ namespace bsmd.database
|
||||
|
||||
#endregion
|
||||
|
||||
#region async DB access methods
|
||||
|
||||
internal async Task<SqlDataReader> PerformCommandAsync(SqlCommand cmd)
|
||||
{
|
||||
SqlDataReader reader = null;
|
||||
|
||||
await _asyncSemaphore.WaitAsync();
|
||||
try
|
||||
{
|
||||
await this.CheckConnectionAsync();
|
||||
cmd.Connection = this._con;
|
||||
reader = await cmd.ExecuteReaderAsync();
|
||||
}
|
||||
catch (SqlException ex)
|
||||
{
|
||||
Trace.WriteLine("SQL Exception:" + ex.Message);
|
||||
_log.Error("Error performing command", ex);
|
||||
_log.DebugFormat("Query: {0}", cmd.CommandText);
|
||||
_log.Debug("Parameters:");
|
||||
for (int i = 0; i < cmd.Parameters.Count; i++)
|
||||
{
|
||||
_log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_asyncSemaphore.Release();
|
||||
}
|
||||
|
||||
return reader;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
134
bsmd.database/DBManagerAsync.cs
Normal file
134
bsmd.database/DBManagerAsync.cs
Normal file
@ -0,0 +1,134 @@
|
||||
// Copyright (c) 2020-present schick Informatik
|
||||
// Description: The new and mighty DB manager that uses async methods and
|
||||
// connection pooling.. will try it out in Maersk/PO numbers and expand over the whole
|
||||
// app later
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
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);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
public static string ConnectionString { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region public methods
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region async DB access methods
|
||||
|
||||
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
catch (SqlException ex)
|
||||
{
|
||||
Trace.WriteLine("SQL Exception:" + ex.Message);
|
||||
_log.Error("Error performing command", ex);
|
||||
_log.DebugFormat("Query: {0}", cmd.CommandText);
|
||||
_log.Debug("Parameters:");
|
||||
for (int i = 0; i < cmd.Parameters.Count; i++)
|
||||
{
|
||||
_log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
// _asyncSemaphore.Release();
|
||||
}
|
||||
|
||||
return reader;
|
||||
}
|
||||
|
||||
internal static async Task<int> PerformNonQuery(SqlCommand cmd)
|
||||
{
|
||||
int result = -1;
|
||||
// await _asyncSemaphore.WaitAsync();
|
||||
try
|
||||
{
|
||||
using (SqlConnection connection = new SqlConnection(ConnectionString))
|
||||
{
|
||||
await connection.OpenAsync();
|
||||
result = await cmd.ExecuteNonQueryAsync();
|
||||
}
|
||||
}
|
||||
catch (SqlException ex)
|
||||
{
|
||||
Trace.WriteLine("SQL Exception:" + ex.Message);
|
||||
_log.Error("Error performing command", ex);
|
||||
_log.DebugFormat("Query: {0}", cmd.CommandText);
|
||||
_log.Debug("Parameters:");
|
||||
for (int i = 0; i < cmd.Parameters.Count; i++)
|
||||
{
|
||||
_log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
internal static async Task<int?> PerformReadIntQuery(SqlCommand cmd)
|
||||
{
|
||||
int? result = null;
|
||||
|
||||
try
|
||||
{
|
||||
using (SqlConnection connection = new SqlConnection(ConnectionString))
|
||||
{
|
||||
object r = await cmd.ExecuteScalarAsync();
|
||||
if (r == null) { result = null; }
|
||||
else if (r == DBNull.Value) { result = null; }
|
||||
else { result = (int)r; }
|
||||
}
|
||||
}
|
||||
catch (SqlException ex)
|
||||
{
|
||||
_log.Error("Error performing command", ex);
|
||||
_log.DebugFormat("Query: {0}", cmd.CommandText);
|
||||
_log.Debug("Parameters:");
|
||||
for (int i = 0; i < cmd.Parameters.Count; i++)
|
||||
{
|
||||
_log.DebugFormat("{0}:{1}", cmd.Parameters[i].ParameterName, cmd.Parameters[i].Value);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
@ -121,7 +121,17 @@ namespace bsmd.database
|
||||
|
||||
public static bool IsTimeEmpty(this DateTime datetime)
|
||||
{
|
||||
return ((datetime.Hour == 0) && (datetime.Minute == 0) && (datetime.Second == 0));
|
||||
return (datetime.Hour == 0) && (datetime.Minute == 0) && (datetime.Second == 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns true if the date is between now and numDays in the future (or past, if numDays is negative)
|
||||
/// </summary>
|
||||
public static bool IsNextXDays(this DateTime datetime, int numDays)
|
||||
{
|
||||
double diff = (datetime - DateTime.Now).TotalDays;
|
||||
if (numDays >= 0) return diff < numDays && diff > 0;
|
||||
else return diff < numDays && diff < 0;
|
||||
}
|
||||
|
||||
public static double? TryParseDouble(string text)
|
||||
|
||||
198
bsmd.database/MaerskData.cs
Normal file
198
bsmd.database/MaerskData.cs
Normal file
@ -0,0 +1,198 @@
|
||||
// Copyright (c) 2020-present schick Informatik
|
||||
// Description:
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace bsmd.database
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// Extra balcony: Data stored in Maersk Excel sheets must be stored to be exported
|
||||
/// at a later date. In order to do that (and to be a little more flexible in the future)
|
||||
/// we use a generic storage class called "XtraData" that hopefully might be useful in another
|
||||
/// future scenario as well
|
||||
/// </summary>
|
||||
public class MaerskData : DatabaseEntity
|
||||
{
|
||||
|
||||
#region Construction
|
||||
public MaerskData()
|
||||
{
|
||||
this.tablename = "[dbo].[MaerskData]";
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Properties
|
||||
|
||||
/// <summary>
|
||||
/// reference id as set in the database
|
||||
/// </summary>
|
||||
public Guid MessageCoreId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Core instance reference once matched / set
|
||||
/// </summary>
|
||||
public MessageCore Core { get; set; }
|
||||
|
||||
public bool HasNoIdea => ColM.IsNullOrEmpty();
|
||||
|
||||
public bool IsNextThreeDays => ETA.HasValue && ETA.Value.IsNextXDays(3);
|
||||
|
||||
public DateTime? ETA { get; set; }
|
||||
|
||||
public string ColA { get; set; }
|
||||
|
||||
public string ColB { get; set; }
|
||||
/// <summary>
|
||||
/// Shipping area?
|
||||
/// </summary>
|
||||
public string ColC { get; set; }
|
||||
|
||||
public string ColD { get; set; }
|
||||
/// <summary>
|
||||
/// Vessel name
|
||||
/// </summary>
|
||||
public string ColE { get; set; }
|
||||
/// <summary>
|
||||
/// IMO
|
||||
/// </summary>
|
||||
public string ColF { get; set; }
|
||||
/// <summary>
|
||||
/// Voyage-No incoming
|
||||
/// </summary>
|
||||
public string ColG { get; set; }
|
||||
/// <summary>
|
||||
/// Voyage-No outgoing
|
||||
/// </summary>
|
||||
public string ColH { get; set; }
|
||||
/// <summary>
|
||||
/// Terminal
|
||||
/// </summary>
|
||||
public string ColI { get; set; }
|
||||
/// <summary>
|
||||
/// Operator
|
||||
/// </summary>
|
||||
public string ColJ { get; set; }
|
||||
/// <summary>
|
||||
/// ETA
|
||||
/// </summary>
|
||||
public string ColK { get; set; }
|
||||
/// <summary>
|
||||
/// ETD
|
||||
/// </summary>
|
||||
public string ColL { get; set; }
|
||||
/// <summary>
|
||||
/// Visit-Id
|
||||
/// </summary>
|
||||
public string ColM { get; set; }
|
||||
|
||||
public string Remark { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region abstract DatabaseEntity method implementation
|
||||
|
||||
public override List<DatabaseEntity> LoadList(IDataReader reader)
|
||||
{
|
||||
List<DatabaseEntity> result = new List<DatabaseEntity>();
|
||||
if (reader != null)
|
||||
{
|
||||
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);
|
||||
}
|
||||
reader.Close();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
switch (filter)
|
||||
{
|
||||
case Message.LoadFilter.BY_ID:
|
||||
query += " WHERE Id = @ID";
|
||||
((SqlCommand)cmd).Parameters.AddWithValue("@ID", criteria[0]);
|
||||
break;
|
||||
case Message.LoadFilter.BY_CORE:
|
||||
query += " WHERE ReferenceId = @ID";
|
||||
((SqlCommand)cmd).Parameters.AddWithValue("@ID", criteria[0]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
cmd.CommandText = query;
|
||||
}
|
||||
|
||||
public override void PrepareSave(IDbCommand cmd)
|
||||
{
|
||||
SqlCommand scmd = cmd as SqlCommand;
|
||||
|
||||
scmd.Parameters.AddWithNullableValue("@REF", this.MessageCoreId);
|
||||
scmd.Parameters.AddWithNullableValue("@COLA", this.ColA);
|
||||
scmd.Parameters.AddWithNullableValue("@COLB", this.ColB);
|
||||
scmd.Parameters.AddWithNullableValue("@COLC", this.ColC);
|
||||
scmd.Parameters.AddWithNullableValue("@COLD", this.ColD);
|
||||
scmd.Parameters.AddWithNullableValue("@COLE", this.ColE);
|
||||
scmd.Parameters.AddWithNullableValue("@COLF", this.ColF);
|
||||
scmd.Parameters.AddWithNullableValue("@COLG", this.ColG);
|
||||
scmd.Parameters.AddWithNullableValue("@COLH", this.ColH);
|
||||
scmd.Parameters.AddWithNullableValue("@COLI", this.ColI);
|
||||
scmd.Parameters.AddWithNullableValue("@COLJ", this.ColJ);
|
||||
scmd.Parameters.AddWithNullableValue("@COLK", this.ColK);
|
||||
scmd.Parameters.AddWithNullableValue("@COLL", this.ColL);
|
||||
scmd.Parameters.AddWithNullableValue("@COLM", this.ColM);
|
||||
scmd.Parameters.AddWithNullableValue("@REMARK", this.Remark);
|
||||
|
||||
if (this.IsNew)
|
||||
{
|
||||
this.CreateId();
|
||||
scmd.Parameters.AddWithValue("@ID", this.Id);
|
||||
scmd.CommandText = string.Format("INSERT INTO {0} (Id, ReferenceId, Field1, Field2, Field3, Field4, Field5, Field6, Field7, Field8, Field9, Field10, Field11, Field12, Field13, Field14) " +
|
||||
"VALUES (@ID, @REF, @COLA, @COLB, @COLC, @COLD, @COLE, @COLF, @COLG, @COLH, @COLI, @COLJ, @COLK, @COLL, @COLM, @REMARK)", this.Tablename);
|
||||
}
|
||||
else
|
||||
{
|
||||
scmd.Parameters.AddWithValue("@ID", this.Id);
|
||||
scmd.CommandText = string.Format("UPDATE {0} SET Field1 = @COLA, Field2 = @COLB, Field3 = @COLC, Field4 = @COLD, Field5 = @COLE, Field6 = @COLF, @Field7 = @COLG, @Field8 = @COLH, " +
|
||||
"Field9 = @COLI, Field10 = @COLJ, Field11 = @COLK, Field12 = @COLL, Field13 = @COLM, Field14 = @Remark WHERE Id = @ID", this.Tablename);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
@ -621,8 +621,8 @@ namespace bsmd.database
|
||||
case SearchFilterType.FILTER_ETA:
|
||||
uint? from = null, to = null;
|
||||
string[] elems = searchDict[key].Split(':');
|
||||
if (!elems[0].IsNullOrEmpty()) from = UInt32.Parse(elems[0]);
|
||||
if (!elems[1].IsNullOrEmpty()) to = UInt32.Parse(elems[1]);
|
||||
if (!elems[0].IsNullOrEmpty()) from = uint.Parse(elems[0]);
|
||||
if (!elems[1].IsNullOrEmpty()) to = uint.Parse(elems[1]);
|
||||
|
||||
// SQL Logik für die Zeitfilterung: Wenn es bereits eine Tabelle NOA_NOD mit einem Eintrag für ETAToPortOfCall / ETAToKielCanal gibt
|
||||
// soll dieser Wert als Vergleich herangezogen werden, sonst ETA / ETAKielCanal aus MessageCore
|
||||
@ -697,16 +697,14 @@ namespace bsmd.database
|
||||
case SearchFilterType.FILTER_FLAG_EQ:
|
||||
{
|
||||
sb.Append(" MessageCore.Flags = @FLAG ");
|
||||
int flag = 0;
|
||||
int.TryParse(searchDict[key], out flag);
|
||||
int.TryParse(searchDict[key], out int flag);
|
||||
((SqlCommand)cmd).Parameters.AddWithValue("@FLAG", flag);
|
||||
break;
|
||||
}
|
||||
case SearchFilterType.FILTER_FLAG_NEQ:
|
||||
{
|
||||
sb.Append(" MessageCore.Flags <> @FLAG ");
|
||||
int flag = 0;
|
||||
int.TryParse(searchDict[key], out flag);
|
||||
int.TryParse(searchDict[key], out int flag);
|
||||
((SqlCommand)cmd).Parameters.AddWithValue("@FLAG", flag);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -111,6 +111,7 @@
|
||||
<Compile Include="AGNT_Template.cs" />
|
||||
<Compile Include="CallPurpose.cs" />
|
||||
<Compile Include="Customer.cs" />
|
||||
<Compile Include="DBManagerAsync.cs" />
|
||||
<Compile Include="Extensions.cs" />
|
||||
<Compile Include="HAZ.cs" />
|
||||
<Compile Include="HAZPosTemplate.cs" />
|
||||
@ -126,6 +127,7 @@
|
||||
<Compile Include="ISublistContainer.cs" />
|
||||
<Compile Include="LastTenPortFacilitiesCalled.cs" />
|
||||
<Compile Include="LookupNameAttribute.cs" />
|
||||
<Compile Include="MaerskData.cs" />
|
||||
<Compile Include="MARPOL_Annex_I_Position.cs" />
|
||||
<Compile Include="MessageHistory.cs" />
|
||||
<Compile Include="NoTypeConverterJsonConverter.cs" />
|
||||
|
||||
Loading…
Reference in New Issue
Block a user