using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Dbas.Data; using Saxonite.Base.App; using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.Bus; using Saxonite.Net.Standard.Base.Bus.Reference; using Saxonite.Net.Standard.Dbas.Bus.Reference; using Saxonite.Net.Standard.Dbas.Internal.Reference; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; namespace Saxonite.Net.Standard.Dbas.Mgr.Reference { //======================================================================= partial class SaxReferenceGolfMgr_Dbas { //******************************************************************* // Support Mgr - User Report //******************************************************************* // Utilities. private List GetLogProperties(SaxGolfUsgaFacility usgaFacility) { return new List() { new StringPair("Id",SysId.ToString(usgaFacility.Id)), new StringPair("Province Id",SysId.ToString(usgaFacility.ProvinceId)), new StringPair("Usga Facility Id",SysId.ToString(usgaFacility.UsgaFacilityId)), new StringPair("Facility name",usgaFacility.FacilityName), new StringPair("Status",usgaFacility.StatusCode) }; } //------------------------------------------------------------------- // Create item. public override SaxGolfUsgaFacility CreateUsgaFacility(SysId usgaProvinceId) { ClearErrorState(); return new SaxGolfUsgaFacility_Dbas(ReferenceDatabase, null, usgaProvinceId, 0); } private SaxGolfUsgaFacility_Dbas CreateUsgaFacility(Golf_UsgaFacility_Db dbUsgaFacility) { ClearErrorState(); SaxGolfUsgaFacility_Dbas usgaFacility = new SaxGolfUsgaFacility_Dbas(ReferenceDatabase, new SysId(dbUsgaFacility._Id), new SysId(dbUsgaFacility._ProvinceId), (ushort)dbUsgaFacility._Flags); PopulateFrom(dbUsgaFacility, usgaFacility); return usgaFacility; } //------------------------------------------------------------------- // Get item. public override SaxGolfUsgaFacility GetUsgaFacility(SaxGolfUsgaFacility.Params prm) { ClearErrorState(); return GetUsgaFacility(GetUsgaFacilityQueryFilter(prm).Concat(" And ", "(", ")")); } private SaxGolfUsgaFacility GetUsgaFacility(String filter) { ClearErrorState(); long count = GetUsgaFacilityCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState("Multiple items found"); return null; } SaxGolfUsgaFacility usgaFacility = null; // Query data. using (var dbConnection = ReferenceDatabase.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Golf_UsgaFacility_Db dbUsgaFacility = new Golf_UsgaFacility_Db(ReferenceDbInfo); dbUsgaFacility.PopulateFrom(dbCommand, aliasUsgaFacility, filter); usgaFacility = CreateUsgaFacility(dbUsgaFacility); } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return usgaFacility; } //------------------------------------------------------------------- // Validate item. public override bool IsValidUsgaFacilityData(SaxGolfUsgaFacility.Data data, SaxGolfUsgaFacility.ErrField errField) { ClearErrorState(); if (!base.IsValidUsgaFacilityData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert item. public override bool InsertUsgaFacility(SaxGolfUsgaFacility usgaFacility, DbUpdateInfo dbUpdateInfo) { String fn = GetType().Name + ".InsertUsgaFacility"; ClearErrorState(); if (!IsValidUsgaFacility(usgaFacility)) return false; if (SysId.IsValid(usgaFacility.Id)) return SetErrorState(ErrorMessage.ValiditemId); using (var dbConnection = ReferenceDatabase.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Golf_UsgaFacility_Db dbUsgaFacility = new Golf_UsgaFacility_Db(ReferenceDbInfo); PopulateTo(dbUsgaFacility, usgaFacility, dbUpdateInfo); if (Golf_UsgaFacility_Db.FieldsNonId.Contains("Id")) { // Generate next Id. dbUsgaFacility._Id = ReferenceDatabase.GetNextIdFromTable("UsgaFacility"); } dbUsgaFacility.ExecuteInsertCommand(dbCommand); usgaFacility.Id = new SysId(dbUsgaFacility._Id); usgaFacility.Changed = false; if (DebugMode) SaLogger.Debug(fn + " Inserted. " + GetLogProperties(usgaFacility).Concat(": ").Concat("", "\n\t")); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Update item. public override bool UpdateUsgaFacility(SaxGolfUsgaFacility usgaFacility, DbUpdateInfo dbUpdateInfo) { String fn = GetType().Name + ".UpdateUsgaFacility"; ClearErrorState(); if (!IsValidUsgaFacility(usgaFacility)) return false; if (!SysId.IsValid(usgaFacility.Id)) return SetErrorState(ErrorMessage.InvalidItemId); if (!usgaFacility.Changed) { if (DebugMode) SaLogger.Debug(fn + " Data not changed. " + GetLogProperties(usgaFacility).Concat(": ").Concat("", "\n\t")); return true; } using (var dbConnection = ReferenceDatabase.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve item. dbConnection.Open(); Golf_UsgaFacility_Db dbUsgaFacility = new Golf_UsgaFacility_Db(ReferenceDbInfo); dbUsgaFacility.PopulateFrom(dbCommand, aliasUsgaFacility, "Id=" + SysId.ToString(usgaFacility.Id)); // ToDo SaxUpdateLogItemMonitor_UsgaFacility updateLogMonitor = new SaxUpdateLogItemMonitor_UsgaFacility(SessionContext, CreateUsgaFacility(dbUsgaFacility), dbUpdateInfo); // Update item. PopulateTo(dbUsgaFacility, usgaFacility, dbUpdateInfo); dbUsgaFacility.ExecuteUpdateCommand(dbCommand); usgaFacility.Changed = false; if (DebugMode) SaLogger.Debug(fn + " Updated. " + GetLogProperties(usgaFacility).Concat(": ").Concat("", "\n\t")); // Record updates. // ToDo updateLogMonitor.RecordUpdatedValues(usgaFacility); // ToDo updateLogMonitor.LogUpdates(); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Delete item. public override bool UsgaFacilityCanBeDeleted(SaxGolfUsgaFacility usgaFacility) { ClearErrorState(); if (!base.UsgaFacilityCanBeDeleted(usgaFacility)) return false; return true; } public override bool DeleteUsgaFacility(SaxGolfUsgaFacility usgaFacility, DbUpdateInfo dbUpdateInfo) { String fn = GetType().Name + ".DeleteUsgaFacility"; ClearErrorState(); if (!UsgaFacilityCanBeDeleted(usgaFacility)) return false; // User Roles are logically deleted by changing the status. usgaFacility.Status = SaStatus.Deleted; return UpdateUsgaFacility(usgaFacility, dbUpdateInfo); /* * Physical deletion. using (var dbConnection = ReferenceDatabase.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve item. dbConnection.Open(); Golf_UsgaFacility_Db dbUsgaFacility = new Golf_UsgaFacility_Db(ReferenceDbInfo); dbUsgaFacility.PopulateFrom(dbCommand, aliasUsgaFacility, "Id=" + usgaFacility.Id.ToString()); // Delete item. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + SaxDbDfn_Reference.GetTableNameQual(SaxDbDfn_Reference.TableIdx.UsgaFacility) + " WHERE Id=" + SysId.ToString(usgaFacility.Id) + ";"; dbCommand.ExecuteNonQuery(); usgaFacility.Changed = false; if (DebugMode) SaLogger.Debug(fn + " Deleted. " + GetLogProperties(usgaFacility).Concat(": ").Concat("", "\n\t")); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); */ } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo(Golf_UsgaFacility_Db dbUsgaFacility, SaxGolfUsgaFacility usgaFacility, DbUpdateInfo dbUpdateInfo) { dbUsgaFacility._Id = SysId.ToLong(usgaFacility.Id); dbUsgaFacility._ProvinceId = SysId.ToInt(usgaFacility.ProvinceId); dbUsgaFacility._UsgaFacilityId = SysId.ToLong(usgaFacility.UsgaFacilityId); dbUsgaFacility._FacilityName = usgaFacility.FacilityName; dbUsgaFacility._Address1 = usgaFacility.Address1; dbUsgaFacility._Address2 = usgaFacility.Address2; dbUsgaFacility._City = usgaFacility.City; dbUsgaFacility._PostalCode = usgaFacility.PostalCode; dbUsgaFacility._Latitude = usgaFacility.Latitude; dbUsgaFacility._Longitude = usgaFacility.Longitude; dbUsgaFacility._Email = usgaFacility.Email; dbUsgaFacility._Telephone = usgaFacility.Telephone; // Common. dbUsgaFacility._Notes = usgaFacility.Notes; dbUsgaFacility._Status = SacsSystem.GetStatusCode(usgaFacility.Status); dbUsgaFacility._Flags = (short)usgaFacility.Flags; if (!SysId.IsValid(usgaFacility.Id)) { dbUsgaFacility._CreateOn = DateTime.Now; dbUsgaFacility._CreateBy = dbUpdateInfo.UserId.ToInt(); dbUsgaFacility._CreateHost = dbUpdateInfo.Host; } dbUsgaFacility._UpdateOn = DateTime.Now; dbUsgaFacility._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbUsgaFacility._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom(Golf_UsgaFacility_Db dbUsgaFacility, SaxGolfUsgaFacility usgaFacility) { //usgaFacility.Id = new SysId(dbUsgaFacility._Id); usgaFacility.ProvinceId = new SysId(dbUsgaFacility._ProvinceId); usgaFacility.UsgaFacilityId = new SysId(dbUsgaFacility._UsgaFacilityId); usgaFacility.FacilityName = dbUsgaFacility._FacilityName; usgaFacility.Address1 = dbUsgaFacility._Address1; usgaFacility.Address2 = dbUsgaFacility._Address2; usgaFacility.City = dbUsgaFacility._City; usgaFacility.PostalCode = dbUsgaFacility._PostalCode; usgaFacility.Latitude = dbUsgaFacility._Latitude; usgaFacility.Longitude = dbUsgaFacility._Longitude; usgaFacility.Email = dbUsgaFacility._Email; usgaFacility.Telephone = dbUsgaFacility._Telephone; // Common. usgaFacility.Notes = dbUsgaFacility._Notes; usgaFacility.Status = SacsSystem.GetStatusForCode(dbUsgaFacility._Status); usgaFacility.SetCreateStamp(dbUsgaFacility._CreateOn, new SysId(dbUsgaFacility._CreateBy), dbUsgaFacility._CreateHost); usgaFacility.SetUpdateStamp(dbUsgaFacility._UpdateOn, new SysId(dbUsgaFacility._UpdateBy), dbUsgaFacility._UpdateHost); usgaFacility.AcceptChanges(); } //------------------------------------------------------------------- // Bulk updates. /// /// Bulk update USGA Facilities. /// - Province code must be supplied to identify parent. /// - Facility Id must be supplied to act as identifier. /// - Other properties are validated as per facility rules - check error state. /// - Other properties are left as is if null. /// public override bool BulkUpdateUsgaFacilities(List facilities, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); List facilitiesToUpdate = new List(); // Validate supplied data. foreach (UsgaFacilityData facility in facilities) { // Validate facility properties. // Province and Facility Codes are mandatory, other values only validated if non-null. if (!IsValidValue(facility.ProvinceCode, "province", (long)SaxDbDfn_Reference.GetColTextLen(SaxDbDfn_Reference.ColumnIdx.UsgaProvince_ProvinceCode), true)) return false; if (!SysId.IsValid(facility.UsgaFacilityId)) return SetErrorState("USGA Facility Id must be supplied"); if (facility.FacilityName != null && !IsValidValue(facility.FacilityName, "name", (long)SaxDbDfn_Reference.GetColTextLen(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_FacilityName))) return false; if (facility.Address1 != null && !IsValidValue(facility.Address1, "address 1", (long)SaxDbDfn_Reference.GetColTextLen(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Address1))) return false; if (facility.Address2 != null && !IsValidValue(facility.Address2, "address 2", (long)SaxDbDfn_Reference.GetColTextLen(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Address2))) return false; if (facility.City != null && !IsValidValue(facility.City, "city", (long)SaxDbDfn_Reference.GetColTextLen(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_City))) return false; if (facility.Email != null && !IsValidValue(facility.Email, "email", (long)SaxDbDfn_Reference.GetColTextLen(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Email))) return false; if (facility.Telephone != null && !IsValidValue(facility.Telephone, "telephone", (long)SaxDbDfn_Reference.GetColTextLen(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Telephone))) return false; facilitiesToUpdate.Add(facility); } int MaxBulkUpdateBatchSize = 64; int batchSize = facilitiesToUpdate.Any() ? (int)Math.Ceiling(facilitiesToUpdate.Count() / Math.Ceiling((double)facilitiesToUpdate.Count() / MaxBulkUpdateBatchSize)) : MaxBulkUpdateBatchSize; while (facilitiesToUpdate.Any()) { List query = new List(); query.Add($"Declare @statusActive VarChar(3) = '{SacsSystem.GetStatusCode(SaxGolfUsgaFacility.DefaultStatus)}';"); query.Add($"Declare @updateOn DateTime = GetDate();"); query.Add($"Declare @updateBy Int = {SysId.ToLong(dbUpdateInfo.UserId)};"); query.Add($"Declare @updateHost VarChar(100) = '{DbQuery.FormatForCondition(dbUpdateInfo.Host)}';"); query.Add("Merge"); query.Add($"Into {SaxDbDfn_Reference.GetTableNameQual(SaxDbDfn_Reference.TableIdx.UsgaFacility)} uFty"); query.Add("Using"); query.Add("("); query.Add("Select dPrv.Id ProvinceId, dFty.ProvinceCode, dFty.UsgaFacilityId, dFty.FacilityName, dFty.Address1, dFty.Address2, dFty.City, dFty.PostalCode, dFty.Email, dFty.Telephone"); query.Add("From"); query.Add("("); query.Add("Select '' ProvinceCode, 0 UsgaFacilityId, '' FacilityName, '' Address1, '' Address2, '' City, '' PostalCode, '' Email, '' Telephone"); foreach (UsgaFacilityData facility in facilitiesToUpdate.ExtractRange(0, batchSize)) query.Add($"Union Select '{DbQuery.FormatForCondition(facility.ProvinceCode)}', {SysId.ToString(facility.UsgaFacilityId)}, " + (facility.FacilityName != null ? $"'{DbQuery.FormatForCondition(facility.FacilityName)}'" : "Null") + "," + (facility.Address1 != null ? $"'{DbQuery.FormatForCondition(facility.Address1)}'" : "Null") + "," + (facility.Address2 != null ? $"'{DbQuery.FormatForCondition(facility.Address2)}'" : "Null") + "," + (facility.City != null ? $"'{DbQuery.FormatForCondition(facility.City)}'" : "Null") + "," + (facility.PostalCode != null ? $"'{DbQuery.FormatForCondition(facility.PostalCode)}'" : "Null") + "," + (facility.Email != null ? $"'{DbQuery.FormatForCondition(facility.Email)}'" : "Null") + "," + (facility.Telephone != null ? $"'{DbQuery.FormatForCondition(facility.Telephone)}'" : "Null")); query.Add(") dFty"); query.Add($"Inner Join {SaxDbDfn_Reference.GetTableNameQual(SaxDbDfn_Reference.TableIdx.UsgaProvince)} dPrv On dPrv.ProvinceCode=dFty.ProvinceCode"); query.Add(") dFty"); query.Add("On uFty.ProvinceId=dFty.ProvinceId And uFty.UsgaFacilityId=dFty.UsgaFacilityId"); query.Add("When Matched And ((dFty.FacilityName Is Not Null And uFty.FacilityName!=dFty.FacilityName) Or (dFty.Address1 Is Not Null And uFty.Address1!=dFty.Address1) Or (dFty.Address2 Is Not Null And uFty.Address2!=dFty.Address2) Or (dFty.City Is Not Null And uFty.City!=dFty.City) Or (dFty.PostalCode Is Not Null And uFty.PostalCode!=dFty.PostalCode) Or (dFty.Email Is Not Null And uFty.Email!=dFty.Email) Or (dFty.Telephone Is Not Null And uFty.Telephone!=dFty.Telephone) Or uFty.Status!=@statusActive)"); query.Add("Then Update Set"); query.Add(" FacilityName=Coalesce(dFty.FacilityName,uFty.FacilityName),"); query.Add(" Address1=Coalesce(dFty.Address1,uFty.Address1),"); query.Add(" Address2=Coalesce(dFty.Address2,uFty.Address2),"); query.Add(" City=Coalesce(dFty.City,uFty.City),"); query.Add(" PostalCode=Coalesce(dFty.PostalCode,uFty.PostalCode),"); query.Add(" Email=Coalesce(dFty.Email,uFty.Email),"); query.Add(" Telephone=Coalesce(dFty.Telephone,uFty.Telephone),"); query.Add(" Status=@statusActive,"); query.Add(" UpdateOn=@updateOn,"); query.Add(" UpdateBy=@updateBy,"); query.Add(" UpdateHost=@updateHost"); query.Add("When Not Matched And Len(IsNull(dFty.FacilityName,''))>0"); query.Add("Then Insert (ProvinceId,UsgaFacilityId,FacilityName,Address1,Address2,City,PostalCode,Email,Telephone,Notes,Flags,Status,CreateOn,CreateBy,CreateHost,UpdateOn,UpdateBy,UpdateHost)"); query.Add($"Values (dFty.ProvinceId,dFty.UsgaFacilityId,dFty.FacilityName,Coalesce(dFty.Address1,''),Coalesce(dFty.Address2,''),Coalesce(dFty.City,''),Coalesce(dFty.PostalCode,''),Coalesce(dFty.Email,''),Coalesce(dFty.Telephone,''),'',0,@statusActive,@updateOn,@updateBy,@updateHost,@updateOn,@updateBy,@updateHost)"); query.Add(";"); //SaLogger.Info($"{SysUtil.Fn} Bulk USGA Facility update query:\n\t{query.Concat("\n\t")}"); try { int result = ReferenceDatabase.ExecuteNonQuery(query.Concat("\n")); if (ReferenceDatabase.HasErrorState()) SaLogger.Warn($"{SysUtil.Fn} Error executing bulk USGA Facility update - {ReferenceDatabase.ErrorStateMessage}"); } catch (Exception exc) { SaLogger.Warn(SysUtil.Fn + " " + ExceptionUtil.GetLogMessage(exc, " executing bulk USGA Facility update")); } } return !HasErrorState(); } //------------------------------------------------------------------- // Item column definitions. private static readonly String aliasUsgaFacility = "UsgFty"; private static readonly String aliasUsgaFacility_Province = "UsgFty_Prv"; private static readonly String prefixUsgaFacility_Province = aliasUsgaFacility_Province + "_"; private void SetUsgaFacilityColDfn (ColumnDfn col, String caption, int width, SaxDbDfn_Reference.ColumnIdx dbCol, ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String, String alias = "", String prefix = "") { if (String.IsNullOrEmpty(alias) && SaxDbDfn_Reference.GetTableForColumn(dbCol) == SaxDbDfn_Reference.TableIdx.UsgaFacility) alias = aliasUsgaFacility; col.Set(caption, width, (int)dbCol, prefix + SaxDbDfn_Reference.GetColumnName(dbCol, false), SaxDbDfn_Reference.GetColumnNameQual(dbCol, alias), dataType, align); if (dataType == DataValue.DataType.String && dbCol != SaxDbDfn_Reference.ColumnIdx.Unknown) col.MaxLength = (int)SaxDbDfn_Reference.GetColTextLen(dbCol); } public override ColumnDfn GetUsgaFacilityColumnDfn(SaxGolfUsgaFacility.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); switch (columnId) { //----------------------------------------------------------- case SaxGolfUsgaFacility.Column.Pos: SetUsgaFacilityColDfn(columnDfn, "Pos", 60, SaxDbDfn_Reference.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; case SaxGolfUsgaFacility.Column.Id: SetUsgaFacilityColDfn(columnDfn, "Id", 80, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Id, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; //------------------------------------------------------- case SaxGolfUsgaFacility.Column.ProvinceId: SetUsgaFacilityColDfn(columnDfn, "Province #", 80, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_ProvinceId, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; case SaxGolfUsgaFacility.Column.Province_Name: SetUsgaFacilityColDfn(columnDfn, "Province", 120, SaxDbDfn_Reference.ColumnIdx.UsgaProvince_ProvinceName, ColumnAlignment.Center, DataValue.DataType.String, aliasUsgaFacility_Province, prefixUsgaFacility_Province); columnDfn.ReadOnly = true; break; //------------------------------------------------------- case SaxGolfUsgaFacility.Column.UsgaFacilityId: SetUsgaFacilityColDfn(columnDfn, "USGA Id", 80, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_UsgaFacilityId, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; case SaxGolfUsgaFacility.Column.FacilityName: SetUsgaFacilityColDfn(columnDfn, "Name", 120, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_FacilityName, ColumnAlignment.Center); columnDfn.ReadOnly = true; break; //----------------------------------------------------------- // Derived properties. //----------------------------------------------------------- // Common properties. case SaxGolfUsgaFacility.Column.Notes: SetUsgaFacilityColDfn(columnDfn, "Notes", 240, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Notes); break; case SaxGolfUsgaFacility.Column.Flags: SetUsgaFacilityColDfn(columnDfn, "Flags", 60, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Flags, ColumnAlignment.Center, DataValue.DataType.Long); break; case SaxGolfUsgaFacility.Column.Status: SetUsgaFacilityColDfn(columnDfn, "Status", 80, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Status, ColumnAlignment.Center); break; case SaxGolfUsgaFacility.Column.Status_Desc: SetUsgaFacilityColDfn(columnDfn, "Status", 90, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Status, ColumnAlignment.Center); break; case SaxGolfUsgaFacility.Column.Status_Ind: SetUsgaFacilityColDfn(columnDfn, "Status", 80, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Status, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; case SaxGolfUsgaFacility.Column.CreateOn_Date: SetUsgaFacilityColDfn(columnDfn, "Created", 80, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; case SaxGolfUsgaFacility.Column.UpdateOn_Date: SetUsgaFacilityColDfn(columnDfn, "Updated", 80, SaxDbDfn_Reference.ColumnIdx.UsgaFacility_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; //----------------------------------------------------------- } if (!String.IsNullOrEmpty(caption)) columnDfn.Caption = caption; if (width > 0) columnDfn.Width = width; return columnDfn; } //------------------------------------------------------------------- // Item query filter. public override List GetUsgaFacilityQueryFilter(SaxGolfUsgaFacility.Params prm) { List filter = new List(); String col_Id = SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Id, aliasUsgaFacility); // Item Ids. if (prm.IdsIncluded.HasValidIds()) filter.Add($"{col_Id} IN ({prm.IdsIncluded.Concat(",")})"); if (prm.IdsExcluded.HasValidIds()) filter.Add($"{col_Id} NOT IN ({prm.IdsExcluded.Concat(",")})"); // Countries. if (prm.ProvinceIdsIncluded.HasValidIds()) filter.Add($"{SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_ProvinceId, aliasUsgaFacility)} IN ({prm.ProvinceIdsIncluded.Concat(",")})"); if (!StringUtil.IsBlank(prm.FacilityFilter)) { // Split filter into words. List filterWords = prm.FacilityFilter.Split((char[])null).ToList(); filterWords.RemoveDuplicatesCI(); filterWords.RemoveBlanks(); foreach (String filterWord in filterWords) { List facilityFilter = new List(); facilityFilter.Add($"{SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_FacilityName, aliasUsgaFacility)} Like '%{DbQuery.FormatForLike(filterWord, true)}%'"); filter.Add(facilityFilter.Concat(" OR ", "(", ")")); } } // Name. if (!StringUtil.IsEmpty(prm.FacilityNameFull)) filter.Add($"{SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_FacilityName, aliasUsgaFacility)}='{DbQuery.FormatForCondition(prm.FacilityNameFull)}'"); if (!StringUtil.IsEmpty(prm.FacilityNamePartial)) filter.Add($"{SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_FacilityName, aliasUsgaFacility)} LIKE '%{DbQuery.FormatForLike(prm.FacilityNamePartial)}%'"); // Associated data. if (prm.HasCourses != SacsHierarchyItem.Params.BoolState.Either) { String existsPrefix = (prm.HasCourses == SacsHierarchyItem.Params.BoolState.True ? "" : "Not "); filter.Add($"{existsPrefix} Exists (Select 1 From {SaxDbDfn_Reference.GetTableNameQual(SaxDbDfn_Reference.TableIdx.UsgaCourse)} Where {SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaCourse_FacilityId)}={col_Id})"); } // Notes. if (!StringUtil.IsEmpty(prm.NotesPartial)) filter.Add($"{SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Notes, aliasUsgaFacility)} LIKE '%{DbQuery.FormatForLike(prm.NotesPartial)}%'"); // Status. if (prm.StatusCat != SaxGolfUsgaFacility.StatusCat.Any) filter.Add($"{SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Status, aliasUsgaFacility)} {GetUsgaFacilityStatusCatFilterCondition(prm.StatusCat)}"); if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1"); return filter; } internal static String GetUsgaFacilityStatusCatFilterCondition(SaxGolfUsgaFacility.StatusCat statusCat) { if (statusCat == SaxGolfUsgaFacility.StatusCat.ActiveOnly) return $"='{SacsSystem.GetStatusCode(SaStatus.Active)}'"; if (statusCat == SaxGolfUsgaFacility.StatusCat.InactiveOnly) return $"='{SacsSystem.GetStatusCode(SaStatus.Inactive)}'"; if (statusCat == SaxGolfUsgaFacility.StatusCat.NotDeleted) return $"!='{SacsSystem.GetStatusCode(SaStatus.Deleted)}'"; if (statusCat == SaxGolfUsgaFacility.StatusCat.DeletedOnly) return $"='{SacsSystem.GetStatusCode(SaStatus.Deleted)}'"; return ""; } // Item sort columns. public List GetUsgaFacilitySortColumns(SaxGolfUsgaFacility.Params prm) { // Sort sequence: List sortColumnNames = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for UsgaFacility columns in case of conflict. String sortCol = String.Empty; if (SaxDbDfn_Reference.GetTableForColumn((SaxDbDfn_Reference.ColumnIdx)columnDfn.DbColumn) == SaxDbDfn_Reference.TableIdx.UsgaFacility) { sortCol = SaxDbDfn_Reference.GetColumnNameQual((SaxDbDfn_Reference.ColumnIdx)columnDfn.DbColumn, aliasUsgaFacility); } else { sortCol = columnDfn.DataName; if (!StringUtil.IsEmpty(columnDfn.SortDataName)) sortCol = columnDfn.SortDataName; } if (!sortCol.IsEmpty()) { DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", ")); } } sortColumnNames.RemoveBlanks(); if (sortColumnNames.IsEmpty()) { // Default sort columns. sortColumnNames.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Id, aliasUsgaFacility) + " ASC"); } return sortColumnNames; } //------------------------------------------------------------------- // Item count. private long GetUsgaFacilityCount(String filter) { ClearErrorState(); return ReferenceDatabase.GetRowCount(SaxDbDfn_Reference.GetTableNameQual(SaxDbDfn_Reference.TableIdx.UsgaFacility) + " As " + aliasUsgaFacility, filter); } public override long GetUsgaFacilityCount(SaxGolfUsgaFacility.Params prm) { ClearErrorState(); return GetUsgaFacilityCount(GetUsgaFacilityQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // Item list. public override List GetUsgaFacilityList(SaxGolfUsgaFacility.Params prm) { ClearErrorState(); List userRoles = new List(); DbQuery qry = new DbQuery(ReferenceDatabase.DbmsType); qry.Tables.Add(SaxDbDfn_Reference.GetTableNameQual(SaxDbDfn_Reference.TableIdx.UsgaFacility), aliasUsgaFacility); Golf_UsgaFacility_Db dbUsgaFacility = new Golf_UsgaFacility_Db(ReferenceDbInfo); qry.Columns.AddRange(dbUsgaFacility.ExistingColumnNames); qry.Filters.AddRange(GetUsgaFacilityQueryFilter(prm)); qry.OrderBy.AddRange(GetUsgaFacilitySortColumns(prm)); // Query data. using (var dbConnection = ReferenceDatabase.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging); using (DbDataReader dbDataReader = dbCommand.ExecuteReader()) { while (dbDataReader.Read()) { dbUsgaFacility = new Golf_UsgaFacility_Db(ReferenceDbInfo); dbUsgaFacility.PopulateFrom(dbDataReader); userRoles.Add(CreateUsgaFacility(dbUsgaFacility)); } } } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return userRoles; } //------------------------------------------------------------------- // Item query execution. public override DbResultSet ExecuteUsgaFacilityQuery(List columns, SaxGolfUsgaFacility.Params prm) { ClearErrorState(); //--------------------------------------------------------------------- // Construct query. DbQuery query = new DbQuery(ReferenceDatabase.DbmsType); query.Tables.Add(SaxDbDfn_Reference.GetTableNameQual(SaxDbDfn_Reference.TableIdx.UsgaFacility), aliasUsgaFacility); // Add columns as defined in query list. if (columns.HasId(SaxGolfUsgaFacility.Column.Id)) query.Columns.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Id, aliasUsgaFacility)); bool hasProvinceCols = (columns.HasId(SaxGolfUsgaFacility.Column.Province_Name)); if (columns.HasId(SaxGolfUsgaFacility.Column.ProvinceId) || hasProvinceCols) query.Columns.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_ProvinceId, aliasUsgaFacility)); if (columns.HasId(SaxGolfUsgaFacility.Column.UsgaFacilityId)) query.Columns.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_UsgaFacilityId, aliasUsgaFacility)); if (columns.HasId(SaxGolfUsgaFacility.Column.FacilityName)) query.Columns.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_FacilityName, aliasUsgaFacility)); // Common properties. if (columns.HasId(SaxGolfUsgaFacility.Column.Notes)) query.Columns.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Notes, aliasUsgaFacility)); if (columns.HasId(SaxGolfUsgaFacility.Column.Flags)) query.Columns.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Flags, aliasUsgaFacility)); if (columns.HasId(SaxGolfUsgaFacility.Column.Status) || columns.HasId(SaxGolfUsgaFacility.Column.Status_Desc) || columns.HasId(SaxGolfUsgaFacility.Column.Status_Ind)) query.Columns.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_Status, aliasUsgaFacility)); if (columns.HasId(SaxGolfUsgaFacility.Column.CreateOn_Date)) query.Columns.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_CreateOn, aliasUsgaFacility)); if (columns.HasId(SaxGolfUsgaFacility.Column.UpdateOn_Date)) query.Columns.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_UpdateOn, aliasUsgaFacility)); //--------------------------------------------------------------------- // Province. if (hasProvinceCols) { DbQueryJoin joinProvince = new DbQueryJoin(DbJoinType.LeftOuter); joinProvince.Table = new StringPair(SaxDbDfn_Reference.GetTableNameQual(SaxDbDfn_Reference.TableIdx.UsgaProvince), aliasUsgaFacility_Province); joinProvince.Filters.Add(SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaProvince_Id, aliasUsgaFacility_Province) + "=" + SaxDbDfn_Reference.GetColumnNameQual(SaxDbDfn_Reference.ColumnIdx.UsgaFacility_ProvinceId, aliasUsgaFacility)); query.Joins.Add(joinProvince); List cols = new List(); cols.Add(SaxDbDfn_Reference.ColumnIdx.UsgaProvince_ProvinceName); foreach (var col in cols) query.Columns.Add(SaxDbDfn_Reference.GetColumnNameQual(col, aliasUsgaFacility_Province), prefixUsgaFacility_Province + SaxDbDfn_Reference.GetColumnName(col, false)); prm.Alias_Province = aliasUsgaFacility_Province; } //--------------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetUsgaFacilityQueryFilter(prm)); if (prm.IdsIncluded.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetUsgaFacilitySortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------------- //return new DbResultSet_DataTableReader(db, query.BuildQuery(prm.ResultsPaging)); return DbResultSet_DataReader.ExecuteQuery(ReferenceDatabase, query.BuildQuery(prm.ResultsPaging)); } //------------------------------------------------------------------- } //======================================================================= }