using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Net.Standard.Dbas.Bus; using Sarand.BusinessMgr.Net.Standard.Dbas.Internal; using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog; 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.ItemData; using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Dbas.Data; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { //======================================================================= partial class SbmAssetMgr_Dbas { //******************************************************************* // V e h i c l e //******************************************************************* // Utilities. private List GetLogProperties(SbmVehicle vehicle) { return new List() { new StringPair("Id",SysId.ToString(vehicle.Id)), new StringPair("Vin",vehicle.Vin), new StringPair("Status",vehicle.StatusCode) }; } //------------------------------------------------------------------- // Data members. //------------------------------------------------------------------- // Get Vehicle. public override SbmVehicle GetVehicle(SbmVehicle.Params prm) { return GetVehicle(GetVehicleQueryFilter(prm).Concat(" AND ", "(", ")")); } private SbmVehicle GetVehicle(String filter) { ClearErrorState(); long count = GetVehicleCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState("Multiple Vehicles found"); return null; } SbmVehicle vehicle = null; // Query data. using (var dbConnection = db.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); SaVehicle_Db dbVehicle = new SaVehicle_Db(DbInfo); dbVehicle.PopulateFrom(dbCommand, aliasVehicle, filter); vehicle = CreateVehicle(dbVehicle); } catch (Exception exc) { SetErrorState("Database query exception"); SaLogger.Warn(GetType().Name + ".GetVehicle\n\tQuery: " + dbCommand.CommandText + "\n\tException: " + exc.Message); } } return vehicle; } //------------------------------------------------------------------- // Create Vehicle. public override SbmVehicle CreateVehicle() { ClearErrorState(); return new SbmVehicle_Dbas(UserContext, new SysId(), 0); } private SbmVehicle_Dbas CreateVehicle(SaVehicle_Db dbVehicle) { ClearErrorState(); SbmVehicle_Dbas vehicle = new SbmVehicle_Dbas(UserContext, new SysId(dbVehicle._Id), (ushort)dbVehicle._Flags); PopulateFrom(dbVehicle, vehicle); return vehicle; } //------------------------------------------------------------------- // Validate Vehicle. public override bool IsValidVehicleData(SbmVehicle.Data data, SbmVehicle.ErrField errField) { ClearErrorState(); if (!base.IsValidVehicleData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert Vehicle. public override bool InsertVehicle(SbmVehicle vehicle, DbUpdateInfo dbUpdateInfo) { String fn = GetType().Name + ".InsertVehicle"; ClearErrorState(); if (!IsValidVehicle(vehicle)) return false; if (SysId.IsValid(vehicle.Id)) return SetErrorState(ErrorMessage.ValiditemId); using (var dbConnection = db.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); SaVehicle_Db dbVehicle = new SaVehicle_Db(DbInfo); PopulateTo(dbVehicle, vehicle, dbUpdateInfo); if (SaVehicle_Db.FieldsNonId.Contains("Id")) { // Generate next Id. dbVehicle._Id = SysId.ToInt(db.GetNextId("Vehicle", dbUpdateInfo)); } dbVehicle.ExecuteInsertCommand(dbCommand); vehicle.Id = new SysId(dbVehicle._Id); vehicle.Changed = false; if (DebugMode) SaLogger.Debug(fn + " Inserted. " + GetLogProperties(vehicle).Concat(": ").Concat("", "\n\t")); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Update Vehicle. public override bool UpdateVehicle(SbmVehicle vehicle, DbUpdateInfo dbUpdateInfo) { String fn = GetType().Name + ".UpdateVehicle"; ClearErrorState(); if (!IsValidVehicle(vehicle)) return false; if (!SysId.IsValid(vehicle.Id)) return SetErrorState(ErrorMessage.InvalidItemId); if (!vehicle.Changed) { if (DebugMode) SaLogger.Debug(fn + " Data not changed. " + GetLogProperties(vehicle).Concat(": ").Concat("", "\n\t")); return true; } using (var dbConnection = db.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve Vehicle. dbConnection.Open(); SaVehicle_Db dbVehicle = new SaVehicle_Db(DbInfo); dbVehicle.PopulateFrom(dbCommand, aliasVehicle, "Id=" + SysId.ToString(vehicle.Id)); SbmUpdateLogItemMonitor_Vehicle updateLogMonitor = new SbmUpdateLogItemMonitor_Vehicle(UserContext, CreateVehicle(dbVehicle)); // Update properties. PopulateTo(dbVehicle, vehicle, dbUpdateInfo); dbVehicle.ExecuteUpdateCommand(dbCommand); vehicle.Changed = false; if (DebugMode) SaLogger.Debug(fn + " Updated. " + GetLogProperties(vehicle).Concat(": ").Concat("", "\n\t")); // Record updates. updateLogMonitor.RecordUpdatedValues(vehicle); updateLogMonitor.LogUpdates(); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Delete Vehicle. public override bool VehicleCanBeDeleted(SbmVehicle vehicle) { ClearErrorState(); if (!base.VehicleCanBeDeleted(vehicle)) return false; return true; } public override bool DeleteVehicle(SbmVehicle vehicle, DbUpdateInfo dbUpdateInfo) { String fn = GetType().Name + ".DeleteVehicle"; ClearErrorState(); if (!VehicleCanBeDeleted(vehicle)) return false; using (var dbConnection = db.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve prm. dbConnection.Open(); SaVehicle_Db dbVehicle = new SaVehicle_Db(DbInfo); dbVehicle.PopulateFrom(dbCommand, aliasVehicle, "Id=" + vehicle.Id.ToString()); // Delete prm. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicle) + " WHERE Id=" + SysId.ToString(vehicle.Id) + ";"; dbCommand.ExecuteNonQuery(); vehicle.Changed = false; if (DebugMode) SaLogger.Debug(fn + " Deleted. " + GetLogProperties(vehicle).Concat(": ").Concat("", "\n\t")); } catch (Exception exc) { SetErrorState(exc.Message); } } return !HasErrorState(); } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo(SaVehicle_Db dbVehicle, SbmVehicle vehicle, DbUpdateInfo dbUpdateInfo) { dbVehicle._Id = vehicle.Id.ToInt(); dbVehicle._VehicleClassId = vehicle.VehicleClassId.ToInt(); dbVehicle._RegNumber = vehicle.RegNumber; dbVehicle._VIN = vehicle.Vin; dbVehicle._CapCode = vehicle.CapCode; dbVehicle._KeyNumber = vehicle.KeyNumber; dbVehicle._KeyLocation = vehicle.KeyLocation; dbVehicle._EngineNumber = vehicle.EngineNumber; dbVehicle._EngineCapacity = vehicle.EngineCapacity; dbVehicle._Seats = vehicle.Seats; dbVehicle._Weight = vehicle.Weight; dbVehicle._ManufactureYear = vehicle.ManufactureYear; dbVehicle._BuildOn = vehicle.BuildOn; dbVehicle._FirstRegisterOn = vehicle.FirstRegisterOn; dbVehicle._RegisterOn = vehicle.RegisterOn; dbVehicle._RegNumberPrev = vehicle.RegNumberPrev; dbVehicle._PurchaseOdo = (int)vehicle.PurchaseOdo; dbVehicle._TachoCode = vehicle.TachoCode; dbVehicle._TachoId = vehicle.TachoId; dbVehicle._LastServiceOdo = (int)vehicle.LastServiceOdo; dbVehicle._LastServiceOn = vehicle.LastServiceOn; dbVehicle._NextServiceOdo = (int)vehicle.NextServiceOdo; dbVehicle._NextServiceOn = vehicle.NextServiceOn; dbVehicle._MotOn = vehicle.MotOn; dbVehicle._MotNo = vehicle.MotNo; dbVehicle._NextTaxOn = vehicle.NextTaxOn; dbVehicle._LatestOdo = (int)vehicle.LatestOdo; dbVehicle._LatestOdoOn = vehicle.LatestOdoOn; // Common properties. dbVehicle._Notes = vehicle.Notes; dbVehicle._Status = SacsSystem.GetStatusCode(vehicle.Status); dbVehicle._Flags = (short)vehicle.Flags; if (!SysId.IsValid(vehicle.Id)) { dbVehicle._CreateOn = DateTime.UtcNow; dbVehicle._CreateBy = dbUpdateInfo.UserId.ToInt(); dbVehicle._CreateHost = dbUpdateInfo.Host; } dbVehicle._UpdateOn = DateTime.UtcNow; dbVehicle._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbVehicle._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom(SaVehicle_Db dbVehicle, SbmVehicle vehicle) { //vehicle.Id = new SysId(dbVehicle._Id); vehicle.VehicleClassId = new SysId(dbVehicle._VehicleClassId); vehicle.RegNumber = dbVehicle._RegNumber; vehicle.Vin = dbVehicle._VIN; vehicle.CapCode = dbVehicle._CapCode; vehicle.KeyNumber = dbVehicle._KeyNumber; vehicle.KeyLocation = dbVehicle._KeyLocation; vehicle.EngineNumber = dbVehicle._EngineNumber; vehicle.EngineCapacity = dbVehicle._EngineCapacity; vehicle.Seats = dbVehicle._Seats; vehicle.Weight = dbVehicle._Weight; vehicle.ManufactureYear = dbVehicle._ManufactureYear; vehicle.BuildOn = dbVehicle._BuildOn; vehicle.FirstRegisterOn = dbVehicle._FirstRegisterOn; vehicle.RegisterOn = dbVehicle._RegisterOn; vehicle.RegNumberPrev = dbVehicle._RegNumberPrev; vehicle.PurchaseOdo = dbVehicle._PurchaseOdo; vehicle.TachoCode = dbVehicle._TachoCode; vehicle.TachoId = dbVehicle._TachoId; vehicle.LastServiceOdo = dbVehicle._LastServiceOdo; vehicle.LastServiceOn = dbVehicle._LastServiceOn; vehicle.NextServiceOdo = dbVehicle._NextServiceOdo; vehicle.NextServiceOn = dbVehicle._NextServiceOn; vehicle.MotOn = dbVehicle._MotOn; vehicle.MotNo = dbVehicle._MotNo; vehicle.NextTaxOn = dbVehicle._NextTaxOn; vehicle.LatestOdo = dbVehicle._LatestOdo; vehicle.LatestOdoOn = dbVehicle._LatestOdoOn; // Common properties. vehicle.Notes = dbVehicle._Notes; vehicle.Status = SacsSystem.GetStatusForCode(dbVehicle._Status); vehicle.SetCreateStamp(dbVehicle._CreateOn, new SysId(dbVehicle._CreateBy), dbVehicle._CreateHost); vehicle.SetUpdateStamp(dbVehicle._UpdateOn, new SysId(dbVehicle._UpdateBy), dbVehicle._UpdateHost); vehicle.AcceptChanges(); } //------------------------------------------------------------------- private static readonly String aliasVehicle = "aVeh"; private static readonly String prefixVehicle = "Veh_"; // VehicleClass Alias&Prefix. private static readonly String aliasVehicle_VehicleClass = "aVehVehCls"; private static readonly String prefixVehicle_VehicleClass = "VehVehClass_"; // VehEventCount DataName. private static readonly String dataNameVehEventCount = "EvtCount"; // VehFeatureCount DataName. private static readonly String dataNameVehFeatureCount = "FtrCount"; // HpiCheckCount DataName. private static readonly String dataNameHpiCheckCount = "HpiCount"; // Vehicle column definitions. private void SetVehicleColDfn (ColumnDfn col, String caption, int width, SbmDbDfn.ColumnIdx dbCol, ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String, String alias = "", String prefix = "") { if (String.IsNullOrEmpty(alias) && SbmDbDfn.GetTableForColumn(dbCol) == SbmDbDfn.TableIdx.SaVehicle) alias = aliasVehicle; col.Set(caption, width, (int)dbCol, prefix + SbmDbDfn.GetColumnName(dbCol, false), SbmDbDfn.GetColumnNameQual(dbCol, alias), dataType, align); if (dataType == DataValue.DataType.String && dbCol != SbmDbDfn.ColumnIdx.Unknown) col.MaxLength = (int)SbmDbDfn.GetColTextLen(dbCol); } //------------------------------------------------------------------- // Getting prm column definition. public override ColumnDfn GetVehicleColumnDfn(SbmVehicle.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); switch (columnId) { case SbmVehicle.Column.Pos: SetVehicleColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; case SbmVehicle.Column.Id: SetVehicleColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.SaVehicle_Id, ColumnAlignment.Right, DataValue.DataType.Long, aliasVehicle, prefixVehicle); columnDfn.ReadOnly = true; break; // Vehicle Properties. case SbmVehicle.Column.VehicleClass_Id: SetVehicleColDfn(columnDfn, "Cat Id", 45, SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmVehicle.Column.VehicleClass_MakeCode: SetVehicleColDfn(columnDfn, "Make", 65, SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode, ColumnAlignment.Center, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_MakeDesc: SetVehicleColDfn(columnDfn, "Make", 75, SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode, ColumnAlignment.Left, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_Model: SetVehicleColDfn(columnDfn, "Model", 80, SbmDbDfn.ColumnIdx.SaVehicleClass_Model, ColumnAlignment.Left, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_Derivative: SetVehicleColDfn(columnDfn, "Derivative", 90, SbmDbDfn.ColumnIdx.SaVehicleClass_Derivative, ColumnAlignment.Left, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_DescBrief: SetVehicleColDfn(columnDfn, "Vehicle class", 120, SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief, ColumnAlignment.Left, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_Type: SetVehicleColDfn(columnDfn, "Type", 60, SbmDbDfn.ColumnIdx.SaVehicleClass_VehicleType, ColumnAlignment.Center, DataValue.DataType.Long, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_TypeDesc: SetVehicleColDfn(columnDfn, "Type", 70, SbmDbDfn.ColumnIdx.SaVehicleClass_VehicleType, ColumnAlignment.Center, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_CategoryCode: SetVehicleColDfn(columnDfn, "Category", 70, SbmDbDfn.ColumnIdx.SaVehicleClass_VehicleCategoryCode, ColumnAlignment.Center, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_CategoryDesc: SetVehicleColDfn(columnDfn, "Category", 70, SbmDbDfn.ColumnIdx.SaVehicleClass_VehicleCategoryCode, ColumnAlignment.Center, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_FuelTypeDesc: SetVehicleColDfn(columnDfn, "Fuel type", 70, SbmDbDfn.ColumnIdx.SaVehicleClass_FuelType, ColumnAlignment.Center, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_OdometerUnitsDesc: SetVehicleColDfn(columnDfn, "Odo units", 70, SbmDbDfn.ColumnIdx.SaVehicleClass_OdometerUnits, ColumnAlignment.Center, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_Seats: SetVehicleColDfn(columnDfn, "Seats", 50, SbmDbDfn.ColumnIdx.SaVehicleClass_Seats, ColumnAlignment.Center, DataValue.DataType.Long, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_InsuranceCode: SetVehicleColDfn(columnDfn, "Insurance", 70, SbmDbDfn.ColumnIdx.SaVehicleClass_InsuranceCode, ColumnAlignment.Center, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_InsuranceDesc: SetVehicleColDfn(columnDfn, "Insurance", 100, SbmDbDfn.ColumnIdx.SaVehicleClass_InsuranceCode, ColumnAlignment.Left, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.VehicleClass_Notes: SetVehicleColDfn(columnDfn, "Class Notes", 200, SbmDbDfn.ColumnIdx.SaVehicleClass_Notes, ColumnAlignment.Left, DataValue.DataType.String, aliasVehicle_VehicleClass, prefixVehicle_VehicleClass); break; case SbmVehicle.Column.RegNumber: SetVehicleColDfn(columnDfn, "Registration", 80, SbmDbDfn.ColumnIdx.SaVehicle_RegNumber); break; case SbmVehicle.Column.RegNumberPrev: SetVehicleColDfn(columnDfn, "Reg (prev)", 80, SbmDbDfn.ColumnIdx.SaVehicle_RegNumberPrev); break; case SbmVehicle.Column.Vin: SetVehicleColDfn(columnDfn, "Vin", 100, SbmDbDfn.ColumnIdx.SaVehicle_VIN); break; case SbmVehicle.Column.CapCode: SetVehicleColDfn(columnDfn, "CAP", 90, SbmDbDfn.ColumnIdx.SaVehicle_CapCode); break; case SbmVehicle.Column.KeyNumber: SetVehicleColDfn(columnDfn, "Key #", 90, SbmDbDfn.ColumnIdx.SaVehicle_KeyNumber); break; case SbmVehicle.Column.KeyLocation: SetVehicleColDfn(columnDfn, "Key loc.", 60, SbmDbDfn.ColumnIdx.SaVehicle_KeyLocation); break; case SbmVehicle.Column.EngineNumber: SetVehicleColDfn(columnDfn, "Engine no", 80, SbmDbDfn.ColumnIdx.SaVehicle_EngineNumber); break; case SbmVehicle.Column.BuildOn: SetVehicleColDfn(columnDfn, "Build on", 70, SbmDbDfn.ColumnIdx.SaVehicle_BuildOn, ColumnAlignment.Center, DataValue.DataType.Date); break; case SbmVehicle.Column.FirstRegisterOn: SetVehicleColDfn(columnDfn, "First reg.", 70, SbmDbDfn.ColumnIdx.SaVehicle_FirstRegisterOn, ColumnAlignment.Center, DataValue.DataType.Date); break; case SbmVehicle.Column.RegisterOn: SetVehicleColDfn(columnDfn, "Registered", 70, SbmDbDfn.ColumnIdx.SaVehicle_RegisterOn, ColumnAlignment.Center, DataValue.DataType.Date); break; case SbmVehicle.Column.PurchaseOdo: SetVehicleColDfn(columnDfn, "Purchase odo", 70, SbmDbDfn.ColumnIdx.SaVehicle_PurchaseOdo, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmVehicle.Column.TachoCode: SetVehicleColDfn(columnDfn, "Tacho", 100, SbmDbDfn.ColumnIdx.SaVehicle_TachoCode); break; case SbmVehicle.Column.TachoId: SetVehicleColDfn(columnDfn, "Tacho Id", 90, SbmDbDfn.ColumnIdx.SaVehicle_TachoId); break; case SbmVehicle.Column.LastServiceOdo: SetVehicleColDfn(columnDfn, "Last service odo", 70, SbmDbDfn.ColumnIdx.SaVehicle_LastServiceOdo, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmVehicle.Column.LastServiceOn: SetVehicleColDfn(columnDfn, "Last service", 70, SbmDbDfn.ColumnIdx.SaVehicle_LastServiceOn, ColumnAlignment.Center, DataValue.DataType.Date); break; case SbmVehicle.Column.NextServiceOdo: SetVehicleColDfn(columnDfn, "Next service odo", 70, SbmDbDfn.ColumnIdx.SaVehicle_NextServiceOdo, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmVehicle.Column.NextServiceOn: SetVehicleColDfn(columnDfn, "NextServiceOn", 70, SbmDbDfn.ColumnIdx.SaVehicle_NextServiceOn, ColumnAlignment.Center, DataValue.DataType.Date); break; case SbmVehicle.Column.MotOn: SetVehicleColDfn(columnDfn, "Mot due", 70, SbmDbDfn.ColumnIdx.SaVehicle_MotOn, ColumnAlignment.Center, DataValue.DataType.Date); break; case SbmVehicle.Column.MotNo: SetVehicleColDfn(columnDfn, "MOT No", 80, SbmDbDfn.ColumnIdx.SaVehicle_MotNo); break; case SbmVehicle.Column.NextTaxOn: SetVehicleColDfn(columnDfn, "Next Tax", 70, SbmDbDfn.ColumnIdx.SaVehicle_NextTaxOn, ColumnAlignment.Center, DataValue.DataType.Date); break; case SbmVehicle.Column.LatestOdo: SetVehicleColDfn(columnDfn, "Latest Odo", 70, SbmDbDfn.ColumnIdx.SaVehicle_LatestOdo, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmVehicle.Column.LatestOdoOn: SetVehicleColDfn(columnDfn, "Latest Odo", 70, SbmDbDfn.ColumnIdx.SaVehicle_LatestOdoOn, ColumnAlignment.Center, DataValue.DataType.Date); break; // Common properties. case SbmVehicle.Column.Notes: SetVehicleColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.SaVehicle_Notes); break; case SbmVehicle.Column.Flag: SetVehicleColDfn(columnDfn, "Flags", 40, SbmDbDfn.ColumnIdx.SaVehicle_Flags, ColumnAlignment.Center, DataValue.DataType.Long); break; case SbmVehicle.Column.Status: SetVehicleColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SaVehicle_Status, ColumnAlignment.Center); break; case SbmVehicle.Column.Status_Desc: SetVehicleColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SaVehicle_Status); break; case SbmVehicle.Column.Status_Ind: SetVehicleColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SaVehicle_Status, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; case SbmVehicle.Column.CreateOn_Date: SetVehicleColDfn(columnDfn, "Created", 65, SbmDbDfn.ColumnIdx.SaVehicle_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; columnDfn.ReadOnly = true; break; case SbmVehicle.Column.UpdateOn_Date: SetVehicleColDfn(columnDfn, "Updated", 65, SbmDbDfn.ColumnIdx.SaVehicle_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; columnDfn.ReadOnly = true; break; case SbmVehicle.Column.EventCount: SetVehicleColDfn(columnDfn, "Events", 60, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.DataName = dataNameVehEventCount; break; case SbmVehicle.Column.FeatureCount: SetVehicleColDfn(columnDfn, "Features", 60, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.DataName = dataNameVehFeatureCount; break; case SbmVehicle.Column.HpiCheckCount: SetVehicleColDfn(columnDfn, "HPI Checks", 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.DataName = dataNameHpiCheckCount; break; } if (!String.IsNullOrEmpty(caption)) columnDfn.Caption = caption; if (width > 0) columnDfn.Width = width; return columnDfn; } //------------------------------------------------------------------- // Vehicle query filter. public override List GetVehicleQueryFilter(SbmVehicle.Params prm) { List filter = new List(); // Vehicle Id. String includedIds = prm.IncludedIds.Concat(","); String colVehicle_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Id, aliasVehicle); if (!StringUtil.IsEmpty(includedIds)) filter.Add(colVehicle_Id + " IN (" + includedIds + ")"); String excludedIds = prm.ExcludedIds.Concat(","); if (!StringUtil.IsEmpty(excludedIds)) filter.Add(colVehicle_Id + " NOT IN (" + excludedIds + ")"); //--------------------------------------------------------------- // Vehicle Class. String colVehicle_VehicleClassId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle); if (SysId.IsValid(prm.VehicleClassId)) filter.Add(colVehicle_VehicleClassId + "=" + prm.VehicleClassId.ToString()); String classDesc = DbQuery.FormatForCondition(prm.ClassDescPartial); if (!StringUtil.IsEmpty(prm.MakeCode) || !classDesc.IsEmpty()) { DbQuery qryVehicleClass = new DbQuery(db.DbmsType); qryVehicleClass.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass), aliasVehicle_VehicleClass); qryVehicleClass.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasVehicle_VehicleClass)); if (!StringUtil.IsEmpty(prm.MakeCode)) qryVehicleClass.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode, aliasVehicle_VehicleClass) + "='" + prm.MakeCode + "'"); if (!StringUtil.IsEmpty(classDesc)) qryVehicleClass.Filters.Add(DbQuery.FormatFn_Left(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief, aliasVehicle_VehicleClass), prm.ClassDescPartial.Length) + "='" + classDesc + "'"); filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle) + " IN (" + qryVehicleClass.BuildQuery() + ")"); } //--------------------------------------------------------------- // Partial Registration. String regNumber = DbQuery.FormatForCondition(prm.RegNumberPartial); if (!StringUtil.IsEmpty(regNumber)) filter.Add(DbQuery.FormatFn_Left(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber, aliasVehicle), prm.RegNumberPartial.Length) + " ='" + regNumber + "'"); // Partial VIN: String vin = DbQuery.FormatForCondition(prm.VinPartial); if (!StringUtil.IsEmpty(vin)) filter.Add(DbQuery.FormatFn_Left(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VIN, aliasVehicle), prm.VinPartial.Length) + " ='" + vin + "'"); //--------------------------------------------------------------- // Associated Assets. if (SysId.IsValid(prm.AssetCatIdInclude) || SysId.IsValid(prm.AssetCatIdExclude) || SysId.IsValid(prm.AssetProcessIdNext)) { String aliasVehicle_Asset = "aVehAst"; DbQuery qryAsset = new DbQuery(db.DbmsType); qryAsset.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset), aliasVehicle_Asset); qryAsset.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasVehicle_Asset)); qryAsset.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ItemType, aliasVehicle_Asset) + "=" + ((int)Sbm.ItemType.Vehicle).ToString()); qryAsset.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ItemId, aliasVehicle_Asset) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Id, aliasVehicle)); String colAsset_AssetCategoryId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AssetCategoryId, aliasVehicle_Asset); String colAsset_ProcessIdNext = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ProcessIdNext, aliasVehicle_Asset); if (SysId.IsValid(prm.AssetCatIdInclude) || SysId.IsValid(prm.AssetProcessIdNext)) { if (SysId.IsValid(prm.AssetCatIdInclude)) qryAsset.Filters.Add(colAsset_AssetCategoryId + "=" + prm.AssetCatIdInclude.ToString()); if (SysId.IsValid(prm.AssetProcessIdNext)) qryAsset.Filters.Add(colAsset_ProcessIdNext + "=" + prm.AssetProcessIdNext.ToString()); filter.Add(" EXISTS(" + qryAsset.BuildQuery() + ")"); } if (SysId.IsValid(prm.AssetCatIdExclude)) { qryAsset.Filters.Add(colAsset_AssetCategoryId + "=" + prm.AssetCatIdExclude.ToString()); filter.Add(" NOT EXISTS(" + qryAsset.BuildQuery() + ")"); } } //--------------------------------------------------------------- // Restrict to active: String colVehicle_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Status, aliasVehicle); if (!StringUtil.IsEmpty(prm.RestrictToActive)) filter.Add(colVehicle_Status + "='" + SacsSystem.GetStatusDesc(SaStatus.Active) + "'"); if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1"); return filter; } // Vehicle sort columns. public List GetVehicleSortColumns(SbmVehicle.Params prm) { // Sort sequence: List sortColumnCodes = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for Vehicle columns in case of conflict. String sortCol = String.Empty; if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.SaVehicle) { sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasVehicle); } else { sortCol = columnDfn.DataName; if (!StringUtil.IsEmpty(columnDfn.SortDataName)) sortCol = columnDfn.SortDataName; } if (!sortCol.IsEmpty()) { DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls sortColumnCodes.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", ")); } } sortColumnCodes.RemoveBlanks(); if (sortColumnCodes.IsEmpty()) { // Default sort columns: sortColumnCodes.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle) + " ASC"); } return sortColumnCodes; } //------------------------------------------------------------------- // Vehicle count. private long GetVehicleCount(String filter) { ClearErrorState(); return db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicle) + " As " + aliasVehicle, filter); } public override long GetVehicleCount(SbmVehicle.Params prm) { ClearErrorState(); return GetVehicleCount(GetVehicleQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // Vehicle list. public override List GetVehicleList(SbmVehicle.Params prm) { List Vehiclees = new List(); DbQuery qry = new DbQuery(db.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicle), aliasVehicle); SaVehicle_Db dbVehicle = new SaVehicle_Db(DbInfo); qry.Columns.AddRange(dbVehicle.ExistingColumnNames); qry.Filters.AddRange(GetVehicleQueryFilter(prm)); qry.OrderBy.AddRange(GetVehicleSortColumns(prm)); // Query data. using (var dbConnection = db.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging); using (DbDataReader dbDataReader = dbCommand.ExecuteReader()) { while (dbDataReader.Read()) { dbVehicle = new SaVehicle_Db(DbInfo); dbVehicle.PopulateFrom(dbDataReader); Vehiclees.Add(CreateVehicle(dbVehicle)); } } } catch (Exception exc) { SaLogger.Warn(GetType().Name + ".GetVehicleList\n\tQuery: " + dbCommand.CommandText + "\n\tException: " + exc.Message); } } return Vehiclees; } //------------------------------------------------------------------- // Vehicle query execution. public override DbResultSet ExecuteVehicleQuery(List columns, SbmVehicle.Params prm) { ClearErrorState(); //--------------------------------------------------------------------- // Construct build database query. DbQuery query = new DbQuery(db.DbmsType); query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicle), aliasVehicle); // Vehicle Properties - add columns as defined in query list. query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Id, aliasVehicle)); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber, aliasVehicle)); if (columns.HasId((int)SbmVehicle.Column.RegNumberPrev)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_RegNumberPrev, aliasVehicle)); if (columns.HasId((int)SbmVehicle.Column.Vin)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VIN, aliasVehicle)); if (columns.HasId((int)SbmVehicle.Column.CapCode)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_CapCode, aliasVehicle)); if (columns.HasId((int)SbmVehicle.Column.KeyNumber)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_KeyNumber, aliasVehicle)); if (columns.HasId((int)SbmVehicle.Column.KeyLocation)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_KeyLocation, aliasVehicle)); //--------------------------------------------------------------- // Vehicle Category. bool hasVehicleClassCols = false; if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_MakeCode); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_MakeDesc); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_Model); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_Derivative); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_DescBrief); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_Type); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_TypeDesc); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_CategoryCode); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_CategoryDesc); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_FuelTypeDesc); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_OdometerUnitsDesc); if (!hasVehicleClassCols) hasVehicleClassCols = columns.HasId((int)SbmVehicle.Column.VehicleClass_Notes); if (hasVehicleClassCols) { DbQueryJoin joinVehCat = new DbQueryJoin(DbJoinType.LeftOuter); joinVehCat.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass), aliasVehicle_VehicleClass); joinVehCat.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasVehicle_VehicleClass) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasVehicle)); query.Joins.Add(joinVehCat); // Add the Vehicle Category columns: List dbColumns = new List(); dbColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode); dbColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Model); if (columns.HasId((int)SbmVehicle.Column.VehicleClass_Derivative)) dbColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Derivative); if (columns.HasId((int)SbmVehicle.Column.VehicleClass_DescBrief)) dbColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief); dbColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_VehicleType); dbColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_VehicleCategoryCode); if (columns.HasId((int)SbmVehicle.Column.VehicleClass_FuelTypeDesc)) dbColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_FuelType); if (columns.HasId((int)SbmVehicle.Column.VehicleClass_OdometerUnitsDesc)) dbColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_OdometerUnits); if (columns.HasId((int)SbmVehicle.Column.VehicleClass_Notes)) dbColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Notes); dbColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Flags); foreach (SbmDbDfn.ColumnIdx dbColumn in dbColumns) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasVehicle_VehicleClass), prefixVehicle_VehicleClass + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------- // Event count. if (db.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleEvent))) { bool countVehicles = columns.HasId((int)SbmVehicle.Column.EventCount); if (countVehicles) { // Build sub query to directly return the number of associated Events: String aliasVehicle_VehicleEvent = "aVehVehEvt"; DbQuery qryEvent = new DbQuery(db.DbmsType); qryEvent.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleEvent), aliasVehicle_VehicleEvent); qryEvent.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleEvent_Id, aliasVehicle_VehicleEvent) + ")"); qryEvent.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleEvent_VehicleId, aliasVehicle_VehicleEvent) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Id, aliasVehicle)); query.Columns.Add("(" + qryEvent.BuildQuery() + ")", dataNameVehEventCount); } } //--------------------------------------------------------------- // Feature count. bool bCountFeatures = columns.HasId((int)SbmVehicle.Column.FeatureCount); if (bCountFeatures) { if (db.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleFeature))) { // Build sub query to directly return the number of associated Features: String aliasVehicle_VehicleFeature = "aVehVehFtr"; DbQuery qryFeature = new DbQuery(db.DbmsType); qryFeature.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleFeature), aliasVehicle_VehicleFeature); qryFeature.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleFeature_VehicleId, aliasVehicle_VehicleFeature) + ")"); qryFeature.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleFeature_VehicleId, aliasVehicle_VehicleFeature) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Id, aliasVehicle)); query.Columns.Add("(" + qryFeature.BuildQuery() + ")", dataNameVehFeatureCount); } } //--------------------------------------------------------------- // HpiCheck count. bool bCountHpiChecks = columns.HasId((int)SbmVehicle.Column.HpiCheckCount); if (bCountHpiChecks) { SaItemDataConsole itemDataConsole = SbmGlobals.Application.GetItemDataConsole(UserContext); if (itemDataConsole != null && itemDataConsole.DatabaseIsValid) { // Build sub query to directly return the number of associated HpiChecks. String aliasVehicle_ItemData = "aVehItmDat"; DbQuery qryItemData = new DbQuery(db.DbmsType); qryItemData.Tables.Add(SaItemDataDbDfn.GetTableName(SaItemDataDbDfn.TableIdx.SaItemData), aliasVehicle_ItemData); qryItemData.Columns.Add("Count(" + SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Id, aliasVehicle_ItemData) + ")"); qryItemData.Filters.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType, aliasVehicle_ItemData) + "=" + ((int)Sbm.ItemType.Vehicle).ToString()); qryItemData.Filters.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId, aliasVehicle_ItemData) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Id, aliasVehicle)); List itemDataTypes = new List(); qryItemData.Filters.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType, aliasVehicle_ItemData) + "='" + itemDataTypes.GetCodeForType(Sbm.ItemDataType.Vehicle_HpiResponse) + "'"); query.Columns.Add("(" + qryItemData.BuildQuery() + ")", dataNameHpiCheckCount); } } // Common Properties if (columns.HasId((int)SbmVehicle.Column.Notes)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Notes, aliasVehicle)); if (columns.HasId((int)SbmVehicle.Column.Flag)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Flags, aliasVehicle)); if (columns.HasId((int)SbmVehicle.Column.Status) || columns.HasId((int)SbmVehicle.Column.Status_Desc) || columns.HasId((int)SbmVehicle.Column.Status_Ind)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Status, aliasVehicle)); if (columns.HasId((int)SbmVehicle.Column.CreateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_CreateOn, aliasVehicle)); if (columns.HasId((int)SbmVehicle.Column.UpdateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_UpdateOn, aliasVehicle)); //--------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetVehicleQueryFilter(prm)); if (prm.IncludedIds.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetVehicleSortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------- //return new DbResultSet_DataTableReader(db, query.BuildQuery()); return DbResultSet_DataReader.ExecuteQuery(db, query.BuildQuery(prm.ResultsPaging)); } //------------------------------------------------------------------- } //======================================================================= }