// Copyright (c) 2017 schick Informatik // Description: PO Nummer Übersicht. Ergänzung Nummern. Excel Export // using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Windows; using System.Windows.Controls; using Microsoft.Win32; using Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; using bsmd.database; using ExcelDataReader; using System.Collections.ObjectModel; namespace ENI2.Controls { /// /// Interaction logic for MaerskListControl.xaml /// public partial class MaerskListControl : UserControl { #region Fields private List searchResult = new List(); private readonly List filteredResult = new List(); private readonly ObservableCollection maerskDataList = new ObservableCollection(); private const uint MAX_EMPTY_ROWS_ON_IMPORT = 3; // import breaks if more than this count of empty rows have been read #endregion #region Construction public MaerskListControl() { InitializeComponent(); Loaded += POList_Loaded; this.dateTimePickerFrom.Value = DateTime.Today.AddDays(-14); this.dateTimePickerTo.Value = DateTime.Today.AddDays(14); } #endregion #region control event handler 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) { // validate for "true" number var el = e.EditingElement as System.Windows.Controls.TextBox; if (!el.Text.IsDigitsOnly()) { el.Text = string.Empty; e.Cancel = true; } else { // buttonSaveChanges.IsEnabled = true; MessageCore editedCore = this.filteredResult[e.Row.GetIndex()]; editedCore.IsDirty = true; } } if(e.Column == gridColumnGroup) { var el = e.EditingElement as ComboBox; DictionaryEntry selectedItem = (DictionaryEntry) el.SelectedItem; MessageCore.CoreFlags coreFlag = (MessageCore.CoreFlags) Enum.Parse(typeof(MessageCore.CoreFlags), selectedItem.Value.ToString()); MessageCore editedCore = this.filteredResult[e.Row.GetIndex()]; // clear all first editedCore.SetFlag(false, MessageCore.CoreFlags.MAERSK_BHV); editedCore.SetFlag(false, MessageCore.CoreFlags.SEAGO_BHV); editedCore.SetFlag(false, MessageCore.CoreFlags.SEAGO_WHV); editedCore.SetFlag(false, MessageCore.CoreFlags.HOEGH); if (coreFlag != MessageCore.CoreFlags.NONE) { editedCore.SetFlag(true, coreFlag); } // buttonSaveChanges.IsEnabled = true; editedCore.IsDirty = true; } if(e.Column == gridColumnATA) { var el = e.EditingElement as System.Windows.Controls.TextBox; if(DateTime.TryParse(el.Text, out DateTime localATA)) { MessageCore editedCore = this.filteredResult[e.Row.GetIndex()]; editedCore.ATA = DateTime.SpecifyKind(localATA, DateTimeKind.Local).ToUniversalTime(); // buttonSaveChanges.IsEnabled = true; editedCore.IsDirty = true; } else { el.Text = string.Empty; e.Cancel = true; } } } */ } #endregion #region private methods private void PerformSearch() { this.dataGridPOCores.ItemsSource = null; this.filteredResult.Clear(); Dictionary filterDict = new Dictionary(); // Die Suche findet in dem eingestellten Intervall statt uint from = this.dateTimePickerFrom.Value.Value.ToUniversalTime().ToUnixTimeStamp(); uint to = this.dateTimePickerTo.Value.Value.ToUniversalTime().ToUnixTimeStamp(); filterDict.Add(MessageCore.SearchFilterType.FILTER_ETA, string.Format("{0}:{1}", from.ToString() ?? "", to.ToString() ?? "")); // eingeschränkt auf flags filterDict.Add(MessageCore.SearchFilterType.FILTER_FLAG_EQ, "0"); // suche auslösen this.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"))); // sortieren nach ETA (kombiniert) searchResult.Sort((x, y) => DateTime.Compare(x.ETADisplay ?? DateTime.MaxValue, y.ETADisplay ?? DateTime.MaxValue)); this.dataGridPOCores.SelectedItem = null; this.filteredResult.AddRange(searchResult); } 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 #region button event handler private void buttonLoad_Click(object sender, RoutedEventArgs e) { Util.UIHelper.SetBusyState(); this.PerformSearch(); } private void buttonImport_Click(object sender, RoutedEventArgs e) { OpenFileDialog ofd = new OpenFileDialog { Filter = "Excel Files|*.xls;*.xlsx" }; if (ofd.ShowDialog() ?? false) { FileStream stream; try { stream = File.Open(ofd.FileName, FileMode.Open, FileAccess.Read, FileShare.Read); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error); return; } using (IExcelDataReader reader = ExcelReaderFactory.CreateReader(stream)) { List importData = new List(); uint emptyRowCnt = 0; try { while (reader.Read()) { if (reader.FieldCount < 13) { throw new InvalidDataException("Sheet must have 13 columns of data"); } 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) { MessageBox.Show("Error reading Excel: " + ex.Message, Properties.Resources.textCaptionError, MessageBoxButton.OK, MessageBoxImage.Error); } // we only want cores for the next 3 days 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(); } } private void buttonExport_Click(object sender, RoutedEventArgs e) { } #endregion } }