WIP, import works now

This commit is contained in:
Daniel Schick 2023-02-09 09:02:06 +01:00
parent 1ab7641efe
commit 6d07baa4b0
10 changed files with 488 additions and 103 deletions

View File

@ -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>

View File

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

View 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])

View File

@ -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
}

View 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
}
}

View File

@ -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
View 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
}
}

View File

@ -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;
}

View File

@ -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" />