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 GetLogProperties(SbmContainerItem containerItem) { return new List() { 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 filters = new List(); 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 GetContainerItemQueryFilter(SbmContainerItem.Params prm) { List filters = new List(); 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 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 GetContainerItemSortColumns(SbmContainerItem.Params prm) { // Sort sequence. String tableAliasContainerItem = StringUtil.OnEmpty(prm.TableAlias, aliasContainerItem); List sortColumnNames = new List(); 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 GetContainerItemList(SbmContainerItem.Params prm) { ClearErrorState(); List containerItems = new List(); 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 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 ContainCol = new List() { 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 AssociationCol = new List(); 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 AffCol = new List(); 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 AssCol = new List(); 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 AffCol = new List(); 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 CmdCol = new List(); 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)); } //------------------------------------------------------------------- } //======================================================================= }