// Copyright (c) 2015-2017 schick Informatik // Description: Kopfdaten eines Excel-Einlesevorgangs using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; namespace bsmd.database { public class ImportHeader : DatabaseEntity { public ImportHeader() { this.tablename = "[dbo].[ImportHeader]"; } #region Properties public Guid? ReportingPartyId { get; set; } public string SenderEmail { get; set; } public DateTime ImportDate { get; set; } public string Filename { get; set; } public Guid MessageCoreId { get; set; } #endregion #region DatabaseEntity implementation public override List LoadList(IDataReader reader) { List result = new List(); while (reader.Read()) { ImportHeader ih = new ImportHeader(); ih.id = reader.GetGuid(0); if (!reader.IsDBNull(1)) ih.ReportingPartyId = reader.GetGuid(1); if (!reader.IsDBNull(2)) ih.SenderEmail = reader.GetString(2); if (!reader.IsDBNull(3)) ih.ImportDate = reader.GetDateTime(3); if (!reader.IsDBNull(4)) ih.Filename = reader.GetString(4); if (!reader.IsDBNull(5)) ih.MessageCoreId = reader.GetGuid(5); result.Add(ih); } reader.Close(); return result; } public override void PrepareLoadCommand(IDbCommand cmd, Message.LoadFilter filter, params object[] criteria) { string query = string.Format("SELECT Id, ReportingPartyId, SenderEMail, ImportDate, Filename, MessageCoreId FROM {0} ", this.Tablename); switch (filter) { case Message.LoadFilter.BY_CORE: query += " WHERE MessageCoreId = @MCID"; ((SqlCommand)cmd).Parameters.AddWithValue("@MCID", criteria[0]); break; default: break; } query += " ORDER BY ImportDate DESC"; cmd.CommandText = query; } public override void PrepareSave(IDbCommand cmd) { SqlCommand scmd = cmd as SqlCommand; scmd.Parameters.AddWithNullableValue("@RPID", this.ReportingPartyId); scmd.Parameters.AddWithNullableValue("@SENDER", this.SenderEmail); scmd.Parameters.AddWithNullableValue("@IMPORTDATE", this.ImportDate); scmd.Parameters.AddWithNullableValue("@FILENAME", this.Filename); scmd.Parameters.AddWithNullableValue("@MESSAGECOREID", this.MessageCoreId); if (this.IsNew) { this.CreateId(); scmd.Parameters.AddWithValue("@ID", this.Id); scmd.CommandText = string.Format("INSERT INTO {0} (Id, ReportingPartyId, SenderEMail, ImportDate, Filename, MessageCoreId) " + "VALUES (@ID, @RPID, @SENDER, @IMPORTDATE, @FILENAME, @MESSAGECOREID)", this.Tablename); } else { scmd.Parameters.AddWithValue("@ID", this.Id); scmd.CommandText = string.Format("UPDATE {0} SET ReportingPartyId = @RPID, SenderEMail = @SENDER, ImportDate = @IMPORTDATE, " + "Filename = @FILENAME, MessageCoreId = @MESSAGECOREID WHERE Id = @ID", this.Tablename); } } #endregion #region public methods /// /// Diese Methode erzeugt ImportValue Entitäten aus den eingelesenen Excel-Werten. Dabei werden nur /// Deltas gespeichert, d.h. alle Änderungen bezogen /// /// /// public List CreateUpdateList(Dictionary importValues) { List existingListHeaders = DBManager.Instance.GetImportHeader(this.MessageCoreId); List result = new List(); // in diesem Dict wird der "neueste" eingelesene Stand aufbereitet, der dann direkt mit den neu // eingelesenen Werten verglichen werden kann. Dazu müssen alle Values der Anmeldung gelesen werden und // von hinten nach vorne überschrieben werden. Dictionary comparisonDict = new Dictionary(); // existingListHeaders sind von neu..alt sortiert, man muss also von hinten lesen for(int i = (existingListHeaders.Count - 1); i >= 0; i--) { List values = DBManager.Instance.GetValuesForImportHeader(existingListHeaders[i]); foreach(ImportValue anImportValue in values) { comparisonDict[anImportValue.Name] = anImportValue.Value; } } // jetzt alle Einträge suchen, die es noch nicht gibt oder geändert sind und dafür ImportValue Entitäten anlegen foreach(string key in importValues.Keys) { if(comparisonDict.ContainsKey(key)) { if (comparisonDict[key].Equals(importValues[key])) continue; } // Wert ist anders oder nicht vorhanden ImportValue iv = new ImportValue(); iv.Value = importValues[key]; iv.Name = key; string[] elems = key.Split('.'); Message.NotificationClass aNotificationClass = Message.NotificationClass.VISIT; if (Enum.TryParse(elems[0], out aNotificationClass)) iv.NotificationClass = aNotificationClass; iv.ImportHeaderId = this.Id.Value; result.Add(iv); } return result; } #endregion } }