Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmCommodityMgr_Dbas-ContainerItem.cs
T
2025-05-05 16:00:32 +01:00

952 lines
56 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.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
{
//=======================================================================
// Commodity Manager - Container Item.
//=======================================================================
partial class SbmCommodityMgr_Dbas
{
//-------------------------------------------------------------------
// Utilities.
private List<StringPair> GetLogProperties(SbmContainerItem containerItem)
{
return new List<StringPair>()
{
new StringPair("Id",SysId.ToString(containerItem.Id)),
new StringPair("ItemSeq", containerItem.ItemSeq.ToString()),
new StringPair("Status",containerItem.StatusCode)
};
}
public override String GetItemSource(Sbm.ItemType itemType, SysId itemId, bool brief = false)
{
String itemSource = "";
// identify the source item and retrieve its caption:
switch (itemType)
{
case Sbm.ItemType.Requirement:
{
SbmRequirement requirement = TransactionMgr.GetRequirementById(itemId);
if (requirement != null)
{
SbmTransaction transaction = TransactionMgr.GetTransactionById(requirement.TransactionId);
if (transaction != null)
itemSource =
(brief ? "" : GetTransTypeDesc(transaction.TransactionType) + ": ") + transaction.Ref + " " +
AccountMgr.GetAssociationTargetName(transaction.AssociationId) + (brief ? "" : " [" + transaction.Raised.Date.ToString() + "]");
}
break;
}
}
return itemSource;
}
public override ushort GetMaxItemSeq(SysId containerId, Sbm.ItemType itemType, SysId itemId)
{
ClearErrorState();
if (!HasErrorState())
{
String tableContainerItem = SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem);
String colContainerItem_ItemSeq = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemSeq);
List<String> filters = new List<String>();
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId) + "=" + containerId.ToString());
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemType) + "=" + ((int)itemType).ToString());
filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ContainerItem_ItemId) + "=" + itemId.ToString());
return (ushort)Database.GetRowValue(tableContainerItem, colContainerItem_ItemSeq, filters.Concat(" AND ", "(", ")")).AsLong();
}
return 0;
}
//-------------------------------------------------------------------
// Get ContainerItem.
public override SbmContainerItem GetContainerItem(SbmContainerItem.Params prm)
{
return GetContainerItem(GetContainerItemQueryFilter(prm).Concat(" AND ", "(", ")"));
}
private SbmContainerItem GetContainerItem(String filter)
{
ClearErrorState();
long count = GetContainerItemCount(filter);
if (count == 0) return null;
if (count != 1)
{
SetErrorState(ErrorMessage.MultipleItemsFound);
return null;
}
SbmContainerItem containerItem = null;
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
ContainerItem_Db dbContainerItem = new ContainerItem_Db(DbInfo);
dbContainerItem.PopulateFrom(dbCommand, aliasContainerItem, filter);
containerItem = CreateContainerItem(dbContainerItem);
}
catch (Exception exc)
{
SetErrorState(ErrorMessage.DatabaseQueryException);
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return containerItem;
}
//-------------------------------------------------------------------
// Create ContainerItem.
public override SbmContainerItem CreateContainerItem(SysId containerItemId, Sbm.ItemType itemType, SysId itemId)
{
return new SbmContainerItem_Dbas(containerItemId, itemType, itemId, 0);
}
private SbmContainerItem_Dbas CreateContainerItem(ContainerItem_Db dbContainerItem)
{
ClearErrorState();
SbmContainerItem_Dbas containerItem = new SbmContainerItem_Dbas(new SysId(dbContainerItem._ContainerId), (Sbm.ItemType)dbContainerItem._ItemType, new SysId(dbContainerItem._ItemId), (ushort)dbContainerItem._Flags);
PopulateFrom(dbContainerItem, containerItem);
return containerItem;
}
//-------------------------------------------------------------------
// Validate ContainerItem.
public override bool IsValidContainerItemData(SbmContainerItem.Data data, SbmContainerItem.ErrField errField)
{
ClearErrorState();
if (!base.IsValidContainerItemData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert ContainerItem.
public override bool InsertContainerItem(SbmContainerItem containerItem, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidContainerItem(containerItem)) return false;
if (SysId.IsValid(containerItem.Id)) return SetErrorState(ErrorMessage.ValidItemId);
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
ContainerItem_Db dbContainerItem = new ContainerItem_Db(DbInfo);
PopulateTo(dbContainerItem, containerItem, dbUpdateInfo);
dbContainerItem.ExecuteInsertCommand(dbCommand);
containerItem.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted. " + GetLogProperties(containerItem).Concat(": ").Concat("", "\n\t"));
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return OK;
}
//-------------------------------------------------------------------
// Update ContainerItem.
public override bool UpdateContainerItem(SbmContainerItem containerItem, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!IsValidContainerItem(containerItem)) return false;
if (!SysId.IsValid(containerItem.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
if (!containerItem.Changed)
{
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed. " + GetLogProperties(containerItem).Concat(": ").Concat("", "\n\t"));
return true;
}
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve ContainerItem.
dbConnection.Open();
ContainerItem_Db dbContainerItem = new ContainerItem_Db(DbInfo);
dbContainerItem.PopulateFrom(dbCommand, aliasContainerItem, "Id=" + SysId.ToString(containerItem.Id));
SbmUpdateLogItemMonitor_ContainerItem updateLogMonitor = new SbmUpdateLogItemMonitor_ContainerItem(Internals, CreateContainerItem(dbContainerItem));
// Update properties.
PopulateTo(dbContainerItem, containerItem, dbUpdateInfo);
dbContainerItem.ExecuteUpdateCommand(dbCommand);
containerItem.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated. " + GetLogProperties(containerItem).Concat(": ").Concat("", "\n\t"));
// Record updates.
updateLogMonitor.RecordUpdatedValues(containerItem);
updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return OK;
}
//-------------------------------------------------------------------
// Delete ContainerItem.
public override bool ContainerItemCanBeDeleted(SbmContainerItem containerItem)
{
ClearErrorState();
if (!base.ContainerItemCanBeDeleted(containerItem)) return false;
return true;
}
public override bool DeleteContainerItem(SbmContainerItem containerItem, DbUpdateInfo dbUpdateInfo)
{
ClearErrorState();
if (!ContainerItemCanBeDeleted(containerItem)) return false;
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve ContainerItem.
dbConnection.Open();
ContainerItem_Db dbContainerItem = new ContainerItem_Db(DbInfo);
dbContainerItem.PopulateFrom(dbCommand, aliasContainerItem, "Id=" + containerItem.Id.ToString());
// Delete ContainerItem.
dbCommand.CommandType = System.Data.CommandType.Text;
dbCommand.CommandText = "DELETE FROM " + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem) + " WHERE Id=" + SysId.ToString(containerItem.Id) + ";";
dbCommand.ExecuteNonQuery();
containerItem.Changed = false;
if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted. " + GetLogProperties(containerItem).Concat(": ").Concat("", "\n\t"));
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return OK;
}
//-------------------------------------------------------------------
// Copy data properties to and from database.
private void PopulateTo(ContainerItem_Db dbContainerItem, SbmContainerItem containerItem, DbUpdateInfo dbUpdateInfo)
{
dbContainerItem._ContainerId = SysId.ToInt(containerItem.ContainerItemId);
dbContainerItem._ItemType = (short)containerItem.ItemType;
dbContainerItem._ItemId = SysId.ToInt(containerItem.ItemId);
dbContainerItem._ItemSeq = containerItem.ItemSeq;
dbContainerItem._ItemTypeSource = (short)containerItem.ItemTypeSource;
dbContainerItem._ItemIdSource = SysId.ToInt(containerItem.ItemIdSource);
dbContainerItem._Quantity = containerItem.Quantity;
// Common properties.
dbContainerItem._Notes = containerItem.Notes;
dbContainerItem._Flags = (short)containerItem.Flags;
dbContainerItem._Status = SacsSystem.GetStatusCode(containerItem.Status);
if (!SysId.IsValid(containerItem.Id))
{
dbContainerItem._CreateOn = DateTime.UtcNow;
dbContainerItem._CreateBy = dbUpdateInfo.UserId.ToInt();
dbContainerItem._CreateHost = dbUpdateInfo.Host;
}
dbContainerItem._UpdateOn = DateTime.UtcNow;
dbContainerItem._UpdateBy = dbUpdateInfo.UserId.ToInt();
dbContainerItem._UpdateHost = dbUpdateInfo.Host;
}
private void PopulateFrom(ContainerItem_Db dbContainerItem, SbmContainerItem containerItem)
{
containerItem.ContainerId = new SysId(dbContainerItem._ContainerId);
containerItem.ItemType = (Sbm.ItemType)dbContainerItem._ItemType;
containerItem.ItemId = new SysId(dbContainerItem._ItemId);
containerItem.ItemSeq = dbContainerItem._ItemSeq;
containerItem.ItemTypeSource = (Sbm.ItemType)(dbContainerItem._ItemTypeSource ?? 0);
containerItem.ItemIdSource = new SysId(dbContainerItem._ItemIdSource ?? 0);
containerItem.Quantity = dbContainerItem._Quantity;
// Common properties.
containerItem.Notes = dbContainerItem._Notes;
containerItem.Status = SacsSystem.GetStatusForCode(dbContainerItem._Status);
containerItem.SetCreateStamp(dbContainerItem._CreateOn, new SysId(dbContainerItem._CreateBy), dbContainerItem._CreateHost);
containerItem.SetUpdateStamp(dbContainerItem._UpdateOn ?? default(DateTime), new SysId(dbContainerItem._UpdateBy ?? 0), dbContainerItem._UpdateHost);
containerItem.AcceptChanges();
}
//-------------------------------------------------------------------
// Column definitions.
private static readonly String aliasContainerItem = "aCntItm";
private static readonly String aliasContainerItem_Container = "CntItm_Con";
private static readonly String prefixContainerItem_Container = aliasContainerItem_Container + "_";
private static readonly String aliasContainerItem_Commodity = "CntItm_Cmd";
private static readonly String prefixContainerItem_Commodity = aliasContainerItem_Commodity + "_";
private static readonly String aliasContainerItem_TaxCode = "CntItm_Txc";
private static readonly String aliasContainerItem_AssocationSupplier = "CntItm_AssSupp";
private static readonly String prefixContainerItem_AssocationSupplier = aliasContainerItem_AssocationSupplier + "_";
private static readonly String aliasContainerItem_AssocationCustomer = "CntItm_AssCust";
private static readonly String prefixContainerItem_AssocationCustomer = aliasContainerItem_AssocationCustomer + "_";
private static readonly String aliasContainerItem_AffiliateSupplier = "CntItm_AffSupp";
private static readonly String prefixContainerItem_AffiliateSupplier = aliasContainerItem_AffiliateSupplier + "_";
private static readonly String aliasContainerItem_AffiliateCustomer = "CntItm_AffCust";
private static readonly String prefixContainerItem_AffiliateCustomer = aliasContainerItem_AffiliateCustomer + "_";
// Column names.
private static readonly String dataName_Items = "CntItm_ItemCount";
private static readonly String dataName_Movements = "CntItm_MoveCount";
private static readonly String dataName_Rrp = "CntItm_Rrp";
private static readonly String dataName_ImagePath = "CntItm_ImgPath";
// Column definition population.
private void SetContainerItemColDfn
(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.ContainerItem)
alias = aliasContainerItem;
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)Internals.GetColTextLen(dbCol);
}
//-------------------------------------------------------------------
// Getting ContainerItem column definition.
public override ColumnDfn GetContainerItemColumnDfn(SbmContainerItem.Column columnId, string caption = "", int width = 0)
{
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
switch (columnId)
{
case SbmContainerItem.Column.Pos:
SetContainerItemColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
columnDfn.ReadOnly = true;
columnDfn.Resizable = false;
break;
// ContainerItem Properties.
case SbmContainerItem.Column.Id:
SetContainerItemColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.ContainerItem_ContainerId, ColumnAlignment.Right, DataValue.DataType.Long);
columnDfn.ReadOnly = true;
break;
case SbmContainerItem.Column.ItemSeq:
SetContainerItemColDfn(columnDfn, "Item seq", 80, SbmDbDfn.ColumnIdx.ContainerItem_ItemSeq, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmContainerItem.Column.ItemType:
SetContainerItemColDfn(columnDfn, "Item type", 80, SbmDbDfn.ColumnIdx.ContainerItem_ItemType, ColumnAlignment.Center);
break;
case SbmContainerItem.Column.ItemId:
SetContainerItemColDfn(columnDfn, "Item Id", 80, SbmDbDfn.ColumnIdx.ContainerItem_ItemId, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmContainerItem.Column.SourceItemType:
SetContainerItemColDfn(columnDfn, "Source item type", 120, SbmDbDfn.ColumnIdx.ContainerItem_ItemTypeSource, ColumnAlignment.Center);
break;
case SbmContainerItem.Column.SourceItemId:
SetContainerItemColDfn(columnDfn, "Source item Id", 100, SbmDbDfn.ColumnIdx.ContainerItem_ItemIdSource, ColumnAlignment.Right, DataValue.DataType.Long);
break;
case SbmContainerItem.Column.SourceItem:
SetContainerItemColDfn(columnDfn, "Source", 160, SbmDbDfn.ColumnIdx.Unknown);
break;
case SbmContainerItem.Column.Quantity:
SetContainerItemColDfn(columnDfn, "Quantity", 65, SbmDbDfn.ColumnIdx.ContainerItem_Quantity, ColumnAlignment.Right, DataValue.DataType.Double);
columnDfn.NumDecimals = (byte)OrderQuantityDecimals;
break;
// Common properties.
case SbmContainerItem.Column.Notes:
SetContainerItemColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.ContainerItem_Notes);
break;
case SbmContainerItem.Column.Status:
SetContainerItemColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.ContainerItem_Status, ColumnAlignment.Center);
break;
case SbmContainerItem.Column.Status_Desc:
SetContainerItemColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.ContainerItem_Status, ColumnAlignment.Center);
break;
case SbmContainerItem.Column.Status_Ind:
SetContainerItemColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.ContainerItem_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SbmContainerItem.Column.CreateOn_Date:
SetContainerItemColDfn(columnDfn, "Created", 65, SbmDbDfn.ColumnIdx.ContainerItem_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
case SbmContainerItem.Column.UpdateOn_Date:
SetContainerItemColDfn(columnDfn, "Updated", 65, SbmDbDfn.ColumnIdx.ContainerItem_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date);
columnDfn.ReadOnly = true;
break;
//---------------------------------------------------------------
// Container details:
case SbmContainerItem.Column.Container_CategoryDesc:
SetContainerItemColDfn(columnDfn, "Container cat", 120, SbmDbDfn.ColumnIdx.Container_Category, ColumnAlignment.Center, DataValue.DataType.String, aliasContainerItem_Container, prefixContainerItem_Container);
break;
case SbmContainerItem.Column.Container_TypeDesc:
SetContainerItemColDfn(columnDfn, "Container type", 120, SbmDbDfn.ColumnIdx.Container_Type, ColumnAlignment.Center, DataValue.DataType.String, aliasContainerItem_Container, prefixContainerItem_Container);
break;
case SbmContainerItem.Column.Container_Reference:
SetContainerItemColDfn(columnDfn, "Container ref", 120, SbmDbDfn.ColumnIdx.Container_Reference, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_Container, prefixContainerItem_Container);
break;
case SbmContainerItem.Column.Container_DescBrief:
SetContainerItemColDfn(columnDfn, "Container description", 120, SbmDbDfn.ColumnIdx.Container_DescBrief, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_Container, prefixContainerItem_Container);
break;
case SbmContainerItem.Column.Container_TagId:
SetContainerItemColDfn(columnDfn, "Container Tag", 100, SbmDbDfn.ColumnIdx.Container_TagId, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_Container, prefixContainerItem_Container);
break;
case SbmContainerItem.Column.Container_AssIdSupplier:
SetContainerItemColDfn(columnDfn, "Supp Id", 55, SbmDbDfn.ColumnIdx.Container_AssIdSupplier, ColumnAlignment.Right, DataValue.DataType.Long, aliasContainerItem_Container, prefixContainerItem_Container);
break;
case SbmContainerItem.Column.Container_SupplierName:
SetContainerItemColDfn(columnDfn, "Supplier", 140, SbmDbDfn.ColumnIdx.Affiliate_Name, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_AffiliateSupplier, prefixContainerItem_AffiliateSupplier);
break;
case SbmContainerItem.Column.Container_AssIdCustomer:
SetContainerItemColDfn(columnDfn, "Cust Id", 55, SbmDbDfn.ColumnIdx.Container_AssIdCustomer, ColumnAlignment.Right, DataValue.DataType.Long, aliasContainerItem_Container, prefixContainerItem_Container);
break;
case SbmContainerItem.Column.Container_CustomerName:
SetContainerItemColDfn(columnDfn, "Customer", 140, SbmDbDfn.ColumnIdx.Affiliate_Name, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_AffiliateCustomer, prefixContainerItem_AffiliateCustomer);
break;
case SbmContainerItem.Column.Container_Expected:
SetContainerItemColDfn(columnDfn, "Expected", 75, SbmDbDfn.ColumnIdx.Container_Expected, ColumnAlignment.Center, DataValue.DataType.Date, aliasContainerItem_Container, prefixContainerItem_Container);
columnDfn.DateFormat = "d-MMM-yy";
break;
case SbmContainerItem.Column.Container_Notes:
SetContainerItemColDfn(columnDfn, "Container notes", 200, SbmDbDfn.ColumnIdx.Container_Notes, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_Container, prefixContainerItem_Container);
break;
case SbmContainerItem.Column.Container_StatusDesc:
SetContainerItemColDfn(columnDfn, "Status", 100, SbmDbDfn.ColumnIdx.Container_Status, ColumnAlignment.Center, DataValue.DataType.String, aliasContainerItem_Container, prefixContainerItem_Container);
break;
case SbmContainerItem.Column.Container_StatusInd:
SetContainerItemColDfn(columnDfn, "Status", 55, SbmDbDfn.ColumnIdx.Container_Status, ColumnAlignment.Center, DataValue.DataType.TriState, aliasContainerItem_Container, prefixContainerItem_Container);
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
break;
case SbmContainerItem.Column.Container_CreateOn:
SetContainerItemColDfn(columnDfn, "Created", 110, SbmDbDfn.ColumnIdx.Container_CreateOn, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasContainerItem_Container, prefixContainerItem_Container);
columnDfn.DateFormat = "d-MMM-yy";
break;
case SbmContainerItem.Column.Container_UpdateOn:
SetContainerItemColDfn(columnDfn, "Updated", 110, SbmDbDfn.ColumnIdx.Container_UpdateOn, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasContainerItem_Container, prefixContainerItem_Container);
columnDfn.DateFormat = "d-MMM-yy";
break;
case SbmContainerItem.Column.Container_ItemCount:
SetContainerItemColDfn(columnDfn, "Items", 55, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = dataName_Items;
break;
case SbmContainerItem.Column.Container_MovementCount:
SetContainerItemColDfn(columnDfn, "Moves", 55, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long);
columnDfn.DataName = dataName_Movements;
break;
//---------------------------------------------------------------
// Commodity details:
case SbmContainerItem.Column.Commodity_Id:
SetContainerItemColDfn(columnDfn, "Item Id", 80, SbmDbDfn.ColumnIdx.Commodity_Id, ColumnAlignment.Right, DataValue.DataType.Long, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
break;
case SbmContainerItem.Column.Commodity_Code:
SetContainerItemColDfn(columnDfn, "Item code", 90, SbmDbDfn.ColumnIdx.Commodity_Code, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
break;
case SbmContainerItem.Column.Commodity_DescBrief:
SetContainerItemColDfn(columnDfn, "Item", 120, SbmDbDfn.ColumnIdx.Commodity_DescBrief, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
break;
case SbmContainerItem.Column.Commodity_Dimensions:
SetContainerItemColDfn(columnDfn, "Dimensions", 100, SbmDbDfn.ColumnIdx.Commodity_Dimensions, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
break;
case SbmContainerItem.Column.Commodity_ICNTariffCode:
SetContainerItemColDfn(columnDfn, GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_ICNTariffCode, "ICN tariff"), 90, SbmDbDfn.ColumnIdx.Commodity_ICNTariffCode, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
break;
case SbmContainerItem.Column.Commodity_CostPrice_Unit:
SetContainerItemColDfn(columnDfn, "Cost price", 100, SbmDbDfn.ColumnIdx.Commodity_CostPrice, ColumnAlignment.Right, DataValue.DataType.Double, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (unit)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_CostPrice_Unit_Fmt:
SetContainerItemColDfn(columnDfn, "Cost price", 100, SbmDbDfn.ColumnIdx.Commodity_CostPrice, ColumnAlignment.Right, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (unit)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_CostPrice_Total:
SetContainerItemColDfn(columnDfn, "Cost price", 100, SbmDbDfn.ColumnIdx.Commodity_CostPrice, ColumnAlignment.Right, DataValue.DataType.Double, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (total)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_CostPrice_Total_Fmt:
SetContainerItemColDfn(columnDfn, "Cost price", 100, SbmDbDfn.ColumnIdx.Commodity_CostPrice, ColumnAlignment.Right, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (total)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_MaterialCurrencyId:
SetContainerItemColDfn(columnDfn, "Material currency", 110, SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial, ColumnAlignment.Left, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
break;
case SbmContainerItem.Column.Commodity_MaterialCost_Unit:
SetContainerItemColDfn(columnDfn, "Material cost", 110, SbmDbDfn.ColumnIdx.Commodity_MaterialCost, ColumnAlignment.Right, DataValue.DataType.Double, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (unit)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_MaterialCost_Unit_Fmt:
SetContainerItemColDfn(columnDfn, "Material cost", 110, SbmDbDfn.ColumnIdx.Commodity_MaterialCost, ColumnAlignment.Right, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (unit)";
break;
case SbmContainerItem.Column.Commodity_MaterialCost_Total:
SetContainerItemColDfn(columnDfn, "Material cost", 110, SbmDbDfn.ColumnIdx.Commodity_MaterialCost, ColumnAlignment.Right, DataValue.DataType.Double, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (total)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_MaterialCost_Total_Fmt:
SetContainerItemColDfn(columnDfn, "Material cost", 110, SbmDbDfn.ColumnIdx.Commodity_MaterialCost, ColumnAlignment.Right, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (total)";
break;
case SbmContainerItem.Column.Commodity_SalesPrice_Unit:
SetContainerItemColDfn(columnDfn, "Sales price", 90, SbmDbDfn.ColumnIdx.Commodity_SalesPrice, ColumnAlignment.Right, DataValue.DataType.Double, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (unit)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_SalesPrice_Unit_Fmt:
SetContainerItemColDfn(columnDfn, "Sales price", 100, SbmDbDfn.ColumnIdx.Commodity_SalesPrice, ColumnAlignment.Right, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (unit)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_SalesPrice_Total:
SetContainerItemColDfn(columnDfn, "Sales price", 90, SbmDbDfn.ColumnIdx.Commodity_SalesPrice, ColumnAlignment.Right, DataValue.DataType.Double, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (total)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_SalesPrice_Total_Fmt:
SetContainerItemColDfn(columnDfn, "Sales price", 100, SbmDbDfn.ColumnIdx.Commodity_SalesPrice, ColumnAlignment.Right, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (total)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_RetailPrice_Unit:
SetContainerItemColDfn(columnDfn, "Retail price", 90, SbmDbDfn.ColumnIdx.Commodity_RetailPrice, ColumnAlignment.Right, DataValue.DataType.Double, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (unit)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_RetailPrice_Unit_Fmt:
SetContainerItemColDfn(columnDfn, "Retail price", 100, SbmDbDfn.ColumnIdx.Commodity_RetailPrice, ColumnAlignment.Right, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (unit)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_RetailPrice_Total:
SetContainerItemColDfn(columnDfn, "Retail price", 90, SbmDbDfn.ColumnIdx.Commodity_RetailPrice, ColumnAlignment.Right, DataValue.DataType.Double, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (total)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_RetailPrice_Total_Fmt:
SetContainerItemColDfn(columnDfn, "Retail price", 100, SbmDbDfn.ColumnIdx.Commodity_RetailPrice, ColumnAlignment.Right, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
columnDfn.Caption = columnDfn.Caption + " (total)";
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_RRP:
SetContainerItemColDfn(columnDfn, "RRP", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double);
columnDfn.DataName = dataName_Rrp;
columnDfn.NumDecimals = CurrencyDecimalsDefault;
break;
case SbmContainerItem.Column.Commodity_Image:
SetContainerItemColDfn(columnDfn, "Image", 160, SbmDbDfn.ColumnIdx.Commodity_ImagePath, ColumnAlignment.Center, DataValue.DataType.String, aliasContainerItem_Commodity, prefixContainerItem_Commodity);
break;
}
if (!String.IsNullOrEmpty(caption))
columnDfn.Caption = caption;
if (width > 0)
columnDfn.Width = width;
return columnDfn;
}
//-------------------------------------------------------------------
// Query filter.
public override List<string> GetContainerItemQueryFilter(SbmContainerItem.Params prm)
{
List<String> filters = new List<String>();
String tableAliasContainerItem = StringUtil.OnEmpty(prm.TableAlias, aliasContainerItem);
//---------------------------------------------------------------
// Item Ids.
String colContainerItem_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId, tableAliasContainerItem);
String includedIds = prm.IdsIncluded.Concat(",");
if (!includedIds.IsEmpty())
filters.Add(colContainerItem_Id + " IN (" + includedIds + ")");
String excludedIds = prm.IdsExcluded.Concat(",");
if (!excludedIds.IsEmpty())
filters.Add(colContainerItem_Id + " NOT IN (" + excludedIds + ")");
//---------------------------------------------------------------
// Container filters.
bool containerTablePresent = !StringUtil.IsEmpty(prm.TableAlias_Container);
String tableAliasContainer = StringUtil.OnEmpty(prm.TableAlias_Container, "aCont");
SbmContainer.Params prmContainer = new SbmContainer.Params(prm);
prmContainer.TableAlias = tableAliasContainer;
prmContainer.IncludeDefaultFilter = false;
List<String> containerFilter = GetContainerQueryFilter(prmContainer);
if (containerFilter.Count > 0)
{
if (containerTablePresent)
filters.AddRange(containerFilter);
else
{
DbQuery qryCont = new DbQuery(Database.DbmsType);
qryCont.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Container), tableAliasContainer);
qryCont.Columns.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Container_Id), tableAliasContainer);
qryCont.Filters.Add(containerFilter.Concat(" And ", "(", ")"));
filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId, tableAliasContainerItem) + " In(" + qryCont.BuildQuery() + ")");
}
}
//---------------------------------------------------------------------
// Item.
if (prm.ItemType != Sbm.ItemType.Unknown)
filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemType, tableAliasContainerItem) + "=" + ((int)prm.ItemType).ToString());
if (prm.ItemIds.Count > 0)
filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemId, tableAliasContainerItem) + "In(" + prm.ItemIds.Concat(",") + ")");
//---------------------------------------------------------------------
// Source Item:
if (prm.ItemTypeSource != Sbm.ItemType.Unknown)
filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemTypeSource, tableAliasContainerItem) + "=" + ((int)prm.ItemTypeSource).ToString());
if (prm.ItemIdsSource.Count > 0)
filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemIdSource, tableAliasContainerItem) + "In(" + prm.ItemIdsSource.Concat(",") + ")");
//---------------------------------------------------------------------
// Active.
if (prm.StatusCat == SbmContainerItem.StatusCat.ActiveOnly)
filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_Status, tableAliasContainerItem) + " In('" + StatusActive + "')");
if (filters.Count < 1) filters.Add("1=1");
return filters;
}
//-------------------------------------------------------------------
// Sort columns.
public List<String> GetContainerItemSortColumns(SbmContainerItem.Params prm)
{
// Sort sequence.
String tableAliasContainerItem = StringUtil.OnEmpty(prm.TableAlias, aliasContainerItem);
List<String> sortColumnNames = new List<String>();
foreach (var columnDfn in prm.SortColumns)
{
// Need to ensure correct alias used for ContainerItem columns in case of conflict.
String sortCol = String.Empty;
if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.ContainerItem)
{
sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, tableAliasContainerItem);
}
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(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemType, tableAliasContainerItem) + " ASC");
}
return sortColumnNames;
}
//-------------------------------------------------------------------
// Item count.
private long GetContainerItemCount(String filter)
{
ClearErrorState();
return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem)} As {aliasContainerItem}", filter);
}
public override long GetContainerItemCount(SbmContainerItem.Params prm)
{
ClearErrorState();
return GetContainerItemCount(GetContainerItemQueryFilter(prm).Concat(" AND ", "(", ")"));
}
//-------------------------------------------------------------------
// Item list.
public override List<SbmContainerItem> GetContainerItemList(SbmContainerItem.Params prm)
{
ClearErrorState();
List<SbmContainerItem> containerItems = new List<SbmContainerItem>();
DbQuery DbQuery = new DbQuery(Database.DbmsType);
DbQuery.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem), aliasContainerItem);
ContainerItem_Db dbContainerItem = new ContainerItem_Db(DbInfo);
DbQuery.Columns.AddRange(dbContainerItem.ExistingColumnNames);
DbQuery.Filters.AddRange(GetContainerItemQueryFilter(prm));
DbQuery.OrderBy.AddRange(GetContainerItemSortColumns(prm));
// Query data.
using (var dbConnection = Database.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
dbCommand.CommandText = DbQuery.BuildQuery(prm.ResultsPaging);
using (DbDataReader dbDataReader = dbCommand.ExecuteReader())
{
while (dbDataReader.Read())
{
dbContainerItem = new ContainerItem_Db(DbInfo);
dbContainerItem.PopulateFrom(dbDataReader);
containerItems.Add(CreateContainerItem(dbContainerItem));
}
}
}
catch (Exception exc)
{
SetErrorState(ErrorMessage.DatabaseQueryException);
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return containerItems;
}
//-------------------------------------------------------------------
// Execute query.
public override DbResultSet ExecuteContainerItemQuery(List<ColumnDfn> columns, SbmContainerItem.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------
// Construct query.
DbQuery query = new DbQuery(Database.DbmsType);
query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem), aliasContainerItem);
//---------------------------------------------------------------
// ContainerItem Properties - add columns as defined in query list.
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId, aliasContainerItem));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemType, aliasContainerItem));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemId, aliasContainerItem));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemSeq, aliasContainerItem));
if (columns.HasId(SbmContainerItem.Column.SourceItemType) || columns.HasId(SbmContainerItem.Column.SourceItemId) || columns.HasId(SbmContainerItem.Column.SourceItem))
{
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemTypeSource));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemIdSource));
}
if (columns.HasId(SbmContainerItem.Column.Quantity) ||
columns.HasId(SbmContainerItem.Column.Commodity_CostPrice_Total) || columns.HasId(SbmContainerItem.Column.Commodity_CostPrice_Total_Fmt) ||
columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Total) || columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Total_Fmt) ||
columns.HasId(SbmContainerItem.Column.Commodity_SalesPrice_Total) || columns.HasId(SbmContainerItem.Column.Commodity_SalesPrice_Total_Fmt) ||
columns.HasId(SbmContainerItem.Column.Commodity_RetailPrice_Total) || columns.HasId(SbmContainerItem.Column.Commodity_RetailPrice_Total_Fmt))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_Quantity));
if (columns.HasId(SbmContainerItem.Column.Notes))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_Notes));
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_Flags));
if (columns.HasId(SbmContainerItem.Column.Status_Desc) || columns.HasId(SbmContainerItem.Column.Status_Ind))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_Status));
//---------------------------------------------------------------------
// Container.
bool hasContainerCols = columns.HasId(SbmContainerItem.Column.Container_CategoryDesc);
if (!hasContainerCols) hasContainerCols = columns.HasId(SbmContainerItem.Column.Container_TypeDesc);
if (!hasContainerCols) hasContainerCols = columns.HasId(SbmContainerItem.Column.Container_Reference);
if (!hasContainerCols) hasContainerCols = columns.HasId(SbmContainerItem.Column.Container_DescBrief);
if (!hasContainerCols) hasContainerCols = columns.HasId(SbmContainerItem.Column.Container_TagId);
if (!hasContainerCols) hasContainerCols = columns.HasId(SbmContainerItem.Column.Container_Expected);
if (!hasContainerCols) hasContainerCols = columns.HasId(SbmContainerItem.Column.Container_Notes);
if (!hasContainerCols) hasContainerCols = columns.HasId(SbmContainerItem.Column.Container_StatusDesc);
if (!hasContainerCols) hasContainerCols = columns.HasId(SbmContainerItem.Column.Container_StatusInd);
// Container supplier columns.
bool hasSupplierAssCols = false;
bool hasSupplierAffCols = false;
if (!hasSupplierAssCols) hasSupplierAssCols = (columns.HasId(SbmContainerItem.Column.Container_AssIdSupplier));
if (!hasSupplierAffCols) hasSupplierAffCols = (columns.HasId(SbmContainerItem.Column.Container_SupplierName));
// Container Customer columns.
bool hasCustomerAssCols = false;
bool hasCustomerAffCols = false;
if (!hasCustomerAssCols) hasCustomerAssCols = (columns.HasId(SbmContainerItem.Column.Container_AssIdCustomer));
if (!hasCustomerAffCols) hasCustomerAffCols = (columns.HasId(SbmContainerItem.Column.Container_CustomerName));
if (hasContainerCols)
{
// Join to the container.
prm.TableAlias_Container = aliasContainerItem_Container;
DbQueryJoin joinCont = new DbQueryJoin(DbJoinType.LeftOuter);
joinCont.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Container), aliasContainerItem_Container);
joinCont.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_Id, aliasContainerItem_Container) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId));
query.Joins.Add(joinCont);
// Add the Container columns.
List<SbmDbDfn.ColumnIdx> ContainCol = new List<SbmDbDfn.ColumnIdx>()
{
SbmDbDfn.ColumnIdx.Container_Category,
SbmDbDfn.ColumnIdx.Container_Type,
SbmDbDfn.ColumnIdx.Container_Reference,
SbmDbDfn.ColumnIdx.Container_DescBrief,
SbmDbDfn.ColumnIdx.Container_TagId,
SbmDbDfn.ColumnIdx.Container_Expected,
SbmDbDfn.ColumnIdx.Container_Notes,
SbmDbDfn.ColumnIdx.Container_Status
};
foreach (SbmDbDfn.ColumnIdx dbColumn in ContainCol)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasContainerItem_Container), prefixContainerItem_Container + SbmDbDfn.GetColumnName(dbColumn, false));
// Container supplier columns.
if (hasSupplierAssCols || hasSupplierAffCols
)
{
// Supplier association.
DbQueryJoin joinAss = new DbQueryJoin(DbJoinType.LeftOuter);
joinAss.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasContainerItem_AssocationSupplier);
joinAss.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, aliasContainerItem_AssocationSupplier) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_AssIdSupplier, aliasContainerItem_Container));
query.Joins.Add(joinAss);
// Add the Association columns.
List<SbmDbDfn.ColumnIdx> AssociationCol = new List<SbmDbDfn.ColumnIdx>();
AssociationCol.Add(SbmDbDfn.ColumnIdx.Association_Code);
foreach (SbmDbDfn.ColumnIdx dbColumn in AssociationCol)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasContainerItem_AssocationSupplier), prefixContainerItem_AssocationSupplier + SbmDbDfn.GetColumnName(dbColumn, false));
if (hasSupplierAffCols)
{
// Supplier affiliate.
DbQueryJoin joinAff = new DbQueryJoin(DbJoinType.LeftOuter);
joinAff.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasContainerItem_AffiliateSupplier);
joinAff.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasContainerItem_AffiliateSupplier) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, aliasContainerItem_AssocationSupplier));
query.Joins.Add(joinAff);
// Add the Affiliate columns.
List<SbmDbDfn.ColumnIdx> AffCol = new List<SbmDbDfn.ColumnIdx>();
AffCol.Add(SbmDbDfn.ColumnIdx.Affiliate_Name);
foreach (SbmDbDfn.ColumnIdx dbColumn in AffCol)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasContainerItem_AffiliateSupplier), prefixContainerItem_AffiliateSupplier + SbmDbDfn.GetColumnName(dbColumn, false));
}
}
// Container Customer columns.
if (hasCustomerAssCols || hasCustomerAffCols)
{
// Customer association.
DbQueryJoin joinAss = new DbQueryJoin(DbJoinType.LeftOuter);
joinAss.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasContainerItem_AssocationCustomer);
joinAss.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, aliasContainerItem_AssocationCustomer) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_AssIdCustomer, aliasContainerItem_Container));
query.Joins.Add(joinAss);
// Add the Association columns.
List<SbmDbDfn.ColumnIdx> AssCol = new List<SbmDbDfn.ColumnIdx>();
AssCol.Add(SbmDbDfn.ColumnIdx.Association_Code);
foreach (SbmDbDfn.ColumnIdx dbColumn in AssCol)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasContainerItem_AssocationCustomer), prefixContainerItem_AssocationCustomer + SbmDbDfn.GetColumnName(dbColumn, false));
if (hasCustomerAffCols)
{
// Customer affiliate:
DbQueryJoin joinAff = new DbQueryJoin(DbJoinType.LeftOuter);
joinAff.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasContainerItem_AffiliateCustomer);
joinAff.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasContainerItem_AffiliateCustomer) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, aliasContainerItem_AssocationCustomer));
query.Joins.Add(joinAff);
// Add the Affiliate columns.
List<SbmDbDfn.ColumnIdx> AffCol = new List<SbmDbDfn.ColumnIdx>();
AffCol.Add(SbmDbDfn.ColumnIdx.Affiliate_Name);
foreach (SbmDbDfn.ColumnIdx dbColumn in AffCol)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasContainerItem_AffiliateCustomer), prefixContainerItem_AffiliateCustomer + SbmDbDfn.GetColumnName(dbColumn, false));
}
}
}
//---------------------------------------------------------------------
// Commodity:
bool hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_Id);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_Code);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_DescBrief);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_Dimensions);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_ICNTariffCode);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_CostPrice_Unit);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_CostPrice_Unit_Fmt);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_CostPrice_Total);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_CostPrice_Total_Fmt);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_MaterialCurrencyId);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Unit);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Unit_Fmt);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Total);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Total_Fmt);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_SalesPrice_Unit);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_SalesPrice_Unit_Fmt);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_SalesPrice_Total);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_SalesPrice_Total_Fmt);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_RetailPrice_Unit);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_RetailPrice_Unit_Fmt);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_RetailPrice_Total);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_RetailPrice_Total_Fmt);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_RRP);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_Image);
if (!hasCommodityCols) hasCommodityCols = columns.HasId(SbmContainerItem.Column.Commodity_Notes);
if (hasCommodityCols)
{
// Join to the Commodity:
DbQueryJoin joinCont = new DbQueryJoin(DbJoinType.LeftOuter);
joinCont.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity), aliasContainerItem_Commodity);
joinCont.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasContainerItem_Commodity) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemId));
query.Joins.Add(joinCont);
// Add the Commodity columns.
List<SbmDbDfn.ColumnIdx> CmdCol = new List<SbmDbDfn.ColumnIdx>();
CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_Id);
if (columns.HasId(SbmContainerItem.Column.Commodity_Code)) CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_Code);
if (columns.HasId(SbmContainerItem.Column.Commodity_DescBrief)) CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_DescBrief);
if (columns.HasId(SbmContainerItem.Column.Commodity_Dimensions)) CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_Dimensions);
if (columns.HasId(SbmContainerItem.Column.Commodity_ICNTariffCode)) CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_ICNTariffCode);
if (columns.HasId(SbmContainerItem.Column.Commodity_CostPrice_Unit) || columns.HasId(SbmContainerItem.Column.Commodity_CostPrice_Unit_Fmt) ||
columns.HasId(SbmContainerItem.Column.Commodity_CostPrice_Total) || columns.HasId(SbmContainerItem.Column.Commodity_CostPrice_Total_Fmt))
CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_CostPrice);
if (columns.HasId(SbmContainerItem.Column.Commodity_MaterialCurrencyId) || columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Unit_Fmt) || columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Total_Fmt))
CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial);
if (columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Unit) || columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Unit_Fmt) ||
columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Total) || columns.HasId(SbmContainerItem.Column.Commodity_MaterialCost_Total_Fmt))
CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_MaterialCost);
if (columns.HasId(SbmContainerItem.Column.Commodity_SalesPrice_Unit) || columns.HasId(SbmContainerItem.Column.Commodity_SalesPrice_Unit_Fmt) ||
columns.HasId(SbmContainerItem.Column.Commodity_SalesPrice_Total) || columns.HasId(SbmContainerItem.Column.Commodity_SalesPrice_Total_Fmt) ||
columns.HasId(SbmContainerItem.Column.Commodity_RRP))
CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_SalesPrice);
if (columns.HasId(SbmContainerItem.Column.Commodity_RetailPrice_Unit) || columns.HasId(SbmContainerItem.Column.Commodity_RetailPrice_Unit_Fmt) ||
columns.HasId(SbmContainerItem.Column.Commodity_RetailPrice_Total) || columns.HasId(SbmContainerItem.Column.Commodity_RetailPrice_Total_Fmt))
CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_RetailPrice);
if (columns.HasId(SbmContainerItem.Column.Commodity_Image)) CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_ImagePath);
if (columns.HasId(SbmContainerItem.Column.Commodity_Notes)) CmdCol.Add(SbmDbDfn.ColumnIdx.Commodity_Notes);
foreach (SbmDbDfn.ColumnIdx dbColumn in CmdCol)
query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasContainerItem_Commodity), prefixContainerItem_Commodity + SbmDbDfn.GetColumnName(dbColumn, false));
// RRP requires tax rate:
if (columns.HasId(SbmContainerItem.Column.Commodity_RRP))
{
DbQueryJoin joinTax = new DbQueryJoin(DbJoinType.LeftOuter);
joinTax.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.TaxCode), aliasContainerItem_TaxCode);
joinTax.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.TaxCode_Id, aliasContainerItem_TaxCode) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_TaxCodeId, aliasContainerItem_Commodity));
joinTax.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.TaxCode_Status, aliasContainerItem_TaxCode) + "='" + StatusCurrent + "'");
query.Joins.Add(joinTax);
// Calculate RRP: SalesPrice + TaxRate%;
String colRRP = "(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesPrice, aliasContainerItem_Commodity) + "*(1.0+(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.TaxCode_TaxRate, aliasContainerItem_TaxCode) + "/100.0)))";
query.Columns.Add(colRRP, dataName_Rrp);
}
}
//---------------------------------------------------------------------
// Count subordinate data items.
if (columns.HasId(SbmContainer.Column.ItemCount))
{
// Build sub query to directly return the number of associated items.
String aliasItemCount = "ItmCount";
DbQuery qryItemCount = new DbQuery(Database.DbmsType);
qryItemCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem), aliasItemCount));
qryItemCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId, aliasItemCount) + ")");
qryItemCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId, aliasItemCount) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId));
query.Columns.Add("(" + qryItemCount.BuildQuery() + ")", dataName_Items);
}
if (columns.HasId(SbmContainer.Column.MovementCount))
{
// Table aliases for linked Movement table & Build sub query to directly return the number of associated movements.
String aliasMovementCount = "MoveCount";
DbQuery qryMoveCount = new DbQuery(Database.DbmsType);
qryMoveCount.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), aliasMovementCount));
qryMoveCount.Columns.Add("Count(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Id, aliasMovementCount) + ")");
qryMoveCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemType, aliasMovementCount) + "=" + ((int)Sbm.ItemType.Container).ToString());
qryMoveCount.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemId, aliasMovementCount) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId));
query.Columns.Add("(" + qryMoveCount.BuildQuery() + ")", dataName_Movements);
}
//---------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetContainerItemQueryFilter(prm));
if (prm.IdsIncluded.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetContainerItemSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------
//return new DbResultSet_DataTableReader(Database, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}