Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmAssetMgr_Dbas-Asset.cs
T

987 lines
46 KiB
C#

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.Interfaces;
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
{
//=======================================================================
// Asset manager - Assets.
//=======================================================================
partial class SbmAssetMgr_Dbas
{
//-------------------------------------------------------------------
// Utilities.
private List<StringPair> GetLogProperties(SbmAsset asset)
{
return new List<StringPair>()
{
new StringPair("Id",SysId.ToString(asset.Id)),
new StringPair("DescBrief",asset.DescBrief),
new StringPair("Status",asset.StatusCode)
};
}
//-------------------------------------------------------------------
// Associated data.
public override bool AssetHasProcesses(SysId assetId)
{
ClearErrorState();
if (!SysId.IsValid(assetId)) return false;
return ProcessMgr.ItemHasProcesses(new SbmItemId(Sbm.ItemType.Asset, assetId));
}
public override bool AssetHasRequirements(SysId assetId)
{
ClearErrorState();
if (!SysId.IsValid(assetId)) return false;
String filter = $"{SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Requirement_AssetId)}={assetId}";
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), filter) > 0;
}
public override bool AssetHasInterfaceDataItems(SysId assetId)
{
ClearErrorState();
if (!SysId.IsValid(assetId)) return false;
if (InterfaceConsole == null) return false;
return InterfaceConsole.ItemHasDataItems(new SbmItemId(Sbm.ItemType.Asset, assetId));
}
public override bool AssetHasAssociatedDetails(SysId assetId)
{
ClearErrorState();
if (!SysId.IsValid(assetId)) return false;
return DataItemMgr.HasItemLinks(Sbm.ItemType.Asset, assetId);
}
public override bool ClearAssetDependentData(SbmAsset asset, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (asset == null || !SysId.IsValid(asset.Id)) return false;
if (!HasErrorState())
{
// Remove document references.
if (ItemDocConsole != null)
{
if (!ItemDocConsole.ClearItemDocs(asset.GetItemId(), dbUpdateInfo))
SetErrorState(ItemDocConsole.ErrorStateMessage);
}
else SetErrorState("Failed to retrieve item document console");
}
if (!HasErrorState())
{
/* ToDo SaItemDataConsole for Remove Item Data:
SaItemDataConsole itemDataConsole = SbmGlobals.Application.GetItemDataConsole(SessionContext);
if (itemDataConsole != null)
{
if (!itemDataConsole.ClearItemData(Sbm.ItemType.AssetCategory, Id, ""))
SetErrorState(itemDataConsole.Exception());
}
else SetErrorState("Failed to retrieve item Data Document console");
itemDataConsole = null;*/ // Do not delete this global object.
}
// Remove items data.
if (!HasErrorState())
{
if (DataItemMgr != null)
{
if (!DataItemMgr.ClearDataItem(asset.GetItemId(), dbUpdateInfo))
SetErrorState(DataItemMgr.ErrorStateMessage);
}
else SetErrorState("Failed to retrieve Data Item manager");
}
if (!HasErrorState())
{
// Remove interface data items.
if (InterfaceConsole != null)
{
if (!InterfaceConsole.ClearInterfaceDataItems(asset.GetItemId(), dbUpdateInfo))
SetErrorState(InterfaceConsole.ErrorStateMessage);
}
else SetErrorState("Failed to retrieve interface console");
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Asset Processes.
public override List<SbmItemProcess> GetAssetProcesses(SysId assetId, bool activeOnly)
{
ClearErrorState();
List<SbmItemProcess> itemProcesses = new List<SbmItemProcess>();
itemProcesses.AddRange(ProcessMgr.GetProcessesForItem(new SbmItemId(Sbm.ItemType.Asset, assetId), activeOnly));
itemProcesses.Sort();
return itemProcesses;
}
public override bool StoreAssetProcesses(SbmAsset asset, List<SbmItemProcess> itemProcesses)
{
ClearErrorState();// Clear the existing list.
if (ProcessMgr.StoreItemProcesses(asset.GetItemId(), itemProcesses, DbUpdateInfo))
{
// Make a note of the 'Next' process.
SbmItemProcess itemProcessNext = itemProcesses.GetNextProcessInSequence(SaStatus.Awaiting);
SysId itemProcessIdNext = itemProcessNext?.ProcessId ?? new SysId();
if (asset.ProcessIdNext != itemProcessIdNext)
{
asset.ProcessIdNext = itemProcessIdNext;
if (!UpdateAsset(asset, DbUpdateInfo))
SetErrorState("Failed to update next process id - " + ErrorStateMessage);
}
}
SetErrorState(ProcessMgr.ErrorStateMessage);
return !HasErrorState();
}
public override bool PopulateAssetDefaultProcesses(SbmAsset asset)
{
ClearErrorState();
// Retrieve processes defined for Asset Category and reset identies for Asset.
List<SbmItemProcess> itemProcesses = ProcessMgr.GetProcessesForItem(new SbmItemId(Sbm.ItemType.AssetCategory, asset.AssetCategoryId), true);
foreach (SbmItemProcess itemProcess in itemProcesses)
itemProcess.ClearItemId(Sbm.ItemType.Asset, true);
// Store this list of processes against this asset.
if (!HasErrorState()) StoreAssetProcesses(asset, itemProcesses);
return !HasErrorState();
}
//-------------------------------------------------------------------
// Asset Payment for transaction.
public override bool AssetHasPrices(SysId assetId)
{
if (!SysId.IsValid(assetId)) return false;
List<SbmItemLink> itemLinks = new List<SbmItemLink>();
SbmItemLink.Params prm = new SbmItemLink.Params();
prm.ItemLinkType = Sbm.ItemLinkType.ItemPrice;
prm.ItemTypeFrom = Sbm.ItemType.Asset;
prm.ItemIdFrom = assetId;
prm.StatusCat = SbmItemLink.StatusCat.NotDeleted;
return DataItemMgr.GetItemLinkCount(prm) > 0;
}
public override List<SbmItemPrice> GetAssetPrices(SysId assetId)
{
List<SbmItemPrice> itemPrices = new List<SbmItemPrice>();
if (!SysId.IsValid(assetId)) return itemPrices;
// Query asset prices.
SbmItemLink.Params prm = new SbmItemLink.Params();
prm.ItemLinkType = Sbm.ItemLinkType.ItemPrice;
prm.ItemTypeFrom = Sbm.ItemType.Asset;
prm.ItemIdFrom = assetId;
foreach (SbmItemLink itemLink in DataItemMgr.GetItemLinkList(prm))
{
SbmItemPrice itemPrice = new SbmItemPrice(itemLink.DataContent);
itemPrice.Notes = itemLink.Notes;
itemPrice.Changed = false;
if (itemPrices == null) itemPrices = new List<SbmItemPrice>();
itemPrices.Add(itemPrice);
}
itemPrices.Sort();
return itemPrices;
}
public override bool StoreAssetPrices(SbmAsset asset, List<SbmItemPrice> itemPrices)
{
ClearErrorState();
// Do not attempt any updates unless the list has been populated:
if (!SysId.IsValid(asset.Id)) return SetErrorState("Asset has invalid Id");
// Build item links corresponding to the list of prices.
List<SbmItemLink> itemLinks = new List<SbmItemLink>();
foreach (SbmItemPrice itemPrice in itemPrices)
{
SbmItemLink itemLink = DataItemMgr.CreateItemLink(Sbm.ItemLinkType.ItemPrice, Sbm.ItemType.Asset, asset.Id, Sbm.ItemType.Unknown, new SysId(0));
if (itemLink != null)
{
itemLink.Seq = (short)itemPrice.CodeSeq;
itemLink.DataContent = itemPrice.Serialise();
itemLink.Notes = itemPrice.Notes;
itemLinks.Add(itemLink);
itemLink = null; // Now owned by the list.
}
}
// Store these details.
if (!DataItemMgr.StoreFromItemLinks(Sbm.ItemLinkType.ItemPrice, asset.GetItemId(), itemLinks, DbUpdateInfo))
SetErrorState("Failed to save asset price item links - " + DataItemMgr.ErrorStateMessage);
return !HasErrorState();
}
//-------------------------------------------------------------------
// Get Asset.
public override SbmAsset GetAsset(SbmAsset.Params prm)
{
return GetAsset(GetAssetQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SbmAsset GetAsset(String filter)
{
ClearErrorState();
long count = GetAssetCount(filter);
if (count == 0) return null;
if (count != 1)
{
SetErrorState("Multiple Assets found");
return null;
}
SbmAsset asset = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaAsset_Db dbAsset = new SaAsset_Db(DbInfo);
dbAsset.PopulateFrom(dbCommand, aliasAsset, filter);
asset = CreateAsset(dbAsset);
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return asset;
}
//-------------------------------------------------------------------
// Create Asset.
public override SbmAsset CreateAsset(SysId assetCatId)
{
ClearErrorState();
SbmAsset asset = null;
if (SysId.IsValid(assetCatId))
asset = new SbmAsset_Dbas(new SysId(), assetCatId, 0);
else SetErrorState("Asset Cat Id is not identified");
return asset;
}
private SbmAsset_Dbas CreateAsset(SaAsset_Db dbAsset)
{
ClearErrorState();
SbmAsset_Dbas asset = new SbmAsset_Dbas(new SysId(dbAsset._Id), new SysId(dbAsset._AssetCategoryId ?? 0), (ushort)dbAsset._Flags);
PopulateFrom(dbAsset, asset);
return asset;
}
//-------------------------------------------------------------------
// Validate Asset.
public override bool IsValidAssetData(SbmAsset.Data data, SbmAsset.ErrField errField)
{
ClearErrorState();
if (!base.IsValidAssetData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert Asset.
public override bool InsertAsset(SbmAsset asset, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidAsset(asset)) return false;
if (SysId.IsValid(asset.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
SaAsset_Db dbAsset = new SaAsset_Db(DbInfo);
PopulateTo(dbAsset, asset, dbUpdateInfo);
if (SaAsset_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
dbAsset._Id = SysId.ToInt(Database.GetNextId("SaAsset", dbUpdateInfo));
}
dbAsset.ExecuteInsertCommand(dbCommand);
asset.Id = new SysId(dbAsset._Id);
asset.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted.{GetLogProperties(asset).Concat(": ").Concat("", "\n\t")}");
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update Asset.
public override bool UpdateAsset(SbmAsset asset, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidAsset(asset)) return false;
if (!SysId.IsValid(asset.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
if (!asset.Changed)
{
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed.{GetLogProperties(asset).Concat(": ").Concat("", "\n\t")}");
return true;
}
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve Asset.
dbConnection.Open();
SaAsset_Db dbAsset = new SaAsset_Db(DbInfo);
dbAsset.PopulateFrom(dbCommand, aliasAsset, $"Id={SysId.ToString(asset.Id)}");
SbmUpdateLogItemMonitor_Asset updateLogMonitor = new SbmUpdateLogItemMonitor_Asset(Internals, CreateAsset(dbAsset));
// Update properties.
PopulateTo(dbAsset, asset, dbUpdateInfo);
dbAsset.ExecuteUpdateCommand(dbCommand);
asset.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated.{GetLogProperties(asset).Concat(": ").Concat("", "\n\t")}");
// Record updates.
updateLogMonitor.RecordUpdatedValues(asset);
updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Delete Asset.
public override bool AssetCanBeDeleted(SbmAsset asset)
{
ClearErrorState();
if (!base.AssetCanBeDeleted(asset)) return false;
return true;
}
public override bool DeleteAsset(SbmAsset asset, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!AssetCanBeDeleted(asset)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve Asset.
dbConnection.Open();
SaAsset_Db dbAsset = new SaAsset_Db(DbInfo);
dbAsset.PopulateFrom(dbCommand, aliasAsset, $"Id={asset.Id.ToString()}");
// Delete Asset.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = $"DELETE FROM {SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset)} WHERE Id={SysId.ToString(asset.Id)};";
dbCommand.ExecuteNonQuery();
asset.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted.{GetLogProperties(asset).Concat(": ").Concat("", "\n\t")}");
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo(SaAsset_Db dbAsset, SbmAsset asset, DbUpdateInfo dbUpdateInfo)
{
dbAsset._Id = asset.Id.ToInt();
dbAsset._AssetCategoryId = asset.AssetCategoryId.ToInt();
dbAsset._SerialNumber = asset.SerialNumber;
dbAsset._RefExt = asset.RefExt;
dbAsset._DescBrief = asset.DescBrief;
dbAsset._ItemType = asset.ItemId.Type;
dbAsset._ItemId = SysId.ToInt(asset.ItemId.Id);
dbAsset._PurchaseOn = asset.PurchaseOn;
dbAsset._AssocIdSupplier = asset.AssocIdSupplier.ToInt();
dbAsset._PurchaseInvoiceRef = asset.PurchaseInvoiceRef;
dbAsset._PaymentTerms = asset.PaymentTerms;
dbAsset._AmountPurchase = asset.AmountPurchase;
dbAsset._TaxCodeIdPurchase = asset.TaxCodeIdPurchase.ToInt();
dbAsset._AmountPurchaseGross = asset.AmountPurchaseGross;
dbAsset._AmountSettlementGross = asset.AmountSettlementGross;
dbAsset._AmountEnhancementGross = asset.AmountEnhancementGross;
dbAsset._AssocIdCustomer = asset.AssocIdCustomer.ToInt();
dbAsset._SellCategoryCode = asset.SellCategoryCode;
dbAsset._AmountSell = asset.AmountSell;
dbAsset._TaxCodeIdSell = asset.TaxCodeIdSell.ToInt();
dbAsset._AmountSellGross = asset.AmountSellGross;
dbAsset._TaxCodeIdProfit = asset.TaxCodeIdProfit.ToInt();
dbAsset._SoldOn = asset.SoldOn;
dbAsset._AmountSold = asset.AmountSold;
dbAsset._AmountSoldGross = asset.AmountSoldGross;
dbAsset._DisposeCode = asset.DisposeCode;
dbAsset._DisposeOn = asset.DisposeOn;
dbAsset._DueBackOn = asset.DueBackOn;
dbAsset._AmountRentalCost = asset.AmountRentalCost;
dbAsset._UomIdRentalCost = asset.UomIdRentalCost.ToInt();
dbAsset._TaxCodeIdRentalCost = asset.TaxCodeIdRentalCost.ToInt();
dbAsset._AmountRentalPrice = asset.AmountRentalPrice;
dbAsset._UomIdRentalPrice = asset.UomIdRentalPrice.ToInt();
dbAsset._TaxCodeIdRentalPrice = asset.TaxCodeIdRentalPrice.ToInt();
dbAsset._ProcessIdNext = asset.ProcessIdNext.ToInt();
// Common properties.
dbAsset._Notes = asset.Notes;
dbAsset._Status = SacsSystem.GetStatusCode(asset.Status);
dbAsset._Flags = (short)asset.Flags;
if (!SysId.IsValid(asset.Id))
{
dbAsset._CreateOn = DateTime.UtcNow;
dbAsset._CreateBy = dbUpdateInfo.UserId.ToInt();
dbAsset._CreateHost = dbUpdateInfo.Host;
}
dbAsset._UpdateOn = DateTime.UtcNow;
dbAsset._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbAsset._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom(SaAsset_Db dbAsset, SbmAsset asset)
{
asset.AssetCategoryId = new SysId(dbAsset._AssetCategoryId ?? 0);
asset.SerialNumber = dbAsset._SerialNumber;
asset.RefExt = dbAsset._RefExt;
asset.DescBrief = dbAsset._DescBrief;
asset.ItemId = new ItemId(dbAsset._ItemType ?? 0, new SysId(dbAsset._ItemId ?? 0));
asset.PurchaseOn = dbAsset._PurchaseOn ?? default(DateTime);
asset.AssocIdSupplier = new SysId(dbAsset._AssocIdSupplier ?? 0);
asset.PurchaseInvoiceRef = dbAsset._PurchaseInvoiceRef;
asset.PaymentTerms = dbAsset._PaymentTerms ?? 0;
asset.AmountPurchase = dbAsset._AmountPurchase ?? 0.0m;
asset.TaxCodeIdPurchase = new SysId(dbAsset._TaxCodeIdPurchase ?? 0);
asset.AmountPurchaseGross = dbAsset._AmountPurchaseGross ?? 0.0m;
asset.AmountSettlementGross = dbAsset._AmountSettlementGross ?? 0.0m;
asset.AmountEnhancementGross = dbAsset._AmountEnhancementGross ?? 0.0m;
asset.AssocIdCustomer = new SysId(dbAsset._AssocIdCustomer ?? 0);
asset.SellCategoryCode = dbAsset._SellCategoryCode;
asset.AmountSell = dbAsset._AmountSell ?? 0.0m;
asset.TaxCodeIdSell = new SysId(dbAsset._TaxCodeIdSell ?? 0);
asset.AmountSellGross = dbAsset._AmountSellGross ?? 0.0m;
asset.TaxCodeIdProfit = new SysId(dbAsset._TaxCodeIdProfit ?? 0);
asset.SoldOn = dbAsset._SoldOn ?? default(DateTime);
asset.AmountSold = dbAsset._AmountSold ?? 0.0m;
asset.AmountSoldGross = dbAsset._AmountSoldGross ?? 0.0m;
asset.DisposeCode = dbAsset._DisposeCode;
asset.DisposeOn = dbAsset._DisposeOn ?? default(DateTime);
asset.DueBackOn = dbAsset._DueBackOn ?? default(DateTime);
asset.AmountRentalCost = dbAsset._AmountRentalCost ?? 0.0m;
asset.UomIdRentalCost = new SysId(dbAsset._UomIdRentalCost ?? 0);
asset.TaxCodeIdRentalCost = new SysId(dbAsset._TaxCodeIdRentalCost ?? 0);
asset.AmountRentalPrice = dbAsset._AmountRentalPrice ?? 0.0m;
asset.UomIdRentalPrice = new SysId(dbAsset._UomIdRentalPrice ?? 0);
asset.TaxCodeIdRentalPrice = new SysId(dbAsset._TaxCodeIdRentalPrice ?? 0);
asset.ProcessIdNext = new SysId(dbAsset._ProcessIdNext ?? 0);
// Common properties.
asset.Notes = dbAsset._Notes;
asset.Status = SacsSystem.GetStatusForCode(dbAsset._Status);
asset.SetCreateStamp(dbAsset._CreateOn ?? default(DateTime), new SysId(dbAsset._CreateBy ?? 0), dbAsset._CreateHost);
asset.SetUpdateStamp(dbAsset._UpdateOn ?? default(DateTime), new SysId(dbAsset._UpdateBy ?? 0), dbAsset._UpdateHost);
asset.AcceptChanges();
}
//-------------------------------------------------------------------
// Asset column definitions.
private static readonly String aliasAsset = "aAst";
// AssetCategory Alias&Prefix.
private static readonly String aliasAsset_AssetCategory = "aAst_AstCat";
private static readonly String prefixAsset_AssetCategory = "Ast_AstCat_";
// AssetProcess Alias&Prefix.
private static readonly String aliasAsset_AssetProcess = "aAst_AstPrc";
private static readonly String prefixAsset_AssetProcess = "Ast_AstPrc_";
// ItemProcess Alias&Prefix.
private static readonly String aliasAsset_ItemProcess = "aAst_ItmPrc";
private static readonly String prefixAsset_ItemProcess = "Ast_ItmPrc_";
// Vehicle Alias&Prefix.
private static readonly String aliasAsset_Vehicle = "aAst_Veh";
private static readonly String prefixAsset_Vehicle = "Ast_Veh_";
// VehicleClass Alias&Prefix.
private static readonly String aliasAsset_VehicleClass = "aAst_VehCls";
private static readonly String prefixAsset_VehicleClass = "Ast_VehCls_";
private void SetAssetColDfn
(ColumnDfn col, String caption, int width, SbmDbDfn.ColumnIdx dbCol,
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataCategoryId = DataValue.DataType.String,
String alias = "", String prefix = "")
{
if (String.IsNullOrEmpty(alias) && SbmDbDfn.GetTableForColumn(dbCol) == SbmDbDfn.TableIdx.SaAsset)
alias = aliasAsset;
col.Set(caption, width, (int)dbCol, prefix + SbmDbDfn.GetColumnName(dbCol, false), SbmDbDfn.GetColumnNameQual(dbCol, alias), dataCategoryId, align);
if (dataCategoryId == DataValue.DataType.String && dbCol != SbmDbDfn.ColumnIdx.Unknown)
col.MaxLength = (int)SbmDbDfn.GetColTextLen(dbCol);
}
//-------------------------------------------------------------------
// Getting Asset column definition.
public override ColumnDfn GetAssetColumnDfn(SbmAsset.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
case SbmAsset.Column.Pos:
SetAssetColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
case SbmAsset.Column.Id:
SetAssetColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.SaAsset_Id, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
// Asset Properties.
case SbmAsset.Column.AssetCategoryId:
SetAssetColDfn(columnDfn, "Cat Id", 45, SbmDbDfn.ColumnIdx.SaAsset_AssetCategoryId, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmAsset.Column.Category_Type_Desc:
SetAssetColDfn(columnDfn, "Category type", 70, SbmDbDfn.ColumnIdx.SaAssetCategory_AssetType, ColumnAlignment.Center, DataValue.DataType.String, aliasAsset_AssetCategory, prefixAsset_AssetCategory);
break;
case SbmAsset.Column.Category_Code:
SetAssetColDfn(columnDfn, "Category code", 80, SbmDbDfn.ColumnIdx.SaAssetCategory_Code, ColumnAlignment.Center, DataValue.DataType.String, aliasAsset_AssetCategory, prefixAsset_AssetCategory);
break;
case SbmAsset.Column.Category_DescBrief:
SetAssetColDfn(columnDfn, "Category", 100, SbmDbDfn.ColumnIdx.SaAsset_DescBrief, ColumnAlignment.Default, DataValue.DataType.String, aliasAsset_AssetCategory, prefixAsset_AssetCategory);
break;
case SbmAsset.Column.SerialNumber:
SetAssetColDfn(columnDfn, "Serial", 80, SbmDbDfn.ColumnIdx.SaAsset_SerialNumber);
break;
case SbmAsset.Column.DescBrief:
SetAssetColDfn(columnDfn, "Desc", 140, SbmDbDfn.ColumnIdx.SaAsset_DescBrief);
break;
case SbmAsset.Column.PurchaseOn:
break;
case SbmAsset.Column.AmountPurchase:
SetAssetColDfn(columnDfn, "Purchase (net)", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountPurchase, ColumnAlignment.Right, DataValue.DataType.Double);
columnDfn.NumDecimals = 2;
break;
case SbmAsset.Column.AmountPurchaseGross:
SetAssetColDfn(columnDfn, "Purchase", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountPurchaseGross, ColumnAlignment.Right, DataValue.DataType.Double);
columnDfn.NumDecimals = 2;
break;
case SbmAsset.Column.SellCategoryDesc:
SetAssetColDfn(columnDfn, "Sale category", 90, SbmDbDfn.ColumnIdx.SaAsset_SellCategoryCode);
break;
case SbmAsset.Column.AmountSell:
SetAssetColDfn(columnDfn, "Sell (net)", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountSell, ColumnAlignment.Right, DataValue.DataType.Double);
columnDfn.NumDecimals = 2;
break;
case SbmAsset.Column.AmountSellGross:
SetAssetColDfn(columnDfn, "Sell", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountSellGross, ColumnAlignment.Right, DataValue.DataType.Double);
columnDfn.NumDecimals = 2;
break;
case SbmAsset.Column.SoldOn:
break;
case SbmAsset.Column.AmountSold:
SetAssetColDfn(columnDfn, "Amount sold", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountSold, ColumnAlignment.Right, DataValue.DataType.Double);
columnDfn.NumDecimals = 2;
break;
case SbmAsset.Column.DisposeCode:
break;
case SbmAsset.Column.DisposeOn:
break;
case SbmAsset.Column.DueBackOn:
break;
case SbmAsset.Column.AmountRentalCost:
SetAssetColDfn(columnDfn, "Rental cost", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountRentalCost, ColumnAlignment.Right, DataValue.DataType.Double);
columnDfn.NumDecimals = 2;
break;
case SbmAsset.Column.UomRentalCost_Id:
SetAssetColDfn(columnDfn, "Rental cost unit#", 80, SbmDbDfn.ColumnIdx.SaAsset_UomIdRentalCost, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmAsset.Column.UomRentalCost_Desc:
break;
case SbmAsset.Column.AmountRentalPrice:
SetAssetColDfn(columnDfn, "Rental price", 80, SbmDbDfn.ColumnIdx.SaAsset_AmountRentalPrice, ColumnAlignment.Right, DataValue.DataType.Double);
columnDfn.NumDecimals = 2;
break;
case SbmAsset.Column.UomRentalPrice_Id:
SetAssetColDfn(columnDfn, "Rental price unit#", 80, SbmDbDfn.ColumnIdx.SaAsset_UomIdRentalPrice, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmAsset.Column.UomRentalPrice_Desc:
break;
case SbmAsset.Column.ProcessIdNext:
SetAssetColDfn(columnDfn, "Next Process #", 80, SbmDbDfn.ColumnIdx.SaAsset_ProcessIdNext, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SbmAsset.Column.NextProcess_DescBrief:
SetAssetColDfn(columnDfn, "Next Process", 100, SbmDbDfn.ColumnIdx.Process_DescBrief, ColumnAlignment.Left, DataValue.DataType.String, aliasAsset_AssetProcess, prefixAsset_AssetProcess);
break;
case SbmAsset.Column.NextProcess_Expected:
SetAssetColDfn(columnDfn, "Next Process due", 100, SbmDbDfn.ColumnIdx.ItemLink_Completed, ColumnAlignment.Center, DataValue.DataType.Date, aliasAsset_ItemProcess, prefixAsset_ItemProcess);
break;
// Common properties.
case SbmAsset.Column.Notes:
SetAssetColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.SaAsset_Notes);
break;
case SbmAsset.Column.Flag:
SetAssetColDfn(columnDfn, "Flags", 40, SbmDbDfn.ColumnIdx.SaAsset_Flags, ColumnAlignment.Center, DataValue.DataType.Long);
break;
case SbmAsset.Column.Status:
SetAssetColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SaAsset_Status, ColumnAlignment.Center);
break;
case SbmAsset.Column.Status_Desc:
SetAssetColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SaAsset_Status);
break;
case SbmAsset.Column.Status_Ind:
SetAssetColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.SaAsset_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SbmAsset.Column.CreateOn_Date:
SetAssetColDfn(columnDfn, "Created", 65, SbmDbDfn.ColumnIdx.SaAsset_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.DateFormat = "d-MMM-yy";
columnDfn.ReadOnly = true;
break;
case SbmAsset.Column.UpdateOn_Date:
SetAssetColDfn(columnDfn, "Updated", 65, SbmDbDfn.ColumnIdx.SaAsset_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.DateFormat = "d-MMM-yy";
columnDfn.ReadOnly = true;
break;
case SbmAsset.Column.Warnings:
SetAssetColDfn(columnDfn, "Warnings", 200, SbmDbDfn.ColumnIdx.Unknown);
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Asset query filter.
public override List<string> GetAssetQueryFilter(SbmAsset.Params prm)
{
List<String> filter = new List<String>();
// Asset Id.
String includedIds = prm.IdsIncluded.Concat(",");
String colAsset_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset);
if (!includedIds.IsEmpty())
filter.Add($"{colAsset_Id} IN ({includedIds})");
String excludedIds = prm.IdsExcluded.Concat(",");
if (!excludedIds.IsEmpty())
filter.Add($"{colAsset_Id} NOT IN ({excludedIds})");
// Asset CategoryId.
String colSaAsset_CategoryId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AssetCategoryId, aliasAsset);
if (SysId.IsValid(prm.AssetCategoryId))
filter.Add($"{colSaAsset_CategoryId}={prm.AssetCategoryId.ToString()}");
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Item Type & Id.
String colAsset_ItemType = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ItemType, aliasAsset);
if (prm.ItemType > 0)
filter.Add($"{colAsset_ItemType}={(int)prm.ItemType}");
String colAsset_ItemId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ItemId, aliasAsset);
if (ItemId.IsValid(prm.ItemId))
filter.Add($"{colAsset_ItemId}={prm.ItemId.ToString()}");
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Partial SerialNumber.
String serialNumberFull = DbQuery.FormatForCondition(prm.SerialNumber);
String serialNumberPartial = DbQuery.FormatForCondition(prm.SerialNumberPartial);
String colAsset_SerialNumber = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber, aliasAsset);
if (!StringUtil.IsEmpty(serialNumberFull))
filter.Add($"{SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber, aliasAsset)}='{serialNumberFull}'");
else if (!StringUtil.IsEmpty(serialNumberPartial))
filter.Add($"{DbQuery.FormatFn_Left(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber, aliasAsset), prm.SerialNumberPartial.Length)}='{serialNumberPartial}'");
// Partial Description.
String description = DbQuery.FormatForCondition(prm.DescBriefPartial);
String colAsset_DescBrief = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DescBrief, aliasAsset);
if (!StringUtil.IsEmpty(description))
filter.Add($"{DbQuery.FormatFn_Left(colAsset_DescBrief, prm.DescBriefPartial.Length)}='{description}'");
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Next Process Id.
String colAsset_ProcessIdNext = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ProcessIdNext, aliasAsset);
if (SysId.IsValid(prm.ProcessIdNext))
filter.Add($"{colAsset_ProcessIdNext}={prm.ProcessIdNext.ToString()}");
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Active Process Id.
if (SysId.IsValid(prm.ProcessIdActive))
{
String aliasItemLink = "aAstItemLnk";
DbQuery qryProc = new DbQuery(Database.DbmsType);
qryProc.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), aliasItemLink));
qryProc.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasItemLink));
qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, aliasItemLink) + "=" + ((int)Sbm.ItemType.Asset).ToString());
qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasItemLink) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset));
qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, aliasItemLink) + "=" + ((int)Sbm.ItemType.Process).ToString());
qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, aliasItemLink) + "=" + prm.ProcessIdActive.ToString());
qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Status, aliasItemLink) + "='" + StatusAwaiting + "'");
filter.Add("EXISTS(" + qryProc.BuildQuery() + ")");
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Status.
String colAsset_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Status, aliasAsset);
if (prm.StatusCat == SbmAsset.StatusCat.ActiveOnly)
filter.Add(colAsset_Status + "='" + StatusActive + "'");
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
return filter;
}
// Asset sort columns.
public List<String> GetAssetSortColumns(SbmAsset.Params prm)
{
// Sort sequence:
List<String> sortColumnCodes = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for Asset columns in case of conflict.
String sortCol = String.Empty;
if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.SaAsset)
{
sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasAsset);
}
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.SaAsset_AssetCategoryId, aliasAsset) + " ASC");
}
return sortColumnCodes;
}
//-------------------------------------------------------------------
// Asset count.
private long GetAssetCount(String filter)
{
ClearErrorState();
return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset) + " As " + aliasAsset, filter);
}
public override long GetAssetCount(SbmAsset.Params prm)
{
ClearErrorState();
return GetAssetCount(GetAssetQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Asset list.
public override List<SbmAsset> GetAssetList(SbmAsset.Params prm)
{
ClearErrorState();
List<SbmAsset> assets = new List<SbmAsset>();
DbQuery qry = new DbQuery(Database.DbmsType);
qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset), aliasAsset);
SaAsset_Db dbAsset = new SaAsset_Db(DbInfo);
qry.Columns.AddRange(dbAsset.ExistingColumnNames);
qry.Filters.AddRange(GetAssetQueryFilter(prm));
qry.OrderBy.AddRange(GetAssetSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
{
dbAsset = new SaAsset_Db(DbInfo);
dbAsset.PopulateFrom(dbDataReader);
assets.Add(CreateAsset(dbAsset));
}
}
}
catch (Exception exc)
{
SetErrorState("Database query exception");
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return assets;
}
//-------------------------------------------------------------------
// Asset query execution.
public override DbResultSet ExecuteAssetQuery(List<ColumnDfn> columns, SbmAsset.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct build database query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAsset), aliasAsset);
// Asset Properties - add columns as defined in query list.
if (columns.HasId(SbmAsset.Column.Id))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset));
if (columns.HasId(SbmAsset.Column.SerialNumber))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SerialNumber, aliasAsset));
if (columns.HasId(SbmAsset.Column.DescBrief))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DescBrief, aliasAsset));
if (columns.HasId(SbmAsset.Column.PurchaseOn))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_PurchaseOn, aliasAsset));
if (columns.HasId(SbmAsset.Column.AmountPurchase))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountPurchase, aliasAsset));
if (columns.HasId(SbmAsset.Column.AmountPurchaseGross))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountPurchaseGross, aliasAsset));
if (columns.HasId(SbmAsset.Column.SellCategoryDesc))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SellCategoryCode, aliasAsset));
if (columns.HasId(SbmAsset.Column.AmountSell))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountSell, aliasAsset));
if (columns.HasId(SbmAsset.Column.AmountSellGross))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountSellGross, aliasAsset));
if (columns.HasId(SbmAsset.Column.SoldOn))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_SoldOn, aliasAsset));
if (columns.HasId(SbmAsset.Column.AmountSold))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountSold, aliasAsset));
if (columns.HasId(SbmAsset.Column.DisposeCode))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DisposeCode, aliasAsset));
if (columns.HasId(SbmAsset.Column.DisposeOn))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DisposeOn, aliasAsset));
if (columns.HasId(SbmAsset.Column.DueBackOn))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_DueBackOn, aliasAsset));
if (columns.HasId(SbmAsset.Column.AmountRentalCost))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountRentalCost, aliasAsset));
if (columns.HasId(SbmAsset.Column.AmountRentalPrice))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AmountRentalPrice, aliasAsset));
// Common Properties
if (columns.HasId(SbmAsset.Column.Notes))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Notes, aliasAsset));
if (columns.HasId(SbmAsset.Column.Flag))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Flags, aliasAsset));
if (columns.HasId(SbmAsset.Column.Status) || columns.HasId(SbmAsset.Column.Status_Desc) || columns.HasId(SbmAsset.Column.Status_Ind))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Status, aliasAsset));
if (columns.HasId(SbmAsset.Column.CreateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_CreateOn, aliasAsset));
if (columns.HasId(SbmAsset.Column.UpdateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_UpdateOn, aliasAsset));
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Asset category.
bool hasAssetCategoryCols = false;
if (!hasAssetCategoryCols) hasAssetCategoryCols = columns.HasId(SbmAsset.Column.Category_Type_Desc);
if (!hasAssetCategoryCols) hasAssetCategoryCols = columns.HasId(SbmAsset.Column.Category_Code);
if (!hasAssetCategoryCols) hasAssetCategoryCols = columns.HasId(SbmAsset.Column.Category_DescBrief);
if (hasAssetCategoryCols)
{
DbQueryJoin joinAssetCat = new DbQueryJoin(DbJoinType.LeftOuter);
joinAssetCat.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaAssetCategory), aliasAsset_AssetCategory);
joinAssetCat.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAssetCategory_Id, aliasAsset_AssetCategory) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_AssetCategoryId, aliasAsset));
query.Joins.Add(joinAssetCat);
// Add the Asset Category columns:
List<SbmDbDfn.ColumnIdx> dbColumns = new List<SbmDbDfn.ColumnIdx>()
{
SbmDbDfn.ColumnIdx.SaAssetCategory_AssetType,
SbmDbDfn.ColumnIdx.SaAssetCategory_Code,
SbmDbDfn.ColumnIdx.SaAssetCategory_DescBrief,
};
foreach (SbmDbDfn.ColumnIdx dbColumn in dbColumns)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAsset_AssetCategory), prefixAsset_AssetCategory + SbmDbDfn.GetColumnName(dbColumn, false));
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Vehicle & Vehicle Class.
bool hasVehicleCols = false;
bool hasVehClassCols = false;
if (!hasVehicleCols) hasVehicleCols = columns.HasId(SbmAsset.Column.Vehicle_RegNumber);
if (!hasVehicleCols) hasVehicleCols = columns.HasId(SbmAsset.Column.Vehicle_Vin);
if (!hasVehicleCols) hasVehicleCols = columns.HasId(SbmAsset.Column.Vehicle_KeyLocation);
if (!hasVehicleCols) hasVehicleCols = columns.HasId(SbmAsset.Column.Vehicle_Flags);
if (!hasVehicleCols) hasVehicleCols = columns.HasId(SbmAsset.Column.Vehicle_HpiAlert);
if (!hasVehClassCols) hasVehClassCols = columns.HasId(SbmAsset.Column.VehicleClass_MakeDesc);
if (!hasVehClassCols) hasVehClassCols = columns.HasId(SbmAsset.Column.VehicleClass_Model);
if (!hasVehClassCols) hasVehClassCols = columns.HasId(SbmAsset.Column.VehicleClass_Derivative);
if (!hasVehClassCols) hasVehClassCols = columns.HasId(SbmAsset.Column.VehicleClass_DescBrief);
if (hasVehicleCols || hasVehClassCols)
{
// Join to the vehicle table.
DbQueryJoin joinVehicle = new DbQueryJoin(DbJoinType.LeftOuter);
joinVehicle.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicle), aliasAsset_Vehicle);
joinVehicle.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_Id, aliasAsset_Vehicle) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ItemId, aliasAsset));
query.Joins.Add(joinVehicle);
// Add the Vehicle columns.
List<SbmDbDfn.ColumnIdx> dbVehicleColumns = new List<SbmDbDfn.ColumnIdx>();
dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_Id);
if (columns.HasId(SbmAsset.Column.Vehicle_RegNumber)) dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_RegNumber);
if (columns.HasId(SbmAsset.Column.Vehicle_Vin)) dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_VIN);
if (columns.HasId(SbmAsset.Column.Vehicle_KeyLocation)) dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_KeyLocation);
dbVehicleColumns.Add(SbmDbDfn.ColumnIdx.SaVehicle_Flags);
foreach (SbmDbDfn.ColumnIdx dbColumn in dbVehicleColumns)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAsset_Vehicle), prefixAsset_Vehicle + SbmDbDfn.GetColumnName(dbColumn, false));
if (hasVehClassCols)
{
// Join to the vehicle class table.
DbQueryJoin joinVehicleClass = new DbQueryJoin(DbJoinType.LeftOuter);
joinVehicleClass.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaVehicleClass), aliasAsset_VehicleClass);
joinVehicleClass.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicleClass_Id, aliasAsset_VehicleClass) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaVehicle_VehicleClassId, aliasAsset_Vehicle));
query.Joins.Add(joinVehicleClass);
// Add the Vehicle Class columns.
List<SbmDbDfn.ColumnIdx> dbVehicleClassColumns = new List<SbmDbDfn.ColumnIdx>();
dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Id);
if (columns.HasId(SbmAsset.Column.VehicleClass_MakeDesc)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_MakeCode);
if (columns.HasId(SbmAsset.Column.VehicleClass_Model)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Model);
if (columns.HasId(SbmAsset.Column.VehicleClass_Derivative)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_Derivative);
if (columns.HasId(SbmAsset.Column.VehicleClass_DescBrief)) dbVehicleClassColumns.Add(SbmDbDfn.ColumnIdx.SaVehicleClass_DescBrief);
//lCol.Insert (eSaDbColSaVehicleClass_Flags);
foreach (SbmDbDfn.ColumnIdx dbColumn in dbVehicleClassColumns)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAsset_VehicleClass), prefixAsset_VehicleClass + SbmDbDfn.GetColumnName(dbColumn, false));
}
}
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Next process.
if (columns.HasId(SbmAsset.Column.NextProcess_DescBrief))
{
// Join to the process table (for the definition of the asset category process):
DbQueryJoin joinProcess = new DbQueryJoin(DbJoinType.LeftOuter);
joinProcess.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Process), aliasAsset_AssetProcess);
joinProcess.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Process_Id, aliasAsset_AssetProcess) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ProcessIdNext, aliasAsset));
query.Joins.Add(joinProcess);
// Add the Process columns:
List<SbmDbDfn.ColumnIdx> dbProcessColumns = new List<SbmDbDfn.ColumnIdx>();
dbProcessColumns.Add(SbmDbDfn.ColumnIdx.Process_DescBrief);
foreach (SbmDbDfn.ColumnIdx dbColumn in dbProcessColumns)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAsset_AssetProcess), prefixAsset_AssetProcess + SbmDbDfn.GetColumnName(dbColumn, false));
}
if (columns.HasId(SbmAsset.Column.NextProcess_Expected))
{
// Join to the Item Link table to get information about this asset's process:
DbQueryJoin joinItemLink = new DbQueryJoin(DbJoinType.LeftOuter);
joinItemLink.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), aliasAsset_ItemProcess);
joinItemLink.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, aliasAsset_ItemProcess) + "=" + ((int)Sbm.ItemType.Asset).ToString());
joinItemLink.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasAsset_ItemProcess) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_Id, aliasAsset));
joinItemLink.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, aliasAsset_ItemProcess) + "=" + ((int)Sbm.ItemType.Process).ToString());
joinItemLink.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, aliasAsset_ItemProcess) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaAsset_ProcessIdNext, aliasAsset));
query.Joins.Add(joinItemLink);
// Add the ItemLink columns:
List<SbmDbDfn.ColumnIdx> dbItemLinkColumns = new List<SbmDbDfn.ColumnIdx>();
dbItemLinkColumns.Add(SbmDbDfn.ColumnIdx.ItemLink_Completed);
foreach (SbmDbDfn.ColumnIdx dbColumn in dbItemLinkColumns)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasAsset_ItemProcess), prefixAsset_ItemProcess + SbmDbDfn.GetColumnName(dbColumn, false));
}
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetAssetQueryFilter(prm));
if (prm.IdsIncluded.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetAssetSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}