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.Base; using Sarand.Net.Standard.Dbas.Data; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Threading.Tasks; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { //======================================================================= // Commodity Manager - Commodity. //======================================================================= partial class SbmCommodityMgr_Dbas { //------------------------------------------------------------------- // Data members. private bool locationIdListsPopulated = false; private readonly List locationIds_All = new List(); private readonly List locationIds_Calc = new List(); private readonly List locationIds_Sales = new List(); private readonly List locationIds_NonSales = new List(); //------------------------------------------------------------------- // Utilities. private List GetLogProperties(SbmCommodity commodity) { return new List() { new StringPair("Id",SysId.ToString(commodity.Id)), new StringPair("Code",commodity.Code), new StringPair("DescBrief",commodity.DescBrief), new StringPair("Status",commodity.StatusCode) }; } //------------------------------------------------------------------- public override List GetCommodityTypesInUse() { List types = new List(); // Construct the query. DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity)); qry.Columns.Add("DISTINCT " + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Type)); qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AffIdOwner) + "=" + AffiliateId_Owner.ToString()); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery())) { while (dbResultSet != null && dbResultSet.NextRecord()) { NamedValue.Map values = dbResultSet.GetRecordValues(); types.Add((Sbm.CommodityType)values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_Type)).AsLong()); } } return types; } public override Sbm.CommodityType GetTypeForCommodityId(SysId commodityId) { String colType = "Type"; ClearErrorState(); Sbm.CommodityType commodityType = Sbm.CommodityType.Unknown; if (!SysId.IsValid(commodityId)) return commodityType; // Construct the query. DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity)); qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Type), colType); qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id) + "=" + commodityId.ToString()); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery())) { if (dbResultSet != null && dbResultSet.NextRecord()) { NamedValue.Map values = dbResultSet.GetRecordValues(); commodityType = (Sbm.CommodityType)values.GetValue(colType).AsLong(); } } return commodityType; } public override double GetCostPriceForCommodityId(SysId commodityId) { String colCostPrice = "CostPrice"; ClearErrorState(); double costPrice = 0.0f; if (Database == null && SysId.IsValid(commodityId)) { // Construct the query. DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity)); qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CostPrice), colCostPrice); qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id) + "=" + commodityId.ToString()); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery())) { if (dbResultSet != null && dbResultSet.NextRecord()) { NamedValue.Map values = dbResultSet.GetRecordValues(); costPrice = values.GetValue(colCostPrice).ToNumeric(); } } } return costPrice; } public override List GetSalesTemplateCommmodities() { List commodities = new List(); String aliasCommodity = "aCmd"; String aliasCommodityTemplate = "aCmdTmpl"; // Construct the query. DbQuery qry = new DbQuery(Database.DbmsType); qry.DistinctRows = true; qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity), aliasCommodity); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity), aliasCommodityTemplate); qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodityTemplate)); qry.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Code, aliasCommodityTemplate)); qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CommodityIdSalesProj, aliasCommodity) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodityTemplate)); qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AffIdOwner, aliasCommodityTemplate) + "=" + AffiliateId_Owner.ToString()); qry.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AffIdOwner, aliasCommodity) + "=" + AffiliateId_Owner.ToString()); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qry.BuildQuery())) { while (dbResultSet != null && dbResultSet.NextRecord()) { NamedValue.Map values = dbResultSet.GetRecordValues(); commodities.Add(new SysIdString(new SysId((int)values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_Id)).AsLong()), values.GetValue(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_Code)).ToString())); } } return commodities; } public override bool UpdateReferencesToSalesTemplate(SbmCommodity commodity) { ClearErrorState(); if (commodity == null) return SetErrorState(ErrorMessage.InvalidStatus); // Build update query to refresh all commodities that refer to this template. List filters = new List(); filters.Add(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_CommodityIdSalesProj) + "=" + commodity.Id.ToString()); // Calculate monthly sales proportions. String salesProjMonthlyProp = ""; double totalSalesProp = 0.0f; double[] salesProp = new double[12]; int i = 0; for (i = 0; i < 12; i++) { salesProp[i] = (double)commodity.GetSalesProp(i + 1); salesProjMonthlyProp += (i > 0 ? "," : "") + StringUtil.FormatNumeric(salesProp[i], 2); totalSalesProp += salesProp[i]; } for (i = 0; i < 12; i++) { // Spread the projected sales evenly if the total proportion is invalid. if (totalSalesProp <= 0) salesProp[i] = 1 / 12; else // Otherwise, calculate the actual proportion to apply. salesProp[i] /= totalSalesProp; } // Build the list of columns to update to bring each commodity into line with this template. int propDecimals = 5; int ordQtyDecimals = Internals.GetOwnerOption_NumericDecimals(Sbm.OrgOption_NumericDecimals.OrderQuantity); List value = new List(); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonthlyProp), salesProjMonthlyProp, true); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth01), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[0], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth02), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[1], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth03), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[2], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth04), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[3], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth05), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[4], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth06), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[5], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth07), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[6], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth08), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[7], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth09), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[8], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth10), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[9], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth11), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[10], (ushort)propDecimals), ordQtyDecimals), false); SacsDatabase.AddValuePair(value, SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth12), DbQuery.FormatFn_Round(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual) + "*" + StringUtil.FormatNumeric(salesProp[11], (ushort)propDecimals), ordQtyDecimals), false); // Perform the update: Database.ExecuteUpdate(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity), value, filters.Concat(" AND ", "(", ")")); if (Database.HasErrorState()) SetErrorState($"{Database.ErrorStateMessage}"); return OK; } //------------------------------------------------------------------- // Building the DateTime Query methods. //--------------------------------------------------------------- // Sales Quantity Query. public String BuildSalesQuantityQuery(DateTime earliest, DateTime latest, bool completeOrders, String tableAliasCommodity) { tableAliasCommodity = StringUtil.OnEmpty(tableAliasCommodity, aliasCommodity); // Calculate the quantity against sales orders for this commodity. // Filter: // Requirements for the commodity. // Requirement is not cancelled. // Orders created between the two dates. // Order is not cancelled. // Common definitions. String alias_Transaction = "SQT"; String alias_Requirement = "SQR"; String colTrans_AffIdOwner = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_AffIdOwner, alias_Transaction); String colTrans_Raised = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Raised, alias_Transaction); String colTrans_Closed = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Closed, alias_Transaction); String colTrans_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Type, alias_Transaction); String colTrans_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Status, alias_Transaction); String colReqnt_CmdId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_CommodityId, alias_Requirement); String colReqnt_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Status, alias_Requirement); // Requirements for this commodity: DbQuery qryReq = new DbQuery(Database.DbmsType); qryReq.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), alias_Transaction)); qryReq.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), alias_Requirement)); qryReq.Columns.Add("SUM(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Quantity, alias_Requirement) + ")"); qryReq.Filters.Add(colTrans_AffIdOwner + "=" + AffiliateId_Owner.ToString()); qryReq.Filters.Add(colTrans_Type + "=" + ((int)Sbm.TransactionType.SalesOrder).ToString()); if (completeOrders) { if (DateUtil.IsValid(earliest)) qryReq.Filters.Add(colTrans_Closed + ">=" + DbQuery.FormatDateForCondition(earliest)); if (DateUtil.IsValid(latest)) qryReq.Filters.Add(colTrans_Closed + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(latest, 1))); } else { if (earliest.IsValid()) qryReq.Filters.Add(colTrans_Raised + ">=" + DbQuery.FormatDateForCondition(earliest)); if (latest.IsValid()) qryReq.Filters.Add(colTrans_Raised + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(latest, 1))); } qryReq.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, alias_Transaction) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, alias_Requirement)); qryReq.Filters.Add(colReqnt_CmdId + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, tableAliasCommodity)); if (completeOrders) qryReq.Filters.Add(colTrans_Status + "='" + StatusCompleted + "'"); else qryReq.Filters.Add(colTrans_Status + "<>'" + StatusCancelled + "'"); qryReq.Filters.Add(colReqnt_Status + "<>'" + StatusCancelled + "'"); return qryReq.BuildQuery(); } //--------------------------------------------------------------- // Allocated Stock Query. public String BuildAllocatedStockQuery(List locIds) { // Calculate the pending movements sourced to sales order requirements. String tableAliasMov = "StkAllMov"; DbQuery qryAll = new DbQuery(Database.DbmsType); qryAll.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), tableAliasMov)); qryAll.Columns.Add("SUM(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Quantity, tableAliasMov) + ")"); qryAll.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemType, tableAliasMov) + "=" + ((int)Sbm.ItemType.Commodity).ToString()); qryAll.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemId, tableAliasMov) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); qryAll.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_LocationIdFrom, tableAliasMov) + " IN (" + locIds.Concat(",") + ")"); qryAll.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemTypeSource, tableAliasMov) + "=" + ((int)Sbm.ItemType.Requirement).ToString()); qryAll.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Status, tableAliasMov) + "='" + StatusAwaiting + "'"); return qryAll.BuildQuery(); } //--------------------------------------------------------------- // Currency Stock Query. public String BuildCurrentStockQuery(List locIds) { // Calculate the current stock level. String aliasStockLevel = "aCmdStkLvl"; DbQuery qryLvl = new DbQuery(Database.DbmsType); qryLvl.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.StockLevel), aliasStockLevel)); qryLvl.Columns.Add("SUM(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Quantity, aliasStockLevel) + ")"); qryLvl.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Type, aliasStockLevel) + "=" + (int)Sbm.StockLevelType.CurrentLevel); qryLvl.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_CommodityId, aliasStockLevel) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); qryLvl.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_LocationId, aliasStockLevel) + " IN (" + locIds.Concat(",") + ")"); qryLvl.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Status, aliasStockLevel) + "='" + StatusCurrent + "'"); return qryLvl.BuildQuery(); } //--------------------------------------------------------------- // Planned stock movements. public class PlannedStockMovements_Params { public PlannedStockMovements_Params() { earliest = DateTime.MinValue; latest = DateTime.MinValue; moveCol = PlanStockMoveCol.ItemQuanity; intoStock = true; provisionalContainersOnly = false; excludeAwaitingContainers = false; tableAliasCommodity = aliasCommodity; } public DateTime earliest; public DateTime latest; public SbmCommodity.Params prmCmd; public enum PlanStockMoveCol { ItemQuanity, MovementDate, }; public PlanStockMoveCol moveCol; public bool intoStock; public bool provisionalContainersOnly; public bool excludeAwaitingContainers; public String tableAliasCommodity; public String commodityIdCol; } // Stock Movements Query. public String BuildPlannedStockMovementsQuery(DateTime earliest, DateTime latest, SbmCommodity.Params prmCmd, bool intoStock, bool provisional, String tableAliasCommodity) { PlannedStockMovements_Params prm = new PlannedStockMovements_Params(); prm.earliest = earliest; prm.latest = latest; prm.prmCmd = prmCmd; prm.intoStock = intoStock; prm.provisionalContainersOnly = provisional; prm.tableAliasCommodity = StringUtil.OnEmpty(tableAliasCommodity, aliasCommodity); return BuildPlannedStockMovementsQuery(prm); } /// Calculate the quantity due to arrive into stock in the next month. This includes: /// ~ Planned movements to stock locations (from non-stock locations) for > The commodity itself which Containers that include the commodity and then take away. /// ~ Planned movements from stock locations (to non-stock locations) for > The commodity itself which Containers that include the commodity. /// public String BuildPlannedStockMovementsQuery(PlannedStockMovements_Params prm) { // In case this routine is called in isolation (eg. from Requirement manager). PopulateLocationIdLists(); DbmsType dbmsType = Database.DbmsType; // Common definitions. String alias_ContainerItem = "M1CI"; String alias_Container = "M1C"; String alias_Movement = "M1M"; String colMov_Movement = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, alias_Movement); String colMov_LocationIdFrom = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_LocationIdFrom, alias_Movement); String colMov_LocationIdTo = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_LocationIdTo, alias_Movement); String colMov_ItemType = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemType, alias_Movement); String colMov_ItemId = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemId, alias_Movement); String colMov_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Type, alias_Movement); String colMov_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Status, alias_Movement); // Commodity identity column. String commodityIdCol = prm.commodityIdCol; if (StringUtil.IsBlank(commodityIdCol)) commodityIdCol = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, prm.tableAliasCommodity); // Stock locations. SysId locStockId = prm.prmCmd.LocationIdStock; List LocStockIds = new List(); if (prm.prmCmd.StockLocationFilter == Sbm.LocationFilter.All) LocStockIds = locationIds_All; else if (prm.prmCmd.StockLocationFilter == Sbm.LocationFilter.Calc) LocStockIds = locationIds_Calc; else if (!SysId.IsValid(locStockId)) LocStockIds = locationIds_Sales; String stringLocStockIds = LocStockIds.Concat(","); //--------------------------------------------------------------- // Planned stock movements for this commodity. DbQuery qryMov1 = new DbQuery(Database.DbmsType); qryMov1.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), alias_Movement)); qryMov1.Filters.Add(colMov_ItemType + "=" + ((int)Sbm.ItemType.Commodity).ToString()); qryMov1.Filters.Add(colMov_ItemId + "=" + commodityIdCol); qryMov1.Filters.Add(colMov_Type + "=" + ((int)Sbm.MovementType.StockTransfer).ToString() + " OR " + colMov_Type + "=" + ((int)Sbm.MovementType.SalesAllocation).ToString()); if (prm.earliest.IsValid()) qryMov1.Filters.Add(colMov_Movement + ">=" + DbQuery.FormatDateForCondition(prm.earliest)); if (prm.latest.IsValid()) qryMov1.Filters.Add(colMov_Movement + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(prm.latest, 1))); if (prm.intoStock) { if (SysId.IsValid(locStockId)) { qryMov1.Filters.Add(colMov_LocationIdTo + "=" + locStockId.ToString()); } else if (!stringLocStockIds.IsEmpty()) { qryMov1.Filters.Add(colMov_LocationIdFrom + " NOT IN (" + stringLocStockIds + ")"); qryMov1.Filters.Add(colMov_LocationIdTo + " IN (" + stringLocStockIds + ")"); } } else { if (SysId.IsValid(locStockId)) { qryMov1.Filters.Add(colMov_LocationIdFrom + "=" + locStockId.ToString()); } else if (!stringLocStockIds.IsEmpty()) { qryMov1.Filters.Add(colMov_LocationIdFrom + " IN (" + stringLocStockIds + ")"); qryMov1.Filters.Add(colMov_LocationIdTo + " NOT IN (" + stringLocStockIds + ")"); } } if (prm.provisionalContainersOnly) // There won't be any commodity movements with status 'provisional', at least no functionality for this at the moment! // But this keeps the logic in the method clean and consistent (just a bit of Db I/O overhead). qryMov1.Filters.Add(colMov_Status + "='" + StatusProvisional + "'"); else qryMov1.Filters.Add(colMov_Status + "='" + StatusAwaiting + "'"); // Need 2 versions of the query. // a. To count the records. // b. To retrieve the quantity sum (when there is at least 1 record). // This avoids getting a null value for the sum when there are no matching records. qryMov1.Columns.Clear(); qryMov1.Columns.Add("Count(1)"); String qryMov1a = qryMov1.BuildQuery(); qryMov1.Columns.Clear(); if (prm.moveCol == PlannedStockMovements_Params.PlanStockMoveCol.MovementDate) qryMov1.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, alias_Movement)); else qryMov1.Columns.Add("SUM(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Quantity, alias_Movement) + ")"); String qryMov1b = qryMov1.BuildQuery(); //--------------------------------------------------------------- // Planned stock movements for containers that include this commodity. String qryMov2a = ""; String qryMov2b = ""; if (Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Container))) { DbQuery qryMov2 = new DbQuery(Database.DbmsType); qryMov2.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem), alias_ContainerItem)); qryMov2.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Container), alias_Container)); qryMov2.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), alias_Movement)); // Container. qryMov2.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_Id, alias_Container) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId, alias_ContainerItem)); //qryMov2.Filters.Add= SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_AffIdOwner,alias_Container)+"="+AffiliateId_Owner.ToString()); if (prm.provisionalContainersOnly) qryMov2.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_Status, alias_Container) + " IN ('" + StatusProvisional + "')"); else if (prm.excludeAwaitingContainers) qryMov2.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_Status, alias_Container) + " NOT IN ('" + StatusAwaiting + "','" + StatusProvisional + "','" + StatusDisabled + "','" + StatusCancelled + "','" + StatusDeleted + "')"); else qryMov2.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_Status, alias_Container) + " NOT IN ('" + StatusProvisional + "','" + StatusDisabled + "','" + StatusCancelled + "','" + StatusDeleted + "')"); // Container item must identify the Commodity. qryMov2.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemType, alias_ContainerItem) + "=" + ((int)Sbm.ItemType.Commodity).ToString()); qryMov2.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemId, alias_ContainerItem) + "=" + commodityIdCol); qryMov2.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_Status, alias_ContainerItem) + " NOT IN('" + StatusCancelled + "','" + StatusDisabled + "','" + StatusDeleted + "')"); // Movement. qryMov2.Filters.Add(colMov_ItemType + "=" + (((int)Sbm.ItemType.Container).ToString()).ToString()); qryMov2.Filters.Add(colMov_ItemId + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_Id, alias_Container)); qryMov2.Filters.Add(colMov_Type + "=" + ((int)Sbm.MovementType.StockTransfer).ToString() + " OR " + colMov_Type + "=" + ((int)Sbm.MovementType.SalesAllocation).ToString()); if (prm.earliest.IsValid()) qryMov2.Filters.Add(colMov_Movement + ">=" + DbQuery.FormatDateForCondition(prm.earliest)); if (prm.latest.IsValid()) qryMov2.Filters.Add(colMov_Movement + "<" + DbQuery.FormatDateForCondition(DateUtil.IncrementDate(prm.latest, 1))); if (prm.intoStock) { if (SysId.IsValid(locStockId)) qryMov2.Filters.Add(colMov_LocationIdTo + "=" + locStockId.ToString()); else if (!stringLocStockIds.IsEmpty()) { qryMov2.Filters.Add(colMov_LocationIdFrom + " NOT IN (" + stringLocStockIds + ")"); qryMov2.Filters.Add(colMov_LocationIdTo + " IN (" + stringLocStockIds + ")"); } } else { if (SysId.IsValid(locStockId)) qryMov2.Filters.Add(colMov_LocationIdFrom + "=" + locStockId.ToString()); else if (!stringLocStockIds.IsEmpty()) { qryMov2.Filters.Add(colMov_LocationIdFrom + " IN (" + stringLocStockIds + ")"); qryMov2.Filters.Add(colMov_LocationIdTo + " NOT IN (" + stringLocStockIds + ")"); } } qryMov2.Filters.Add(colMov_Status + "='" + StatusAwaiting + "'"); // Need 2 versions of the query (as above). qryMov2.Columns.Clear(); qryMov2.Columns.Add("Count(1)"); qryMov2a = qryMov2.BuildQuery(); qryMov2.Columns.Clear(); if (prm.moveCol == PlannedStockMovements_Params.PlanStockMoveCol.MovementDate) qryMov2.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, alias_Movement)); else qryMov2.Columns.Add("SUM(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_Quantity, alias_ContainerItem) + ")"); qryMov2b = qryMov2.BuildQuery(); } //--------------------------------------------------------------- // If the movement date is requested, union the commodity and container movement queries to return a single list of dates. if (prm.moveCol == PlannedStockMovements_Params.PlanStockMoveCol.MovementDate) { if (!StringUtil.IsBlank(qryMov2a) && !StringUtil.IsBlank(qryMov2b)) return "(" + qryMov1b + ") UNION (" + qryMov2b + ")"; else return qryMov1b; } String sQry; if (dbmsType == DbmsType.MsSql) { // MS SQL syntax: if (!qryMov2a.IsEmpty() && !qryMov2b.IsEmpty()) sQry = "IsNull((" + qryMov1b + "),0) + IsNull((" + qryMov2b + "),0)"; else sQry = "IsNull((" + qryMov1b + "),0)"; } else { // Calculate the total (MS Access version). // NB The 'nz' function supplies an alternative value to use when the first parameter is null. // This is required as the sub-queries will return null if there are no matching rows to sum: if (!qryMov2a.IsEmpty() && !qryMov2b.IsEmpty()) sQry = "iif((" + qryMov1a + ")=0,0,(" + qryMov1b + "))+iif((" + qryMov2a + ")=0,0,(" + qryMov2b + "))"; else sQry = "iif((" + qryMov1a + ")=0,0,(" + qryMov1b + "))"; } return sQry; //--------------------------------------------------------------- } //------------------------------------------------------------------- // Populate LocationId Lists. public void PopulateLocationIdLists() { if (locationIdListsPopulated) return; locationIdListsPopulated = true; // Verify that the location table exists. String tableLocation = SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Location); if (!Database.TableExists(tableLocation)) return; String colLocation_Id = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Location_Id); String colLocation_AffIdOwner = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Location_AffIdOwner); String colLocation_Flags = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Location_Flags); String colLocation_Status = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.Location_Status); // Stock locations. DbQuery qryLoc = new DbQuery(Database.DbmsType); qryLoc.Tables.Add(tableLocation); qryLoc.Columns.Add(colLocation_Id); qryLoc.Columns.Add(colLocation_Flags); qryLoc.Columns.Add(colLocation_Status); qryLoc.Filters.Add(colLocation_AffIdOwner + "=" + AffiliateId_Owner.ToString()); using (DbResultSet dbResultSet = DbResultSet_DataReader.ExecuteQuery(Database, qryLoc.BuildQuery())) { while (dbResultSet != null && dbResultSet.NextRecord()) { NamedValue.Map values = dbResultSet.GetRecordValues(); SysId locationId = new SysId((int)values.GetValue(colLocation_Id).AsLong()); short flags = values.GetValue(colLocation_Flags).ToString().ToShort(); SaStatus status = SacsSystem.GetStatusForCode(values.GetValue(colLocation_Status).ToString()); if (status == SaStatus.Active) { locationIds_All.Add(locationId); if (SacsHierarchyItem.GetFlag((ushort)flags, SbmLocation.Flag_CalculateStock)) locationIds_Calc.Add(locationId); if (SacsHierarchyItem.GetFlag((ushort)flags, SbmLocation.Flag_SalesStock)) locationIds_Sales.Add(locationId); else locationIds_NonSales.Add(locationId); } } } if (locationIds_Sales.Count > 0) { // Assume that all locations are for sales. locationIds_Sales.Clear(); locationIds_Sales.AddIds(locationIds_NonSales); locationIds_NonSales.Clear(); } } //------------------------------------------------------------------- // Get Commodity. public override SbmCommodity GetCommodity(SbmCommodity.Params prm) { return GetCommodity(GetCommodityQueryFilter(prm).Concat(" AND ", "(", ")")); } private SbmCommodity GetCommodity(String filter) { ClearErrorState(); long count = GetCommodityCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState(ErrorMessage.MultipleItemsFound); return null; } SbmCommodity commodity = null; // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Commodity_Db dbCommodity = new Commodity_Db(DbInfo); dbCommodity.PopulateFrom(dbCommand, aliasCommodity, filter); commodity = CreateCommodity(dbCommodity); } catch (Exception exc) { SetErrorState(ErrorMessage.DatabaseQueryException); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return commodity; } //------------------------------------------------------------------- // Create Commodity. public override SbmCommodity CreateCommodity(Sbm.CommodityType commodityType, String code) { return new SbmCommodity_Dbas(null, AffiliateId_Owner, commodityType, code, 0); } private SbmCommodity_Dbas CreateCommodity(Commodity_Db dbCommodity) { ClearErrorState(); SbmCommodity_Dbas commodity = new SbmCommodity_Dbas(new SysId(dbCommodity._Id), new SysId(dbCommodity._AffIdOwner), (Sbm.CommodityType)dbCommodity._Type, dbCommodity._Code, (ushort)dbCommodity._Flags); PopulateFrom(dbCommodity, commodity); return commodity; } //------------------------------------------------------------------- // Validate Commodity. public override bool IsValidCommodityData(SbmCommodity.Data data, SbmCommodity.ErrField errField) { ClearErrorState(); if (!base.IsValidCommodityData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert Commodity. public override bool InsertCommodity(SbmCommodity commodity, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidCommodity(commodity)) return false; if (SysId.IsValid(commodity.Id)) return SetErrorState(ErrorMessage.ValidItemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); Commodity_Db dbCommodity = new Commodity_Db(DbInfo); PopulateTo(dbCommodity, commodity, dbUpdateInfo); if (Commodity_Db.FieldsNonId.Contains("Id")) { // Generate next Id. dbCommodity._Id = SysId.ToInt(Database.GetNextId("Commodity", dbUpdateInfo)); } dbCommodity.ExecuteInsertCommand(dbCommand); commodity.Id = new SysId(dbCommodity._Id); commodity.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted. " + GetLogProperties(commodity).Concat(": ").Concat("", "\n\t")); } catch (Exception exc) { SetErrorState(exc.Message); } } return OK; } //------------------------------------------------------------------- // Update Commodity. public override bool UpdateCommodity(SbmCommodity commodity, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidCommodity(commodity)) return false; if (!SysId.IsValid(commodity.Id)) return SetErrorState(ErrorMessage.InvalidItemId); if (!commodity.Changed) { if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed. " + GetLogProperties(commodity).Concat(": ").Concat("", "\n\t")); return true; } using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve commodity. dbConnection.Open(); Commodity_Db dbCommodity = new Commodity_Db(DbInfo); dbCommodity.PopulateFrom(dbCommand, aliasCommodity, "Id=" + SysId.ToString(commodity.Id)); SbmUpdateLogItemMonitor_Commodity updateLogMonitor = new SbmUpdateLogItemMonitor_Commodity(Internals, CreateCommodity(dbCommodity)); // Update properties. PopulateTo(dbCommodity, commodity, dbUpdateInfo); dbCommodity.ExecuteUpdateCommand(dbCommand); commodity.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated. " + GetLogProperties(commodity).Concat(": ").Concat("", "\n\t")); // Record updates. updateLogMonitor.RecordUpdatedValues(commodity); updateLogMonitor.LogUpdates(); } catch (Exception exc) { SetErrorState(exc.Message); } } return OK; } //------------------------------------------------------------------- // Delete Commodity. public override bool CommodityCanBeDeleted(SbmCommodity commodity) { ClearErrorState(); if (!base.CommodityCanBeDeleted(commodity)) return false; return true; } public override bool DeleteCommodity(SbmCommodity commodity, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!CommodityCanBeDeleted(commodity)) return false; using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve Commodity. dbConnection.Open(); Commodity_Db dbCommodity = new Commodity_Db(DbInfo); dbCommodity.PopulateFrom(dbCommand, aliasCommodity, "Id=" + commodity.Id.ToString()); // Delete Commodity. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity) + " WHERE Id=" + SysId.ToString(commodity.Id) + ";"; dbCommand.ExecuteNonQuery(); commodity.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted. " + GetLogProperties(commodity).Concat(": ").Concat("", "\n\t")); } catch (Exception exc) { SetErrorState(exc.Message); } } return OK; } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo(Commodity_Db dbCommodity, SbmCommodity commodity, DbUpdateInfo dbUpdateInfo) { dbCommodity._Id = commodity.Id.ToInt(); dbCommodity._AffIdOwner = commodity.AffiliateIdOwner.ToInt(); dbCommodity._Type = (short)commodity.CommodityType; dbCommodity._Code = commodity.Code; dbCommodity._DescBrief = commodity.DescBrief; dbCommodity._DescOrder = commodity.DescOrder; dbCommodity._DescDetail = commodity.DescDetail; dbCommodity._DrawingNo = commodity.DrawingNumber; dbCommodity._DrawingIssue = commodity.DrawingIssue; dbCommodity._AssetCatId = commodity.AssetCatId.ToInt(); dbCommodity._ImagePath = commodity.ImagePath; dbCommodity._Category = commodity.Category1; dbCommodity._Category2 = commodity.Category2; dbCommodity._Category3 = commodity.Category3; dbCommodity._Location = commodity.Location; dbCommodity._Department = commodity.Department; dbCommodity._CatalogRef = commodity.CatalogRef; dbCommodity._Weight = commodity.Weight; dbCommodity._UomIdWeight = commodity.UomIdWeight.ToInt(); dbCommodity._Length = commodity.Length; dbCommodity._UomIdLength = commodity.UomIdLength.ToInt(); dbCommodity._Volume = commodity.Volume; dbCommodity._UomIdVolume = commodity.UomIdVolume.ToInt(); dbCommodity._Density = commodity.Density; dbCommodity._UomIdDensity = commodity.UomIdDensity.ToInt(); dbCommodity._BoxQuantity = commodity.BoxQuantity; dbCommodity._UomIdBox = commodity.UomIdBox.ToInt(); dbCommodity._Dimensions = commodity.Dimensions; dbCommodity._SpecSummary = commodity.SpecSummary; dbCommodity._RangeCode = commodity.RangeCode; dbCommodity._ColourCode = commodity.ColourCode; dbCommodity._SourceCode = commodity.SourceCode; dbCommodity._SupplyMethodCode = commodity.SupplyMethodCode; dbCommodity._HandlingCode = commodity.HandlingCode; dbCommodity._DeliveryCode = commodity.DeliveryCode; dbCommodity._MaterialCode = commodity.MaterialCode; dbCommodity._FinishCode = commodity.FinishCode; dbCommodity._PromotionCode = commodity.PromotionCode; dbCommodity._NominalCode = commodity.NominalCode; dbCommodity._NominalCodePurchase = commodity.NominalCodePurchase; dbCommodity._ICNTariffCode = commodity.ICNTariffCode; dbCommodity._TimeProd = commodity.TimeProd; dbCommodity._UomIdTimeProd = commodity.UomIdTimeProd.ToInt(); dbCommodity._AssIdSupplier = commodity.AssociationIdSupplier.ToInt(); dbCommodity._SupplierRef = commodity.SupplierRef; dbCommodity._CostPrice = commodity.CostPrice; dbCommodity._PlaceOfOrigin = commodity.PlaceOfOrigin; dbCommodity._MaterialCost = commodity.MaterialCost; dbCommodity._CurrencyIdMaterial = commodity.CurrencyIdMaterial.ToInt(); dbCommodity._ExWorksCost = commodity.ExWorksCost; dbCommodity._CurrencyIdExWorks = commodity.CurrencyIdExWorks.ToInt(); dbCommodity._ReorderLevel = commodity.ReorderLevel; dbCommodity._ReorderQty = commodity.ReorderQty; dbCommodity._QtyOnOrder = commodity.QtyOnOrder; dbCommodity._AssIdCustomer = commodity.AssociationIdCustomer.ToInt(); dbCommodity._SalesPrice = commodity.SalesPrice; dbCommodity._RetailPrice = commodity.RetailPrice; dbCommodity._RetailPricePlanned = commodity.RetailPricePlanned; dbCommodity._UomIdSale = commodity.UomIdSale.ToInt(); dbCommodity._CarriageCostIndicative = commodity.CarriageCostIndicative; dbCommodity._MinOrderQty = commodity.MinOrderQty; dbCommodity._PackQty = commodity.PackQtySale; dbCommodity._TaxCodeId = commodity.TaxCodeId.ToInt(); dbCommodity._LastOrderDate = commodity.LastOrderDate; dbCommodity._LastOrderQty = commodity.LastOrderQty; dbCommodity._QtyInStock = commodity.QtyInStock; dbCommodity._QtyAllocated = commodity.QtyAllocated; dbCommodity._FreeStock = commodity.FreeStock; dbCommodity._StockTakeDate = commodity.StockTakeDate; dbCommodity._StockTakeQty = commodity.StockTakeQty; dbCommodity._CommodityIdSalesProj = commodity.CommodityIdSalesProj.ToInt(); dbCommodity._SalesProjAnnual = commodity.SalesProjAnnual; dbCommodity._SalesProjMonth01 = commodity.SalesProjMonth01; dbCommodity._SalesProjMonth02 = commodity.SalesProjMonth02; dbCommodity._SalesProjMonth03 = commodity.SalesProjMonth03; dbCommodity._SalesProjMonth04 = commodity.SalesProjMonth04; dbCommodity._SalesProjMonth05 = commodity.SalesProjMonth05; dbCommodity._SalesProjMonth06 = commodity.SalesProjMonth06; dbCommodity._SalesProjMonth07 = commodity.SalesProjMonth07; dbCommodity._SalesProjMonth08 = commodity.SalesProjMonth08; dbCommodity._SalesProjMonth09 = commodity.SalesProjMonth09; dbCommodity._SalesProjMonth10 = commodity.SalesProjMonth10; dbCommodity._SalesProjMonth11 = commodity.SalesProjMonth11; dbCommodity._SalesProjMonth12 = commodity.SalesProjMonth12; // Common properties. dbCommodity._Notes = commodity.Notes; dbCommodity._Status = SacsSystem.GetStatusCode(commodity.Status); dbCommodity._Flags = (short)commodity.Flags; if (!SysId.IsValid(commodity.Id)) { dbCommodity._CreateOn = DateTime.UtcNow; dbCommodity._CreateBy = dbUpdateInfo.UserId.ToInt(); dbCommodity._CreateHost = dbUpdateInfo.Host; } dbCommodity._UpdateOn = DateTime.UtcNow; dbCommodity._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbCommodity._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom(Commodity_Db dbCommodity, SbmCommodity commodity) { //commodity.Id = new SysId(dbCommodity._Id); commodity.AffiliateIdOwner = new SysId(dbCommodity._AffIdOwner); commodity.CommodityType = (Sbm.CommodityType)dbCommodity._Type; commodity.Code = dbCommodity._Code; commodity.DescBrief = dbCommodity._DescBrief; commodity.DescOrder = dbCommodity._DescOrder; commodity.DescDetail = dbCommodity._DescDetail; commodity.DrawingNumber = dbCommodity._DrawingNo; commodity.DrawingIssue = dbCommodity._DrawingIssue; commodity.AssetCatId = new SysId(dbCommodity._AssetCatId); commodity.ImagePath = dbCommodity._ImagePath; commodity.Category1 = dbCommodity._Category; commodity.Category2 = dbCommodity._Category2; commodity.Category3 = dbCommodity._Category3; commodity.Location = dbCommodity._Location; commodity.Department = dbCommodity._Department; commodity.CatalogRef = dbCommodity._CatalogRef; commodity.Weight = dbCommodity._Weight ?? 0.0m; commodity.UomIdWeight = new SysId(dbCommodity._UomIdWeight); commodity.Length = dbCommodity._Length ?? 0.0m; commodity.UomIdLength = new SysId(dbCommodity._UomIdLength); commodity.Volume = dbCommodity._Volume ?? 0.0m; commodity.UomIdVolume = new SysId(dbCommodity._UomIdVolume); commodity.Density = dbCommodity._Density ?? 0; commodity.UomIdDensity = new SysId(dbCommodity._UomIdDensity); commodity.BoxQuantity = dbCommodity._BoxQuantity ?? 0; commodity.UomIdBox = new SysId(dbCommodity._UomIdBox); commodity.Dimensions = dbCommodity._Dimensions; commodity.SpecSummary = dbCommodity._SpecSummary; commodity.RangeCode = dbCommodity._RangeCode; commodity.ColourCode = dbCommodity._ColourCode; commodity.SourceCode = dbCommodity._SourceCode; commodity.SupplyMethodCode = dbCommodity._SupplyMethodCode; commodity.HandlingCode = dbCommodity._HandlingCode; commodity.DeliveryCode = dbCommodity._DeliveryCode; commodity.MaterialCode = dbCommodity._MaterialCode; commodity.FinishCode = dbCommodity._FinishCode; commodity.PromotionCode = dbCommodity._PromotionCode; commodity.NominalCode = dbCommodity._NominalCode; commodity.NominalCodePurchase = dbCommodity._NominalCodePurchase; commodity.ICNTariffCode = dbCommodity._ICNTariffCode; commodity.TimeProd = dbCommodity._TimeProd ?? 0.0m; commodity.UomIdTimeProd = new SysId(dbCommodity._UomIdTimeProd); commodity.AssociationIdSupplier = new SysId(dbCommodity._AssIdSupplier); commodity.SupplierRef = dbCommodity._SupplierRef; commodity.CostPrice = dbCommodity._CostPrice ?? 0.0m; commodity.PlaceOfOrigin = dbCommodity._PlaceOfOrigin; commodity.MaterialCost = dbCommodity._MaterialCost ?? 0.0m; commodity.CurrencyIdMaterial = new SysId(dbCommodity._CurrencyIdMaterial); commodity.ExWorksCost = dbCommodity._ExWorksCost ?? 0.0m; commodity.CurrencyIdExWorks = new SysId(dbCommodity._CurrencyIdExWorks); commodity.ReorderLevel = dbCommodity._ReorderLevel ?? 0.0m; commodity.ReorderQty = dbCommodity._ReorderQty ?? 0.0m; commodity.QtyOnOrder = dbCommodity._QtyOnOrder ?? 0.0m; commodity.AssociationIdCustomer = new SysId(dbCommodity._AssIdCustomer); commodity.SalesPrice = dbCommodity._SalesPrice ?? 0.0m; commodity.RetailPrice = dbCommodity._RetailPrice ?? 0.0m; commodity.RetailPricePlanned = dbCommodity._RetailPricePlanned ?? 0.0m; commodity.UomIdSale = new SysId(dbCommodity._UomIdSale); commodity.CarriageCostIndicative = dbCommodity._CarriageCostIndicative ?? 0.0m; commodity.MinOrderQty = dbCommodity._MinOrderQty ?? 0.0m; commodity.PackQtySale = dbCommodity._PackQty ?? 0.0m; commodity.TaxCodeId = new SysId(dbCommodity._TaxCodeId); commodity.LastOrderDate = dbCommodity._LastOrderDate ?? default(DateTime); commodity.LastOrderQty = dbCommodity._LastOrderQty ?? 0.0m; commodity.QtyInStock = dbCommodity._QtyInStock ?? 0.0m; commodity.QtyAllocated = dbCommodity._QtyAllocated ?? 0.0m; commodity.FreeStock = dbCommodity._FreeStock ?? 0.0m; commodity.StockTakeDate = dbCommodity._StockTakeDate ?? default(DateTime); commodity.StockTakeQty = dbCommodity._StockTakeQty ?? 0.0m; commodity.CommodityIdSalesProj = new SysId(dbCommodity._CommodityIdSalesProj); commodity.SalesProjAnnual = dbCommodity._SalesProjAnnual ?? 0.0m; commodity.SalesProjMonth01 = dbCommodity._SalesProjMonth01 ?? 0.0m; commodity.SalesProjMonth02 = dbCommodity._SalesProjMonth02 ?? 0.0m; commodity.SalesProjMonth03 = dbCommodity._SalesProjMonth03 ?? 0.0m; commodity.SalesProjMonth04 = dbCommodity._SalesProjMonth04 ?? 0.0m; commodity.SalesProjMonth05 = dbCommodity._SalesProjMonth05 ?? 0.0m; commodity.SalesProjMonth06 = dbCommodity._SalesProjMonth06 ?? 0.0m; commodity.SalesProjMonth07 = dbCommodity._SalesProjMonth07 ?? 0.0m; commodity.SalesProjMonth08 = dbCommodity._SalesProjMonth08 ?? 0.0m; commodity.SalesProjMonth09 = dbCommodity._SalesProjMonth09 ?? 0.0m; commodity.SalesProjMonth10 = dbCommodity._SalesProjMonth10 ?? 0.0m; commodity.SalesProjMonth11 = dbCommodity._SalesProjMonth11 ?? 0.0m; commodity.SalesProjMonth12 = dbCommodity._SalesProjMonth12 ?? 0.0m; // Common properties. commodity.Notes = dbCommodity._Notes; commodity.Status = SacsSystem.GetStatusForCode(dbCommodity._Status); commodity.SetCreateStamp(dbCommodity._CreateOn, new SysId(dbCommodity._CreateBy), dbCommodity._CreateHost); commodity.SetUpdateStamp(dbCommodity._UpdateOn, new SysId(dbCommodity._UpdateBy), dbCommodity._UpdateHost); commodity.AcceptChanges(); } //------------------------------------------------------------------- // Column definitions. private static readonly String aliasCommodity = "aCmd"; private static String aliasCommodity_CmdCustomer = "Cmd_CmdCust"; private static String prefixCommodity_CmdCustomer = aliasCommodity_CmdCustomer + "_"; private static String aliasCommodity_AssocationSupplier = "Cmd_AssSupp"; private static String prefixCommodity_AssocationSupplier = aliasCommodity_AssocationSupplier + "_"; private static String aliasCommodity_AffiliateSupplier = "Cmd_AffSupp"; private static String prefixCommodity_AffiliateSupplier = aliasCommodity_AffiliateSupplier + "_"; private static String aliasCommodity_AssocationCustomer = "Cmd_AsCust"; private static String prefixCommodity_AssocationCustomer = aliasCommodity_AssocationCustomer + "_"; private static String aliasCommodity_AffiliateCustomer = "Cmd_AffCust"; private static String prefixCommodity_AffiliateCustomer = aliasCommodity_AffiliateCustomer + "_"; private static String aliasCommodity_UomSale = "Cmd_UomSale"; private static String prefixCommodity_UomSale = aliasCommodity_UomSale + "_"; private static String aliasCommodity_CurrencyMaterial = "Cmd_CurMat"; private static String prefixCommodity_CurrencyMaterial = aliasCommodity_CurrencyMaterial + "_"; private static String aliasCommodity_CurrencyExWorks = "Cmd_CurExw"; private static String prefixCommodity_CurrencyExWorks = aliasCommodity_CurrencyExWorks + "_"; private static String aliasCommodity_TaxCode_Sale = "Cmd_TxcSale"; private static String prefixCommodity_TaxCode_Sale = aliasCommodity_TaxCode_Sale + "_"; private static String prefixCommodity_Uom = "Uom_"; // Column names. private static String dataNameUomSale = "Uom_Sale"; private static String dataNameGrossPrice = "GrPrc"; private static String dataNameRequirement_AmtUnitEarlId = "ReqntAmtUnitEarlId"; private static String dataNameRequirement_AmtUnitEarlCode = "ReqntAmtUnitEarlCode"; private static String dataNameLastStockTake = "LstStkTk"; private static String dataNameCommodityCustomerCount = "CmdCustCount"; private static String dataNameCommoditySupplierCount = "CmdSuppCount"; private static String dataNameProcessCount = "CmdProcCount"; private static String dataNamePortfolioItemCount = "PrtItmCount"; private static String dataNameSales_YtdFinancial = "SalesYtdFin"; private static String dataNameSales_YtdCalendar = "SalesYtdCal"; private static String dataNameSales_PyFinancial = "SalesPyFin"; private static String dataNameSales_PyCalendar = "SalesPyCal"; private static String dataNameSales_MthCurrent = "SalesMthCurr"; private static String dataNameSales_Mth01 = "SalesMth01"; private static String dataNameSales_Mth02 = "SalesMth02"; private static String dataNameSales_Mth03 = "SalesMth03"; private static String dataNameSales_Mth04 = "SalesMth04"; private static String dataNameSales_Mth05 = "SalesMth05"; private static String dataNameSales_Mth06 = "SalesMth06"; private static String dataNameSales_Mth07 = "SalesMth07"; private static String dataNameSales_Mth08 = "SalesMth08"; private static String dataNameSales_Mth09 = "SalesMth09"; private static String dataNameSales_Mth10 = "SalesMth10"; private static String dataNameSales_Mth11 = "SalesMth11"; private static String dataNameSales_Mth12 = "SalesMth12"; private static String dataNameStockSold_Period = "StkSolPrd"; private static String dataNameStkLvl_Allocated = "StkLvl_Allo"; private static String dataNameStkLvl_Allocated_Sales = "StkLvl_AlloS"; private static String dataNameStkLvl_Allocated_Calc = "StkLvl_AlloC"; private static String dataNameStkLvl_Allocated_All = "StkLvl_AlloA"; private static String dataNameStkLvl_Current = "StkLvl_Curr"; private static String dataNameStkLvl_Current_Sales = "StkLvl_CurrS"; private static String dataNameStkLvl_Current_Calc = "StkLvl_CurrC"; private static String dataNameStkLvl_Current_All = "StkLvl_CurrA"; private static String dataNameStkLvl_Bays = "StkLvl_Bays"; private static String dataNameStkLvl_Bay1 = "StkLvl_Bay1"; private static String dataNameStkLvl_Bay2 = "StkLvl_Bay2"; private static String dataNameStkLvl_Bay3 = "StkLvl_Bay3"; private static String dataNameStkDue_NextCmdStkDate = "StkDue_NextCmdDate"; // Date next commodity movement expected. private static String dataNameStkDue_NextCmdStkQty = "StkDue_NextCmdQty"; // Quantity on next expected commodity movement. private static String dataNameStkDue_NextCntStkDate = "StkDue_NextCntDate"; // Date next container movement expected. private static String dataNameStkDue_NextCntStkQty = "StkDue_NextCntQty"; // Quantity on next expected container movement. private static String dataNameStkDue_Imminent = "StkLvl_Immi"; private static String dataNameStkDue_Week1 = "StkDue_Wk1"; // Stock due in by future weeks. private static String dataNameStkDue_Week2 = "StkDue_Wk2"; private static String dataNameStkDue_Week3 = "StkDue_Wk3"; private static String dataNameStkDue_Week4 = "StkDue_Wk4"; private static String dataNameStkDue_Week5 = "StkDue_Wk5"; private static String dataNameStkDue_Week6 = "StkDue_Wk6"; private static String dataNameStkDue_Week7 = "StkDue_Wk7"; private static String dataNameStkDue_Week8 = "StkDue_Wk8"; private static String dataNameStkDue_Week9 = "StkDue_Wk9"; private static String dataNameStkDue_Week10 = "StkDue_Wk10"; private static String dataNameStkDue_Week11 = "StkDue_Wk11"; private static String dataNameStkDue_Week12 = "StkDue_Wk12"; private static String dataNameStkDue_Week1To2 = "StkDue_Wk1To2"; private static String dataNameStkDue_Week3To4 = "StkDue_Wk3To4"; private static String dataNameStkDue_Week5To6 = "StkDue_Wk5To6"; private static String dataNameStkDue_Week7To8 = "StkDue_Wk7To8"; private static String dataNameStkDue_Week9To10 = "StkDue_Wk9To10"; private static String dataNameStkDue_Week11To12 = "StkDue_Wk11To12"; private static String dataNameStkDue_Week7On = "StkDue_Wk7On"; private static String dataNameStkDue_Week13On = "StkDue_Wk13On"; private static String dataNameStkDue_MonthCurr = "StkDue_MthCurr"; private static String dataNameStkDue_Month01 = "StkDue_Mth01"; private static String dataNameStkDue_Month02 = "StkDue_Mth02"; private static String dataNameStkDue_Month03 = "StkDue_Mth03"; private static String dataNameStkDue_Month04 = "StkDue_Mth04"; private static String dataNameStkDue_Month05 = "StkDue_Mth05"; private static String dataNameStkDue_Month06 = "StkDue_Mth06"; private static String dataNameStkDue_Month07 = "StkDue_Mth07"; private static String dataNameStkDue_Month08 = "StkDue_Mth08"; private static String dataNameStkDue_Month09 = "StkDue_Mth09"; private static String dataNameStkDue_Month10 = "StkDue_Mth10"; private static String dataNameStkDue_Month11 = "StkDue_Mth11"; private static String dataNameStkDue_Month12 = "StkDue_Mth12"; private static String dataNameStkDue_MonthTo03 = "StkDue_MthTo3"; private static String dataNameStkDue_MonthTo06 = "StkDue_MthTo6"; private static String dataNameStkDue_MonthTo09 = "StkDue_MthTo9"; private static String dataNameStkDue_MonthTo12 = "StkDue_MthTo12"; private static String dataNameStkDue_Month04To06 = "StkDue_Mth4To6"; private static String dataNameStkDue_Month07To09 = "StkDue_Mth7To9"; private static String dataNameStkDue_Month10To12 = "StkDue_Mth10To12"; private static String dataNameStkDue_Month07To12 = "StkDue_Mth7To12"; private static String dataNameStkDue_Month04On = "StkDue_Mth4On"; private static String dataNameStkDue_Month05On = "StkDue_Mth5On"; private static String dataNameStkDue_Month06On = "StkDue_Mth6On"; private static String dataNameStkDue_Month07On = "StkDue_Mth7On"; private static String dataNameStkDue_Month13On = "StkDue_Mth13On"; private static String dataNameStkDue_Provisional = "StkDue_Prov"; private static String dataNameStkAll_Week1 = "StkAll_Wk1"; // Stock allocated by future weeks. private static String dataNameStkAll_Week2 = "StkAll_Wk2"; private static String dataNameStkAll_Week3To4 = "StkAll_Wk3To4"; private static String dataNameStkAll_Week5To6 = "StkAll_Wk5To6"; private static String dataNameStkAll_Week7To8 = "StkAll_Wk7To8"; private static String dataNameStkAll_Week9To10 = "StkAll_Wk9To10"; private static String dataNameStkAll_Week11To12 = "StkAll_Wk11To12"; private static String dataNameStkAll_Week13On = "StkAll_Wk13On"; private static String dataNameStkAll_MonthCurr = "StkAll_MthCurr"; // Stock allocated by month. private static String dataNameStkAll_Month01 = "StkAll_Mth01"; // Stock allocated by future month. private static String dataNameStkAll_Month02 = "StkAll_Mth02"; private static String dataNameStkAll_Month03 = "StkAll_Mth03"; private static String dataNameStkAll_Month04 = "StkAll_Mth04"; private static String dataNameStkAll_Month05 = "StkAll_Mth05"; private static String dataNameStkAll_Month06 = "StkAll_Mth06"; private static String dataNameStkAll_Month07 = "StkAll_Mth07"; private static String dataNameStkAll_Month08 = "StkAll_Mth08"; private static String dataNameStkAll_Month09 = "StkAll_Mth09"; private static String dataNameStkAll_Month10 = "StkAll_Mth10"; private static String dataNameStkAll_Month11 = "StkAll_Mth11"; private static String dataNameStkAll_Month12 = "StkAll_Mth12"; // Column definition population. private void SetCommodityColDfn (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.Commodity) alias = aliasCommodity; 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 Commodity column definition. public override ColumnDfn GetCommodityColumnDfn(SbmCommodity.Column columnId, string caption = "", int width = 0) { bool canViewSalesFinancials = UserCanViewCommoditySalesFinancials(); bool canViewSupplyFinancials = UserCanViewCommoditySupplyFinancials(); ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); switch (columnId) { case SbmCommodity.Column.Pos: SetCommodityColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; case SbmCommodity.Column.Id: SetCommodityColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.Commodity_Id, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.ReadOnly = true; break; // Commodity Properties. case SbmCommodity.Column.Type: SetCommodityColDfn(columnDfn, "Type", 70, SbmDbDfn.ColumnIdx.Commodity_Type, ColumnAlignment.Center, DataValue.DataType.Long); break; case SbmCommodity.Column.Type_Code: SetCommodityColDfn(columnDfn, "Type", 70, SbmDbDfn.ColumnIdx.Commodity_Type, ColumnAlignment.Center); break; case SbmCommodity.Column.Type_Desc: SetCommodityColDfn(columnDfn, "Type", 90, SbmDbDfn.ColumnIdx.Commodity_Type, ColumnAlignment.Center); break; case SbmCommodity.Column.Code: SetCommodityColDfn(columnDfn, "Code", 120, SbmDbDfn.ColumnIdx.Commodity_Code); if (SessionConsole != null && AllowConfigOption(Sbm.ConfigOption.CommodityDoubleColumnWidth)) columnDfn.Width = columnDfn.Width * (int)1.25; break; case SbmCommodity.Column.DescBrief: SetCommodityColDfn(columnDfn, "Desc", 120, SbmDbDfn.ColumnIdx.Commodity_DescBrief); if (SessionConsole != null && AllowConfigOption(Sbm.ConfigOption.CommodityDoubleColumnWidth)) columnDfn.Width = columnDfn.Width * (int)1.25; break; case SbmCommodity.Column.DescOrder: SetCommodityColDfn(columnDfn, "Desc order", 120, SbmDbDfn.ColumnIdx.Commodity_DescOrder); break; case SbmCommodity.Column.DescDetail: SetCommodityColDfn(columnDfn, "Desc detail", 240, SbmDbDfn.ColumnIdx.Commodity_DescDetail); break; case SbmCommodity.Column.DrawingNo: SetCommodityColDfn(columnDfn, "Drawing", 86, SbmDbDfn.ColumnIdx.Commodity_DrawingNo, ColumnAlignment.Center); break; case SbmCommodity.Column.DrawingIssue: SetCommodityColDfn(columnDfn, "Issue", 40, SbmDbDfn.ColumnIdx.Commodity_DrawingIssue, ColumnAlignment.Center); break; case SbmCommodity.Column.ImagePath: SetCommodityColDfn(columnDfn, "Image file", 140, SbmDbDfn.ColumnIdx.Commodity_ImagePath, ColumnAlignment.Center); break; case SbmCommodity.Column.Image: SetCommodityColDfn(columnDfn, "Image", 160, SbmDbDfn.ColumnIdx.Commodity_ImagePath, ColumnAlignment.Center); break; case SbmCommodity.Column.Category1Code: SetCommodityColDfn(columnDfn, "Category 1", 65, SbmDbDfn.ColumnIdx.Commodity_Category, ColumnAlignment.Center); break; case SbmCommodity.Column.Category1_Desc: SetCommodityColDfn(columnDfn, "Category 1", 80, SbmDbDfn.ColumnIdx.Commodity_Category); break; case SbmCommodity.Column.Category2Code: SetCommodityColDfn(columnDfn, "Category 2", 65, SbmDbDfn.ColumnIdx.Commodity_Category2, ColumnAlignment.Center); break; case SbmCommodity.Column.Category2_Desc: SetCommodityColDfn(columnDfn, "Category 2", 80, SbmDbDfn.ColumnIdx.Commodity_Category2); break; case SbmCommodity.Column.Category3Code: SetCommodityColDfn(columnDfn, "Category 3", 65, SbmDbDfn.ColumnIdx.Commodity_Category3, ColumnAlignment.Center); break; case SbmCommodity.Column.Category3_Desc: SetCommodityColDfn(columnDfn, "Category 3", 80, SbmDbDfn.ColumnIdx.Commodity_Category3); break; case SbmCommodity.Column.Location: SetCommodityColDfn(columnDfn, "Location", 80, SbmDbDfn.ColumnIdx.Commodity_Location, ColumnAlignment.Center); break; case SbmCommodity.Column.Department: SetCommodityColDfn(columnDfn, "Department", 80, SbmDbDfn.ColumnIdx.Commodity_Department, ColumnAlignment.Center); break; case SbmCommodity.Column.CatalogRef: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CatalogRef, "Catalog ref"); SetCommodityColDfn(columnDfn, label, 80, SbmDbDfn.ColumnIdx.Commodity_CatalogRef, ColumnAlignment.Center); break; } //--------------------------------------------------------------- // Specification. case SbmCommodity.Column.Weight: SetCommodityColDfn(columnDfn, "Weight", 70, SbmDbDfn.ColumnIdx.Commodity_Weight, ColumnAlignment.Right, DataValue.DataType.Decimal); columnDfn.NumDecimals = (byte)WeightDecimals; break; case SbmCommodity.Column.Weight_UomId: SetCommodityColDfn(columnDfn, "Weight uomId", 70, SbmDbDfn.ColumnIdx.Commodity_UomIdWeight, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmCommodity.Column.Weight_Unit: SetCommodityColDfn(columnDfn, "Weight unit", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center); break; case SbmCommodity.Column.Weight_ValueUnits: SetCommodityColDfn(columnDfn, "Weight UOM #", 80, SbmDbDfn.ColumnIdx.Commodity_UomIdWeight, ColumnAlignment.Center, DataValue.DataType.Long); break; case SbmCommodity.Column.Length: SetCommodityColDfn(columnDfn, "Length", 70, SbmDbDfn.ColumnIdx.Commodity_Length, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)LengthDecimals; break; case SbmCommodity.Column.Length_UomId: SetCommodityColDfn(columnDfn, "Length UOM #", 70, SbmDbDfn.ColumnIdx.Commodity_UomIdLength, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmCommodity.Column.Length_Unit: SetCommodityColDfn(columnDfn, "Length unit", 80, SbmDbDfn.ColumnIdx.Commodity_Length, ColumnAlignment.Center); break; case SbmCommodity.Column.Length_ValueUnits: SetCommodityColDfn(columnDfn, "Length valueunit", 80, SbmDbDfn.ColumnIdx.Commodity_Length, ColumnAlignment.Right); break; case SbmCommodity.Column.Volume: SetCommodityColDfn(columnDfn, "Volume", 70, SbmDbDfn.ColumnIdx.Commodity_Volume, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)VolumeDecimals; break; case SbmCommodity.Column.Volume_UomId: SetCommodityColDfn(columnDfn, "Volume uomId", 70, SbmDbDfn.ColumnIdx.Commodity_UomIdVolume, ColumnAlignment.Center); break; case SbmCommodity.Column.Volume_Unit: SetCommodityColDfn(columnDfn, "Volume unit", 80, SbmDbDfn.ColumnIdx.Commodity_Volume, ColumnAlignment.Center); break; case SbmCommodity.Column.Volume_ValueUnits: SetCommodityColDfn(columnDfn, "Volume valueunit", 80, SbmDbDfn.ColumnIdx.Commodity_Volume, ColumnAlignment.Right); break; case SbmCommodity.Column.Density: SetCommodityColDfn(columnDfn, "Density", 70, SbmDbDfn.ColumnIdx.Commodity_Density, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)DensityDecimals; break; case SbmCommodity.Column.Density_UomId: SetCommodityColDfn(columnDfn, "Length uomId", 70, SbmDbDfn.ColumnIdx.Commodity_UomIdDensity, ColumnAlignment.Center); break; case SbmCommodity.Column.Density_Unit: SetCommodityColDfn(columnDfn, "Length unit", 80, SbmDbDfn.ColumnIdx.Commodity_Density, ColumnAlignment.Center); break; case SbmCommodity.Column.Density_ValueUnits: SetCommodityColDfn(columnDfn, "Density valueunit", 80, SbmDbDfn.ColumnIdx.Commodity_Density, ColumnAlignment.Right); break; case SbmCommodity.Column.BoxQuantity: SetCommodityColDfn(columnDfn, "Box qty", 70, SbmDbDfn.ColumnIdx.Commodity_BoxQuantity, ColumnAlignment.Right, DataValue.DataType.Double); break; case SbmCommodity.Column.BoxQuantity_UomId: SetCommodityColDfn(columnDfn, "Box qty uomId", 70, SbmDbDfn.ColumnIdx.Commodity_UomIdBox, ColumnAlignment.Center); break; case SbmCommodity.Column.BoxQuantity_Unit: SetCommodityColDfn(columnDfn, "Box qty unit", 80, SbmDbDfn.ColumnIdx.Commodity_BoxQuantity, ColumnAlignment.Center); break; case SbmCommodity.Column.BoxQuantity_ValueUnits: SetCommodityColDfn(columnDfn, "Box qty valueunit", 80, SbmDbDfn.ColumnIdx.Commodity_BoxQuantity, ColumnAlignment.Right); break; case SbmCommodity.Column.Dimensions: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_Dimensions, "Dimensions"); SetCommodityColDfn(columnDfn, label, 100, SbmDbDfn.ColumnIdx.Commodity_Dimensions, ColumnAlignment.Center); break; } case SbmCommodity.Column.SpecSummary: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_SpecSummary, "Specification"); SetCommodityColDfn(columnDfn, label, 100, SbmDbDfn.ColumnIdx.Commodity_SpecSummary, ColumnAlignment.Center); break; } case SbmCommodity.Column.ICNTariffCode: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_ICNTariffCode, "ICN tariff"); SetCommodityColDfn(columnDfn, label, 100, SbmDbDfn.ColumnIdx.Commodity_ICNTariffCode, ColumnAlignment.Center); break; } //--------------------------------------------------------------- // Codings. case SbmCommodity.Column.RangeCode: SetCommodityColDfn(columnDfn, "Range", 80, SbmDbDfn.ColumnIdx.Commodity_RangeCode, ColumnAlignment.Center); break; case SbmCommodity.Column.RangeDesc: SetCommodityColDfn(columnDfn, "Range", 90, SbmDbDfn.ColumnIdx.Commodity_RangeCode, ColumnAlignment.Left); break; case SbmCommodity.Column.ColourCode: SetCommodityColDfn(columnDfn, "Colour", 80, SbmDbDfn.ColumnIdx.Commodity_ColourCode, ColumnAlignment.Center); break; case SbmCommodity.Column.ColourDesc: SetCommodityColDfn(columnDfn, "Colour", 90, SbmDbDfn.ColumnIdx.Commodity_ColourCode, ColumnAlignment.Left); break; case SbmCommodity.Column.SourceCode: SetCommodityColDfn(columnDfn, "Source", 80, SbmDbDfn.ColumnIdx.Commodity_SourceCode, ColumnAlignment.Center); break; case SbmCommodity.Column.SourceDesc: SetCommodityColDfn(columnDfn, "Source", 90, SbmDbDfn.ColumnIdx.Commodity_SourceCode, ColumnAlignment.Left); break; case SbmCommodity.Column.SupplyMethodCode: SetCommodityColDfn(columnDfn, "Supply", 80, SbmDbDfn.ColumnIdx.Commodity_SupplyMethodCode, ColumnAlignment.Center); break; case SbmCommodity.Column.SupplyMethodDesc: SetCommodityColDfn(columnDfn, "Supply", 90, SbmDbDfn.ColumnIdx.Commodity_SupplyMethodCode, ColumnAlignment.Left); break; case SbmCommodity.Column.HandlingCode: SetCommodityColDfn(columnDfn, "Handling", 80, SbmDbDfn.ColumnIdx.Commodity_HandlingCode, ColumnAlignment.Center); break; case SbmCommodity.Column.HandlingDesc: SetCommodityColDfn(columnDfn, "Handling", 90, SbmDbDfn.ColumnIdx.Commodity_HandlingCode, ColumnAlignment.Left); break; case SbmCommodity.Column.DeliveryCode: SetCommodityColDfn(columnDfn, "Delivery", 80, SbmDbDfn.ColumnIdx.Commodity_DeliveryCode, ColumnAlignment.Center); break; case SbmCommodity.Column.DeliveryDesc: SetCommodityColDfn(columnDfn, "Delivery", 90, SbmDbDfn.ColumnIdx.Commodity_DeliveryCode, ColumnAlignment.Left); break; case SbmCommodity.Column.MaterialCode: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_MaterialCode, "Material"); SetCommodityColDfn(columnDfn, label, 80, SbmDbDfn.ColumnIdx.Commodity_MaterialCode, ColumnAlignment.Center); break; } case SbmCommodity.Column.MaterialDesc: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_MaterialCode, "Material"); SetCommodityColDfn(columnDfn, label, 90, SbmDbDfn.ColumnIdx.Commodity_MaterialCode, ColumnAlignment.Left); break; } case SbmCommodity.Column.FinishCode: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_FinishCode, "Finish"); SetCommodityColDfn(columnDfn, label, 80, SbmDbDfn.ColumnIdx.Commodity_FinishCode, ColumnAlignment.Center); break; } case SbmCommodity.Column.FinishDesc: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_FinishCode, "Finish"); SetCommodityColDfn(columnDfn, label, 90, SbmDbDfn.ColumnIdx.Commodity_FinishCode, ColumnAlignment.Left); break; } case SbmCommodity.Column.PromotionCode: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_PromotionCode, "Promotion"); SetCommodityColDfn(columnDfn, label, 80, SbmDbDfn.ColumnIdx.Commodity_PromotionCode, ColumnAlignment.Center); break; } case SbmCommodity.Column.PromotionDesc: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_PromotionCode, "Promotion"); SetCommodityColDfn(columnDfn, label, 90, SbmDbDfn.ColumnIdx.Commodity_PromotionCode, ColumnAlignment.Left); break; } case SbmCommodity.Column.NominalCode: SetCommodityColDfn(columnDfn, "Sales nominal", 80, SbmDbDfn.ColumnIdx.Commodity_NominalCode, ColumnAlignment.Center); break; case SbmCommodity.Column.NominalCodePurchase: SetCommodityColDfn(columnDfn, "Purchase nominal", 80, SbmDbDfn.ColumnIdx.Commodity_NominalCodePurchase, ColumnAlignment.Center); break; //----------------------------------------------------------- // Purchasing. case SbmCommodity.Column.Supplier_Name: SetCommodityColDfn(columnDfn, "Supplier", 120, SbmDbDfn.ColumnIdx.Affiliate_Name, ColumnAlignment.Default, DataValue.DataType.String, aliasCommodity_AffiliateSupplier, prefixCommodity_AffiliateSupplier); break; case SbmCommodity.Column.Supplier_Ref: SetCommodityColDfn(columnDfn, "Part number", 90, SbmDbDfn.ColumnIdx.Commodity_SupplierRef, ColumnAlignment.Center); break; case SbmCommodity.Column.CostPrice: if (canViewSupplyFinancials) { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CostPrice, "Cost price"); SetCommodityColDfn(columnDfn, label, 70, SbmDbDfn.ColumnIdx.Commodity_CostPrice, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = CurrencyDecimalsDefault; columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.CostPrice_Fmt: if (canViewSupplyFinancials) { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CostPrice, "Cost price"); SetCommodityColDfn(columnDfn, label, 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.PlaceOfOrigin: SetCommodityColDfn(columnDfn, "Place of origin", 90, SbmDbDfn.ColumnIdx.Commodity_PlaceOfOrigin); break; case SbmCommodity.Column.MaterialCost: if (canViewSupplyFinancials) { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_MaterialCost, "Material cost"); SetCommodityColDfn(columnDfn, label, 80, SbmDbDfn.ColumnIdx.Commodity_MaterialCost, ColumnAlignment.Right, DataValue.DataType.Double, aliasCommodity_CurrencyMaterial, prefixCommodity_CurrencyMaterial); columnDfn.NumDecimals = 2; // Unknown currency. columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.MaterialCost_Fmt: if (canViewSupplyFinancials) { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_MaterialCost, "Material cost"); SetCommodityColDfn(columnDfn, label, 90, SbmDbDfn.ColumnIdx.Commodity_MaterialCost, ColumnAlignment.Right, DataValue.DataType.String, aliasCommodity_CurrencyMaterial, prefixCommodity_CurrencyMaterial); } break; case SbmCommodity.Column.MaterialCurrencyId: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial, "Material curr #"); SetCommodityColDfn(columnDfn, label, 80, SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial, ColumnAlignment.Right, DataValue.DataType.Long, aliasCommodity_CurrencyMaterial, prefixCommodity_CurrencyMaterial); break; } case SbmCommodity.Column.MaterialCurrency_Code: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial, "Material currency code"); SetCommodityColDfn(columnDfn, label, 100, SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_CurrencyMaterial, prefixCommodity_CurrencyMaterial); break; } case SbmCommodity.Column.MaterialCurrency_Symbol: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial, "Material currency"); SetCommodityColDfn(columnDfn, label, 100, SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_CurrencyMaterial, prefixCommodity_CurrencyMaterial); break; } case SbmCommodity.Column.ExWorksCost: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_ExWorksCost, "Ex-works cost"); SetCommodityColDfn(columnDfn, label, 80, SbmDbDfn.ColumnIdx.Commodity_ExWorksCost, ColumnAlignment.Right, DataValue.DataType.Double, aliasCommodity_CurrencyExWorks, prefixCommodity_CurrencyExWorks); columnDfn.NumDecimals = 2; // Unknown currency. columnDfn.ShowZeroValues = false; break; } case SbmCommodity.Column.ExWorksCost_Fmt: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_ExWorksCost, "Ex-works cost"); SetCommodityColDfn(columnDfn, label, 90, SbmDbDfn.ColumnIdx.Commodity_ExWorksCost, ColumnAlignment.Right, DataValue.DataType.String, aliasCommodity_CurrencyExWorks, prefixCommodity_CurrencyExWorks); break; } case SbmCommodity.Column.ExWorksCurrencyId: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdExWorks, "Ex-works currency #"); SetCommodityColDfn(columnDfn, label, 80, SbmDbDfn.ColumnIdx.Commodity_CurrencyIdExWorks, ColumnAlignment.Right, DataValue.DataType.Long, aliasCommodity_CurrencyExWorks, prefixCommodity_CurrencyExWorks); break; } case SbmCommodity.Column.ExWorksCurrency_Code: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdExWorks, "Ex-works currency"); SetCommodityColDfn(columnDfn, label, 100, SbmDbDfn.ColumnIdx.Commodity_CurrencyIdExWorks, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_CurrencyExWorks, prefixCommodity_CurrencyExWorks); break; } case SbmCommodity.Column.ExWorksCurrency_Symbol: { String label = GetAttributeCaption(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdExWorks, "Ex-works currency code"); SetCommodityColDfn(columnDfn, label, 100, SbmDbDfn.ColumnIdx.Commodity_CurrencyIdExWorks, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_CurrencyExWorks, prefixCommodity_CurrencyExWorks); break; } case SbmCommodity.Column.ReorderLevel: SetCommodityColDfn(columnDfn, "Reorder level", 90, SbmDbDfn.ColumnIdx.Commodity_ReorderLevel, ColumnAlignment.Center, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.ReorderQty: SetCommodityColDfn(columnDfn, "Reorder qty", 90, SbmDbDfn.ColumnIdx.Commodity_ReorderQty, ColumnAlignment.Center, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.QtyOnOrder: SetCommodityColDfn(columnDfn, "Qty on Order", 90, SbmDbDfn.ColumnIdx.Commodity_QtyOnOrder, ColumnAlignment.Center, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; //--------------------------------------------------------------- // Sales: case SbmCommodity.Column.Customer_Name: SetCommodityColDfn(columnDfn, "Customer", 100, SbmDbDfn.ColumnIdx.Affiliate_Name); break; case SbmCommodity.Column.SalesPrice: if (canViewSalesFinancials) { SetCommodityColDfn(columnDfn, "Sales price", 80, SbmDbDfn.ColumnIdx.Commodity_SalesPrice, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = CurrencyDecimalsDefault; columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.SalesPrice_Fmt: if (canViewSalesFinancials) { SetCommodityColDfn(columnDfn, "Sales price", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.String); columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.RetailPrice: if (canViewSalesFinancials) { SetCommodityColDfn(columnDfn, "RRP", 80, SbmDbDfn.ColumnIdx.Commodity_RetailPrice, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = CurrencyDecimalsDefault; columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.RetailPrice_Fmt: if (canViewSalesFinancials) { SetCommodityColDfn(columnDfn, "RRP", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.String); columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.RetailPricePlanned: if (canViewSalesFinancials) { SetCommodityColDfn(columnDfn, "Planned RRP", 80, SbmDbDfn.ColumnIdx.Commodity_RetailPricePlanned, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = CurrencyDecimalsDefault; columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.RetailPricePlanned_Fmt: if (canViewSalesFinancials) { SetCommodityColDfn(columnDfn, "Planned RRP", 90, SbmDbDfn.ColumnIdx.Commodity_RetailPricePlanned, ColumnAlignment.Right, DataValue.DataType.String); columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.GrossPrice: if (canViewSalesFinancials) { SetCommodityColDfn(columnDfn, "Gross price", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = CurrencyDecimalsDefault; columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.GrossPrice_Fmt: if (canViewSalesFinancials) { SetCommodityColDfn(columnDfn, "Gross price", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.String); columnDfn.ShowZeroValues = false; } break; // Sales UOM. case SbmCommodity.Column.UomIdSale: SetCommodityColDfn(columnDfn, "Sales UOM Id", 80, SbmDbDfn.ColumnIdx.Commodity_UomIdSale, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.ShowZeroValues = false; break; case SbmCommodity.Column.UnitOfSale: SetCommodityColDfn(columnDfn, "Unit of Sale", 100, SbmDbDfn.ColumnIdx.UnitMeasure_Single, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_UomSale, prefixCommodity_UomSale); break; case SbmCommodity.Column.CarriageCostIndicative: if (canViewSalesFinancials) { SetCommodityColDfn(columnDfn, "Carriage cost (ind)", 80, SbmDbDfn.ColumnIdx.Commodity_CarriageCostIndicative, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = CurrencyDecimalsDefault; columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.CarriageCostIndicative_Fmt: if (canViewSalesFinancials) { SetCommodityColDfn(columnDfn, "Carriage cost (ind)", 90, SbmDbDfn.ColumnIdx.Commodity_CarriageCostIndicative, ColumnAlignment.Right, DataValue.DataType.String); columnDfn.ShowZeroValues = false; } break; case SbmCommodity.Column.MinOrderQty: SetCommodityColDfn(columnDfn, "Min Order Qty", 100, SbmDbDfn.ColumnIdx.Commodity_MinOrderQty, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; case SbmCommodity.Column.PackQtySale: SetCommodityColDfn(columnDfn, "Pack Qty - sale", 80, SbmDbDfn.ColumnIdx.Commodity_PackQty, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; // Sales tax code. case SbmCommodity.Column.TaxCode: SetCommodityColDfn(columnDfn, "Tax code", 90, SbmDbDfn.ColumnIdx.TaxCode_Code, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_TaxCode_Sale, prefixCommodity_TaxCode_Sale); columnDfn.ReadOnly = true; break; case SbmCommodity.Column.TaxRate: SetCommodityColDfn(columnDfn, "Tax %", 80, SbmDbDfn.ColumnIdx.TaxCode_TaxRate, ColumnAlignment.Center, DataValue.DataType.Decimal, aliasCommodity_TaxCode_Sale, prefixCommodity_TaxCode_Sale); columnDfn.NumDecimals = 2; columnDfn.ReadOnly = true; break; // Last order. case SbmCommodity.Column.LastOrderDate: SetCommodityColDfn(columnDfn, "Last order date", 100, SbmDbDfn.ColumnIdx.Commodity_LastOrderDate, ColumnAlignment.Center); columnDfn.ReadOnly = true; break; case SbmCommodity.Column.LastOrderQty: SetCommodityColDfn(columnDfn, "Last order qty", 100, SbmDbDfn.ColumnIdx.Commodity_LastOrderQty, ColumnAlignment.Center); columnDfn.ReadOnly = true; break; //--------------------------------------------------------------- // Customer definition. case SbmCommodity.Column.Cust_ProductCode: SetCommodityColDfn(columnDfn, "Customer product code", 100, SbmDbDfn.ColumnIdx.CommodityCustomer_ProductCode, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_CmdCustomer, prefixCommodity_CmdCustomer); break; case SbmCommodity.Column.Cust_AmountRetail: SetCommodityColDfn(columnDfn, "Customer retail", 100, SbmDbDfn.ColumnIdx.CommodityCustomer_AmountRetail, ColumnAlignment.Right, DataValue.DataType.Double, aliasCommodity_CmdCustomer, prefixCommodity_CmdCustomer); break; case SbmCommodity.Column.Cust_AmountRetail_Fmt: SetCommodityColDfn(columnDfn, "Customer retail", 100, SbmDbDfn.ColumnIdx.CommodityCustomer_AmountRetail, ColumnAlignment.Right, DataValue.DataType.String, aliasCommodity_CmdCustomer, prefixCommodity_CmdCustomer); break; case SbmCommodity.Column.Cust_CurrencyIdRetail: SetCommodityColDfn(columnDfn, "Customer currency#", 60, SbmDbDfn.ColumnIdx.CommodityCustomer_CurrencyIdRetail, ColumnAlignment.Right, DataValue.DataType.String, aliasCommodity_CmdCustomer, prefixCommodity_CmdCustomer); break; case SbmCommodity.Column.Cust_CurrencyIdRetail_Code: SetCommodityColDfn(columnDfn, "Customer currency", 80, SbmDbDfn.ColumnIdx.CommodityCustomer_CurrencyIdRetail, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_CmdCustomer, prefixCommodity_CmdCustomer); break; case SbmCommodity.Column.Cust_CurrencyIdRetail_Symbol: SetCommodityColDfn(columnDfn, "Customer currency", 80, SbmDbDfn.ColumnIdx.CommodityCustomer_CurrencyIdRetail, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_CmdCustomer, prefixCommodity_CmdCustomer); break; case SbmCommodity.Column.Cust_PromotionCode: SetCommodityColDfn(columnDfn, "Customer promotion", 100, SbmDbDfn.ColumnIdx.CommodityCustomer_PromotionCode, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_CmdCustomer, prefixCommodity_CmdCustomer); break; case SbmCommodity.Column.Cust_PromotionDesc: SetCommodityColDfn(columnDfn, "Customer promotion", 120, SbmDbDfn.ColumnIdx.CommodityCustomer_PromotionCode, ColumnAlignment.Center, DataValue.DataType.String, aliasCommodity_CmdCustomer, prefixCommodity_CmdCustomer); break; //--------------------------------------------------------------- // Stock: case SbmCommodity.Column.QtyInStock: SetCommodityColDfn(columnDfn, "Qty in Stock", 80, SbmDbDfn.ColumnIdx.Commodity_QtyInStock, ColumnAlignment.Right); break; case SbmCommodity.Column.QtyAllocated: SetCommodityColDfn(columnDfn, "Qty allocated", 100, SbmDbDfn.ColumnIdx.Commodity_QtyAllocated, ColumnAlignment.Center); break; case SbmCommodity.Column.StockTakeDate: SetCommodityColDfn(columnDfn, "Stock take date", 100, SbmDbDfn.ColumnIdx.Commodity_StockTakeDate, ColumnAlignment.Center); break; case SbmCommodity.Column.StockTakeQty: SetCommodityColDfn(columnDfn, "Stock take qty", 100, SbmDbDfn.ColumnIdx.Commodity_StockTakeQty, ColumnAlignment.Center); break; case SbmCommodity.Column.FreeStock: SetCommodityColDfn(columnDfn, "Free stock", 100, SbmDbDfn.ColumnIdx.Commodity_FreeStock, ColumnAlignment.Center); break; //--------------------------------------------------------------- // Stock take date. case SbmCommodity.Column.StockTake_Date: SetCommodityColDfn(columnDfn, "Last stock take", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DataName = dataNameLastStockTake; break; //--------------------------------------------------------------- // Sales budget. case SbmCommodity.Column.SalesProj_Annual: SetCommodityColDfn(columnDfn, "Budget (annual)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Jan: SetCommodityColDfn(columnDfn, "Budget (Jan)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth01, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Feb: SetCommodityColDfn(columnDfn, "Budget (Feb)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth02, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Mar: SetCommodityColDfn(columnDfn, "Budget (Mar)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth03, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Apr: SetCommodityColDfn(columnDfn, "Budget (Apr)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth04, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_May: SetCommodityColDfn(columnDfn, "Budget (May)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth05, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Jun: SetCommodityColDfn(columnDfn, "Budget (Jun)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth06, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Jul: SetCommodityColDfn(columnDfn, "Budget (Jul)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth07, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Aug: SetCommodityColDfn(columnDfn, "Budget (Aug)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth08, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Sep: SetCommodityColDfn(columnDfn, "Budget (Sep)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth09, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Oct: SetCommodityColDfn(columnDfn, "Budget (Oct)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth10, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Nov: SetCommodityColDfn(columnDfn, "Budget (Nov)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth11, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Dec: SetCommodityColDfn(columnDfn, "Budget (Dec)", 75, SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth12, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesProj_Period: SetCommodityColDfn(columnDfn, "Budget (period)", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; //--------------------------------------------------------------- // Sales Orders: case SbmCommodity.Column.SalesYtdFinancial: SetCommodityColDfn(columnDfn, "Sales FYTD", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesYtdCalendar: SetCommodityColDfn(columnDfn, "Sales CYTD", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesPyFinancial: SetCommodityColDfn(columnDfn, "Sales PFY", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesPyCalendar: SetCommodityColDfn(columnDfn, "Sales PCY", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthCurrent: SetCommodityColDfn(columnDfn, "Sales Mth curr", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast01: SetCommodityColDfn(columnDfn, "Sales Mth -1", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast02: SetCommodityColDfn(columnDfn, "Sales Mth -2", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast03: SetCommodityColDfn(columnDfn, "Sales Mth -3", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast04: SetCommodityColDfn(columnDfn, "Sales Mth -4", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast05: SetCommodityColDfn(columnDfn, "Sales Mth -5", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast06: SetCommodityColDfn(columnDfn, "Sales Mth -6", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast07: SetCommodityColDfn(columnDfn, "Sales Mth -7", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast08: SetCommodityColDfn(columnDfn, "Sales Mth -8", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast09: SetCommodityColDfn(columnDfn, "Sales Mth -9", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast10: SetCommodityColDfn(columnDfn, "Sales Mth -10", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast11: SetCommodityColDfn(columnDfn, "Sales Mth -11", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.SalesMonthPast12: SetCommodityColDfn(columnDfn, "Sales Mth -12", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; //--------------------------------------------------------------- // Stock sold: case SbmCommodity.Column.StockSold_Period: SetCommodityColDfn(columnDfn, "Sold during period", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; //--------------------------------------------------------------- // Stock Levels: case SbmCommodity.Column.Stock_Allocated: SetCommodityColDfn(columnDfn, "Allocated", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Sales: SetCommodityColDfn(columnDfn, "Allocated (sales)", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Calc: SetCommodityColDfn(columnDfn, "Allocated (calc)", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_All: SetCommodityColDfn(columnDfn, "Allocated (all)", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_CurrentLevel: SetCommodityColDfn(columnDfn, "Stock", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_CurrentLevel_Sales: SetCommodityColDfn(columnDfn, "Stock (sales)", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_CurrentLevel_Calc: SetCommodityColDfn(columnDfn, "Stock (calc)", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_CurrentLevel_All: SetCommodityColDfn(columnDfn, "Stock (all)", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_ImminentLevel: SetCommodityColDfn(columnDfn, "Stock (imminent)", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Available: SetCommodityColDfn(columnDfn, "Avail", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; case SbmCommodity.Column.Stock_Available_MinZero: SetCommodityColDfn(columnDfn, "Avail", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; case SbmCommodity.Column.Stock_Available_Sales: SetCommodityColDfn(columnDfn, "Avail (sales)", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; case SbmCommodity.Column.Stock_Available_Sales_MinZero: SetCommodityColDfn(columnDfn, "Avail (sales)", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; case SbmCommodity.Column.Stock_ImminentAvailable: SetCommodityColDfn(columnDfn, "Avail (imminent)", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; case SbmCommodity.Column.Stock_CurrentVsReorder: SetCommodityColDfn(columnDfn, "Current-v-Reorder", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; case SbmCommodity.Column.Stock_ImminentVsReorder: SetCommodityColDfn(columnDfn, "Imminent-v-Reorder", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; case SbmCommodity.Column.Stock_AvailVsReorder: SetCommodityColDfn(columnDfn, "Avail-v-Reorder", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; case SbmCommodity.Column.Stock_ImminentAvailVsReorder: SetCommodityColDfn(columnDfn, "Avail(imm)-v-Reorder", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; columnDfn.ShowZeroValues = false; break; //--------------------------------------------------------------- // Stock bays by location. case SbmCommodity.Column.Stock_Bays: SetCommodityColDfn(columnDfn, "Stock bays", 90, SbmDbDfn.ColumnIdx.Unknown); break; case SbmCommodity.Column.Stock_Bay1: SetCommodityColDfn(columnDfn, GetAttributeCaption(SbmDbDfn.ColumnIdx.StockLevel_Bay1, "Bay 1"), 80, SbmDbDfn.ColumnIdx.Unknown); break; case SbmCommodity.Column.Stock_Bay2: SetCommodityColDfn(columnDfn, GetAttributeCaption(SbmDbDfn.ColumnIdx.StockLevel_Bay2, "Bay 2"), 80, SbmDbDfn.ColumnIdx.Unknown); break; case SbmCommodity.Column.Stock_Bay3: SetCommodityColDfn(columnDfn, GetAttributeCaption(SbmDbDfn.ColumnIdx.StockLevel_Bay3, "Bay 3"), 80, SbmDbDfn.ColumnIdx.Unknown); break; //--------------------------------------------------------------- // Stock due next date: case SbmCommodity.Column.Stock_NextDue_Date: // Date next movement arrival expected. SetCommodityColDfn(columnDfn, "Stk next due", 85, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; break; case SbmCommodity.Column.Stock_NextDue_Quantity: // Quantity next movement arrival expected. SetCommodityColDfn(columnDfn, "Stk next due qty", 85, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_NextDue_Commodity_Date: // Date next commodity movement arrival expected. SetCommodityColDfn(columnDfn, "Cmd next due", 85, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; break; case SbmCommodity.Column.Stock_NextDue_Commodity_Quantity: // Quantity next commodity movement arrival expected. SetCommodityColDfn(columnDfn, "Cmd next due qty", 85, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_NextDue_Container_Date: // Date next container movement arrival expected. SetCommodityColDfn(columnDfn, "Cont next due", 85, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; break; case SbmCommodity.Column.Stock_NextDue_Container_Quantity: // Quantity next container movement arrival expected. SetCommodityColDfn(columnDfn, "Cont next due qty", 85, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; // Stock due in imminently - under organisation configuration control: case SbmCommodity.Column.Stock_Due_Imminently: SetCommodityColDfn(columnDfn, "Due imminently", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; // Stock due in by future weeks: case SbmCommodity.Column.Stock_DueIn_Week1: SetCommodityColDfn(columnDfn, "Due in wk1", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week2: SetCommodityColDfn(columnDfn, "Due in wk2", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week3: SetCommodityColDfn(columnDfn, "Due in wk3", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week4: SetCommodityColDfn(columnDfn, "Due in wk4", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week5: SetCommodityColDfn(columnDfn, "Due in wk5", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week6: SetCommodityColDfn(columnDfn, "Due in wk6", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week7: SetCommodityColDfn(columnDfn, "Due in wk7", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week8: SetCommodityColDfn(columnDfn, "Due in wk8", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week9: SetCommodityColDfn(columnDfn, "Due in wk9", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week10: SetCommodityColDfn(columnDfn, "Due in wk10", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week11: SetCommodityColDfn(columnDfn, "Due in wk11", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week12: SetCommodityColDfn(columnDfn, "Due in wk12", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week1To2: SetCommodityColDfn(columnDfn, "Due in wk1-2", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week3To4: SetCommodityColDfn(columnDfn, "Due in wk3-4", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week5To6: SetCommodityColDfn(columnDfn, "Due in wk5-6", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week7To8: SetCommodityColDfn(columnDfn, "Due in wk7-8", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week9To10: SetCommodityColDfn(columnDfn, "Due in wk9-10", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week11To12: SetCommodityColDfn(columnDfn, "Due in wk11-12", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week7On: SetCommodityColDfn(columnDfn, "Due in wk7 on", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Week13On: SetCommodityColDfn(columnDfn, "Due in wk13 on", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; // Stock allocated by future weeks. case SbmCommodity.Column.Stock_Allocated_Week1: SetCommodityColDfn(columnDfn, "Alloc wk1", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Week2: SetCommodityColDfn(columnDfn, "Alloc wk2", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Week3To4: SetCommodityColDfn(columnDfn, "Alloc wk3-4", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Week5To6: SetCommodityColDfn(columnDfn, "Alloc wk5-6", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Week7To8: SetCommodityColDfn(columnDfn, "Alloc wk7-8", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Week9To10: SetCommodityColDfn(columnDfn, "Alloc wk9-10", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Week11To12: SetCommodityColDfn(columnDfn, "Alloc wk11-12", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Week13On: SetCommodityColDfn(columnDfn, "Alloc wk13 on", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; //--------------------------------------------------------------- // Stock allocated in current and following months. case SbmCommodity.Column.Stock_Allocated_MonthCurrent: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today, "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month01: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(1), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month02: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(2), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month03: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(3), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month04: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(4), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month05: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(5), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month06: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(6), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month07: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(7), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month08: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(8), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month09: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(9), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month10: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(10), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month11: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(11), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_Allocated_Month12: SetCommodityColDfn(columnDfn, "Alloc " + DateUtil.Format(today.AddMonths(12), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; //--------------------------------------------------------------- // Stock level at end of current and following months [derived]. case SbmCommodity.Column.Stock_EndOfMonth_Current: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today, "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_01: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(1), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_02: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(2), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_03: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(3), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_04: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(4), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_05: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(5), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_06: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(6), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_07: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(7), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_08: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(8), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_09: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(9), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_10: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(10), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_11: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(11), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_EndOfMonth_12: SetCommodityColDfn(columnDfn, "EOM Stock " + DateUtil.Format(today.AddMonths(12), "MMM-yy"), 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; //--------------------------------------------------------------- // Stock due in by future months. case SbmCommodity.Column.Stock_DueIn_MonthCurrent: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime(), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month01: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(1), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month02: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(2), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month03: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(3), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month04: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(4), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month05: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(5), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month06: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(6), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month07: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(7), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month08: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(8), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month09: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(9), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month10: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(10), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month11: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(11), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month12: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(12), "MMM-yy"), 70, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; // Up to 3 months in future. case SbmCommodity.Column.Stock_DueIn_MonthTo03: SetCommodityColDfn(columnDfn, "Due to " + DateUtil.Format(new DateTime().AddMonths(3), "MMM-yy"), 100, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_MonthTo06: SetCommodityColDfn(columnDfn, "Due to " + DateUtil.Format(new DateTime().AddMonths(6), "MMM-yy"), 100, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_MonthTo09: SetCommodityColDfn(columnDfn, "Due to " + DateUtil.Format(new DateTime().AddMonths(9), "MMM-yy"), 100, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_MonthTo12: SetCommodityColDfn(columnDfn, "Due to " + DateUtil.Format(new DateTime().AddMonths(12), "MMM-yy"), 100, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month04To06: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(4), "MMM-yy") + ":" + DateUtil.Format(new DateTime().AddMonths(6), "MMM-yy"), 100, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month07To09: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(7), "MMM-yy") + ":" + DateUtil.Format(new DateTime().AddMonths(9), "MMM-yy"), 100, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month10To12: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(10), "MMM-yy") + ":" + DateUtil.Format(new DateTime().AddMonths(12), "MMM-yy"), 100, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month07To12: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(7), "MMM-yy") + ":" + DateUtil.Format(new DateTime().AddMonths(12), "MMM-yy"), 100, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month04On: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(4), "MMM-yy") + " on", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month05On: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(5), "MMM-yy") + " on", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month06On: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(6), "MMM-yy") + " on", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month07On: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(7), "MMM-yy") + " on", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; case SbmCommodity.Column.Stock_DueIn_Month13On: SetCommodityColDfn(columnDfn, "Due " + DateUtil.Format(new DateTime().AddMonths(13), "MMM-yy") + " on", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; // Stock provisionally due in. case SbmCommodity.Column.Stock_DueIn_Provisional: SetCommodityColDfn(columnDfn, "Due (provisional)", 90, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = (byte)OrderQuantityDecimals; break; //----------------------------------------------------------------- // Requirements. case SbmCommodity.Column.Reqnt_AmountUnit_Earliest_ById: SetCommodityColDfn(columnDfn, "Earliest item amount", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = CurrencyDecimalsDefault; break; case SbmCommodity.Column.Reqnt_AmountUnit_Earliest_ByCode: SetCommodityColDfn(columnDfn, "Earliest item amount", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Double); columnDfn.NumDecimals = CurrencyDecimalsDefault; break; //----------------------------------------------------------------- // Associated data. case SbmCommodity.Column.CommodityCustomer_Count: SetCommodityColDfn(columnDfn, "Customer items", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.DataName = dataNameCommodityCustomerCount; columnDfn.ReadOnly = true; break; case SbmCommodity.Column.CommoditySupplier_Count: SetCommodityColDfn(columnDfn, "Supplier items", 80, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.DataName = dataNameCommoditySupplierCount; columnDfn.ReadOnly = true; break; case SbmCommodity.Column.Process_Count: SetCommodityColDfn(columnDfn, "Processes", 50, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.DataName = dataNameProcessCount; columnDfn.ReadOnly = true; break; case SbmCommodity.Column.PortfolioItem_Count: SetCommodityColDfn(columnDfn, "Portfolio items", 85, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center, DataValue.DataType.Long); columnDfn.DataName = dataNamePortfolioItemCount; columnDfn.ReadOnly = true; break; //------------------------------------------------------------------- // Barcode image. case SbmCommodity.Column.BarcodeImagePath: SetCommodityColDfn(columnDfn, "Barcode image file", 140, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center); break; case SbmCommodity.Column.BarcodeImage: SetCommodityColDfn(columnDfn, "Barcode image", 320, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Center); break; // Common properties. case SbmCommodity.Column.Notes: SetCommodityColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.Commodity_Notes); break; case SbmCommodity.Column.Status: SetCommodityColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Commodity_Status, ColumnAlignment.Center); break; case SbmCommodity.Column.Status_Desc: SetCommodityColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Commodity_Status, ColumnAlignment.Center); break; case SbmCommodity.Column.Status_Ind: SetCommodityColDfn(columnDfn, "Status", 50, SbmDbDfn.ColumnIdx.Commodity_Status, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; case SbmCommodity.Column.Status_Current_Y: case SbmCommodity.Column.Status_Current_X: SetCommodityColDfn(columnDfn, "Current", 60, SbmDbDfn.ColumnIdx.Commodity_Status, ColumnAlignment.Center, DataValue.DataType.String); break; case SbmCommodity.Column.Status_Current_Tick: SetCommodityColDfn(columnDfn, "Current", 60, SbmDbDfn.ColumnIdx.Commodity_Status, ColumnAlignment.Center, DataValue.DataType.Bool); columnDfn.BoolFormat = ColumnBoolFormat.Tick; break; case SbmCommodity.Column.CreateOn_Date: SetCommodityColDfn(columnDfn, "Created", 80, SbmDbDfn.ColumnIdx.Commodity_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; case SbmCommodity.Column.UpdateOn_Date: SetCommodityColDfn(columnDfn, "Updated", 80, SbmDbDfn.ColumnIdx.Commodity_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.ReadOnly = true; break; } if (!String.IsNullOrEmpty(caption)) columnDfn.Caption = caption; if (width > 0) columnDfn.Width = width; return columnDfn; } //------------------------------------------------------------------- // Commodity query filter. public override List GetCommodityQueryFilter(SbmCommodity.Params prm) { List filter = new List(); //--------------------------------------------------------------- // Common columns. String colCommodity_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity); String colCommodity_AffIdOwner = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AffIdOwner, aliasCommodity); String colCommodity_Type = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Type, aliasCommodity); String colCommodity_Code = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Code, aliasCommodity); String colCommodity_DescBrief = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DescBrief, aliasCommodity); String colCommodity_DescDetail = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DescDetail, aliasCommodity); String colCommodity_SpecSummary = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SpecSummary, aliasCommodity); String colCommodity_DrawingNo = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DrawingNo, aliasCommodity); String colCommodity_DrawingIssue = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DrawingIssue, aliasCommodity); //--------------------------------------------------------------- // Commodity Id. String includedIds = prm.IdsIncluded.Concat(","); if (!includedIds.IsEmpty()) filter.Add(colCommodity_Id + " IN (" + includedIds + ")"); String excludedIds = prm.IdsExcluded.Concat(","); if (!excludedIds.IsEmpty()) filter.Add(colCommodity_Id + " NOT IN (" + excludedIds + ")"); //--------------------------------------------------------------- // Organisation. // Must filter by organisation if insufficient alternative filetrs. if (!prm.IdsIncluded.HasValidIds() && !prm.PriceSetIdsIncluded.HasValidIds() && !SysId.IsValid(prm.AssociationIdCustomer) && !SysId.IsValid(prm.AssociationIdCommodityCustomer)) { if (!SysId.IsValid(AffiliateId_Owner)) throw new NotSupportedException("Commodity query filter - Organisation Id must be specified"); filter.Add(colCommodity_AffIdOwner + "=" + SysId.ToLong(AffiliateId_Owner)); } //--------------------------------------------------------------- // Type. if (prm.CommodityType == Sbm.CommodityType.AnyProduct) filter.Add(colCommodity_Type + " In (" + ((int)Sbm.CommodityType.Stock).ToString() + "," + ((int)Sbm.CommodityType.NonStock).ToString() + ")"); else if ((int)prm.CommodityType > 0) filter.Add(colCommodity_Type + "=" + ((int)prm.CommodityType).ToString()); if (prm.StockItemsOnly) filter.Add(colCommodity_Type + " IN (" + ((int)Sbm.CommodityType.Stock).ToString() + ")"); //--------------------------------------------------------------- // Code. if (!StringUtil.IsBlank(prm.CodeFull)) filter.Add(colCommodity_Code + "='" + DbQuery.FormatForCondition(prm.CodeFull) + "'"); else if (!StringUtil.IsBlank(prm.CodePartial)) { if (SessionConsole != null && AllowConfigOption(Sbm.ConfigOption.CommodityPartialCodeFilter)) filter.Add(colCommodity_Code + " LIKE '%" + DbQuery.FormatForLike(prm.CodePartial) + "%'"); else filter.Add(DbQuery.FormatFn_Left(colCommodity_Code, prm.CodePartial.Length) + "='" + DbQuery.FormatForCondition(prm.CodePartial) + "'"); } //--------------------------------------------------------------- // Brief Desc. bool allowEmbeddedTextSearch = true; bool allowFullTextSearch = true; if (!StringUtil.IsBlank(prm.DescBriefFull)) filter.Add(colCommodity_DescBrief + "='" + DbQuery.FormatForCondition(prm.DescBriefFull) + "'"); else if (!StringUtil.IsBlank(prm.DescBriefPartial)) { List filterDesc = new List(); filterDesc.Add(DbQuery.FormatFn_Left(colCommodity_DescBrief, prm.DescBriefPartial.Length) + "='" + DbQuery.FormatForLike(prm.DescBriefPartial) + "'"); if (allowEmbeddedTextSearch) { filterDesc.Add(colCommodity_DescBrief + " LIKE '%" + DbQuery.FormatForLike(prm.DescBriefPartial) + "%'"); if (allowFullTextSearch) { // Split the description into words: } } filter.Add(filterDesc.Concat(" OR ", "(", ")")); } //--------------------------------------------------------------- // DrawingNumber. if (!StringUtil.IsBlank(prm.DrawingNoFull)) { filter.Add(colCommodity_DrawingNo + "='" + DbQuery.FormatForCondition(prm.DrawingNoFull) + "'"); } else if (!StringUtil.IsBlank(prm.DrawingNoPartial)) { filter.Add(DbQuery.FormatFn_Left(colCommodity_DrawingNo, prm.DrawingNoPartial.Length) + "='" + DbQuery.FormatForCondition(prm.DrawingNoPartial) + "'"); } // DrawingIssue. if (!StringUtil.IsBlank(prm.DrawingIssueFull)) filter.Add(colCommodity_DrawingIssue + "='" + DbQuery.FormatForCondition(prm.DrawingIssueFull) + "'"); else if (!StringUtil.IsBlank(prm.DrawingIssuePartial)) filter.Add(DbQuery.FormatFn_Left(colCommodity_DrawingIssue, prm.DrawingIssuePartial.Length) + "='" + DbQuery.FormatForCondition(prm.DrawingIssuePartial) + "'"); //--------------------------------------------------------------- // Generic search. if (!StringUtil.IsBlank(prm.Search)) { List searchFilter = new List(); foreach (String rawSearchValue in prm.Search.Split(new char[] { ' ', ',', ';' })) { String searchValue = DbQuery.FormatForLike(StringUtil.TrimAll(rawSearchValue)); if (StringUtil.IsBlank(searchValue)) continue; List searchValueFilter = new List(); searchValueFilter.Add(colCommodity_Code + " LIKE '%" + searchValue + "%'"); searchValueFilter.Add(colCommodity_DescBrief + " LIKE '%" + searchValue + "%'"); searchValueFilter.Add(colCommodity_DescDetail + " LIKE '%" + searchValue + "%'"); searchValueFilter.Add(colCommodity_SpecSummary + " LIKE '%" + searchValue + "%'"); searchValueFilter.Add(colCommodity_DrawingNo + " LIKE '%" + searchValue + "%'"); searchFilter.Add(searchValueFilter.Concat(" OR ", "(", ")")); } filter.AddRange(searchFilter); } //--------------------------------------------------------------- // Catalog. String colCommodity_CatalogRef = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CatalogRef, aliasCommodity); if (!StringUtil.IsBlank(prm.CatalogRefPartial)) filter.Add(DbQuery.FormatFn_Left(colCommodity_CatalogRef, prm.CatalogRefPartial.Length) + "='" + DbQuery.FormatForCondition(prm.CatalogRefPartial) + "'"); //--------------------------------------------------------------- // Category. String categoryList = prm.Categories.Concat(",", "'", "'", true, true); if (!StringUtil.IsBlank(categoryList)) { List filterCategory = new List(); filterCategory.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Category, aliasCommodity) + " IN(" + categoryList + ")"); if (ColumnExists(SbmDbDfn.ColumnIdx.Commodity_Category2)) filterCategory.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Category2, aliasCommodity) + " IN(" + categoryList + ")"); if (ColumnExists(SbmDbDfn.ColumnIdx.Commodity_Category3)) filterCategory.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Category3, aliasCommodity) + " IN(" + categoryList + ")"); filter.Add(filterCategory.Concat(" OR ", "(", ")")); } //--------------------------------------------------------------- // Coding. String Commodity_RangeCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_RangeCode, aliasCommodity); if (!StringUtil.IsBlank(prm.RangeCode)) filter.Add(Commodity_RangeCode + "='" + DbQuery.FormatForCondition(prm.RangeCode) + "'"); String colCommodity_ColourCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_ColourCode, aliasCommodity); if (!StringUtil.IsBlank(prm.ColourCode)) filter.Add(colCommodity_ColourCode + "='" + DbQuery.FormatForCondition(prm.ColourCode) + "'"); String colCommodity_SourceCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SourceCode, aliasCommodity); if (!StringUtil.IsBlank(prm.SourceCode)) filter.Add(colCommodity_SourceCode + "='" + DbQuery.FormatForCondition(prm.SourceCode) + "'"); String colCommodity_SupplyMethodCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SupplyMethodCode, aliasCommodity); if (!StringUtil.IsBlank(prm.SupplyMethodCode)) filter.Add(colCommodity_SupplyMethodCode + "='" + DbQuery.FormatForCondition(prm.SupplyMethodCode) + "'"); String colCommodity_HandlingCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_HandlingCode, aliasCommodity); if (!StringUtil.IsBlank(prm.HandlingCode)) filter.Add(colCommodity_HandlingCode + "='" + DbQuery.FormatForCondition(prm.HandlingCode) + "'"); String colCommodity_DeliveryCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DeliveryCode, aliasCommodity); if (!StringUtil.IsBlank(prm.DeliveryCode)) filter.Add(colCommodity_DeliveryCode + "='" + DbQuery.FormatForCondition(prm.DeliveryCode) + "'"); String colCommodity_MaterialCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_MaterialCode, aliasCommodity); if (!StringUtil.IsBlank(prm.MaterialCode)) filter.Add(colCommodity_MaterialCode + "='" + DbQuery.FormatForCondition(prm.MaterialCode) + "'"); String colCommodity_FinishCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_FinishCode, aliasCommodity); if (!StringUtil.IsBlank(prm.FinishCode)) filter.Add(colCommodity_FinishCode + "='" + DbQuery.FormatForCondition(prm.FinishCode) + "'"); String colCommodity_PromotionCode = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_PromotionCode, aliasCommodity); if (!StringUtil.IsBlank(prm.PromotionCode)) filter.Add(colCommodity_PromotionCode + "='" + DbQuery.FormatForCondition(prm.PromotionCode) + "'"); //--------------------------------------------------------------- // Stock level. if (prm.StockLevelMin > decimal.MinValue || prm.StockLevelMax > decimal.MinValue) { // Prepare list of locations to be queried for current stock. PopulateLocationIdLists(); List locactionIdsStock = new List(); if (prm.StockLocationFilter == Sbm.LocationFilter.All) locactionIdsStock = locationIds_All; else if (prm.StockLocationFilter == Sbm.LocationFilter.Calc) locactionIdsStock = locationIds_Calc; else if (!SysId.IsValid(prm.LocationIdStock)) locactionIdsStock = locationIds_Sales; String stringLocactionStockId = locactionIdsStock.Concat(","); // Query the current stock level. String aliasStockLevel = "aCmdStkLvl"; DbQuery qryLvl = new DbQuery(Database.DbmsType); qryLvl.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.StockLevel), aliasStockLevel); qryLvl.Columns.Add("SUM(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Quantity, aliasStockLevel) + ")"); qryLvl.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Type, aliasStockLevel) + "=" + (int)Sbm.StockLevelType.CurrentLevel); qryLvl.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_CommodityId, aliasStockLevel) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); if (SysId.IsValid(prm.LocationIdStock)) qryLvl.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_LocationId, aliasStockLevel) + "=" + SysId.ToString(prm.LocationIdStock)); else qryLvl.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_LocationId, aliasStockLevel) + " IN (" + stringLocactionStockId + ")"); qryLvl.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Status, aliasStockLevel) + "='" + StatusCurrent + "'"); if (prm.StockLevelMin > decimal.MinValue) { filter.Add("(" + qryLvl.BuildQuery() + ") >= " + StringUtil.FormatNumeric(prm.StockLevelMin, 2)); } if (prm.StockLevelMax > decimal.MinValue) { filter.Add("(" + qryLvl.BuildQuery() + ") <= " + StringUtil.FormatNumeric(prm.StockLevelMax, 2)); } } //--------------------------------------------------------------- // Price set. if (prm.PriceSetIdsIncluded.HasValidIds()) { // Restrict to commodities that belong to the specified price sets. String aliasPrice = "aCmdPrc"; DbQuery qryPriceSet = new DbQuery(Database.DbmsType); qryPriceSet.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaPrice), aliasPrice); qryPriceSet.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaPrice_CommodityId, aliasPrice)); qryPriceSet.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaPrice_PriceSetId, aliasPrice) + " In (" + prm.PriceSetIdsIncluded.Concat(",") + ")"); filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity) + " In (" + qryPriceSet.BuildQuery() + ")"); } if (prm.PriceSetIdsExcluded.HasValidIds()) { // Restrict to commodities that do not belong to the specified price sets. String aliasPrice = "aCmdPrc"; DbQuery qryPriceSet = new DbQuery(Database.DbmsType); qryPriceSet.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.SaPrice), aliasPrice); qryPriceSet.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaPrice_CommodityId, aliasPrice)); qryPriceSet.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.SaPrice_PriceSetId, aliasPrice) + " Not In (" + prm.PriceSetIdsExcluded.Concat(",") + ")"); filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity) + " Not In (" + qryPriceSet.BuildQuery() + ")"); } //--------------------------------------------------------------- // Customer. if (SysId.IsValid(prm.AssociationIdCustomer)) { List filterCustId = new List(); filterCustId.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdCustomer, aliasCommodity) + "=0"); filterCustId.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdCustomer, aliasCommodity) + "=" + prm.AssociationIdCustomer.ToString()); filter.Add(filterCustId.Concat(" OR ")); } else if (!StringUtil.IsBlank(prm.CustomerName)) { // Partial or complete match on customer name: String filterAffiliate_CustomerName = "FltCustNameAff"; String filterAssociation_CustomerName = "FltCustNameAss"; // Build query to filter on customer name: DbQuery qryCustName = new DbQuery(Database.DbmsType); qryCustName.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), filterAffiliate_CustomerName); qryCustName.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), filterAssociation_CustomerName); qryCustName.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, filterAssociation_CustomerName)); qryCustName.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, filterAssociation_CustomerName) + "=" + Sbm.AssociationType.Customer.ToString()); qryCustName.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, filterAffiliate_CustomerName) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, filterAssociation_CustomerName)); String colAffiliate_CustomerName = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Name, filterAffiliate_CustomerName); qryCustName.Filters.Add(DbQuery.FormatFn_Left(colAffiliate_CustomerName, prm.CustomerName.Length) + "='" + DbQuery.FormatForCondition(prm.CustomerName) + "'"); // Add the customer name filter to the main filter list. List filterCustName = new List(); filterCustName.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdCustomer, aliasCommodity) + "=0"); filterCustName.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdCustomer, aliasCommodity) + " IN (" + qryCustName.BuildQuery() + ")"); filter.Add(filterCustName.Concat(" OR ")); } //--------------------------------------------------------------- // Supplier. if (!StringUtil.IsBlank(prm.SupplierName)) { // Partial or complete match on Supplier name. String filterAffiliate_SupplierName = "FltSuppNameAff"; String filterAssocation_SupplierName = "FltSuppNameAss"; // Build query to filter on Supplier name. DbQuery qrySuppName = new DbQuery(Database.DbmsType); qrySuppName.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), filterAffiliate_SupplierName); qrySuppName.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), filterAssocation_SupplierName); qrySuppName.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, filterAssocation_SupplierName)); qrySuppName.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Type, filterAssocation_SupplierName) + "=" + Sbm.AssociationType.Supplier.ToString()); qrySuppName.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, filterAffiliate_SupplierName) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, filterAssocation_SupplierName)); String colAffiliate_SupplierName = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Name, filterAffiliate_SupplierName); qrySuppName.Filters.Add(DbQuery.FormatFn_Left(colAffiliate_SupplierName, prm.SupplierName.Length) + "='" + DbQuery.FormatForCondition(prm.SupplierName) + "'"); // Add the Supplier name filter to the main filter list. List filterSupplierName = new List(); filterSupplierName.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdSupplier, aliasCommodity) + "=0"); filterSupplierName.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdSupplier, aliasCommodity) + " IN (" + qrySuppName.BuildQuery() + ")"); filter.Add(filterSupplierName.Concat(" OR ")); } //--------------------------------------------------------------- // Transaction. bool linkRequirement = false; bool linkTransaction = !StringUtil.IsBlank(prm.OrderRef); if (linkRequirement || linkTransaction) { String aliasCommodity_Transaction = "aCmdTrn"; String aliasCommodity_Requirement = "aCmdReq"; DbQuery qryReqnt = new DbQuery(Database.DbmsType); qryReqnt.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Requirement), aliasCommodity_Requirement)); qryReqnt.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_Id, aliasCommodity_Requirement)); qryReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_AffIdOwner, aliasCommodity_Requirement) + "=" + AffiliateId_Owner.ToString()); qryReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_CommodityId, aliasCommodity_Requirement) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); if (linkTransaction) { qryReqnt.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Transaction), aliasCommodity_Transaction)); qryReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Requirement_TransId, aliasCommodity_Requirement) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Id, aliasCommodity_Transaction)); qryReqnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Type, aliasCommodity_Transaction) + "=" + Sbm.TransactionType.SalesOrder.ToString()); if (!StringUtil.IsBlank(prm.OrderRef)) qryReqnt.Filters.Add(DbQuery.FormatFn_Left(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Transaction_Ref, aliasCommodity_Transaction), prm.OrderRef.Length) + "='" + DbQuery.FormatForCondition(prm.OrderRef) + "'"); } filter.Add("EXISTS(" + qryReqnt.BuildQuery() + ")"); } //--------------------------------------------------------------- // Commodities defined by Customer. if (SysId.IsValid(prm.AssociationIdCommodityCustomer) || !StringUtil.IsBlank(prm.AccountCodeCommodityCustomer)) { if (CanManageCommodityCustomers()) { DbQuery qryCmdCust = new DbQuery(Database.DbmsType); qryCmdCust.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.CommodityCustomer), aliasCommodity_CmdCustomer)); qryCmdCust.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_CommodityId, aliasCommodity_CmdCustomer)); if (SysId.IsValid(prm.AssociationIdCommodityCustomer)) { qryCmdCust.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_AssocIdCustomer, aliasCommodity_CmdCustomer) + "=" + prm.AssociationIdCommodityCustomer.ToString()); } if (!StringUtil.IsBlank(prm.AccountCodeCommodityCustomer)) { // To match the customer account code, must also join to the association table: String aliasCommodity_CmdCustAssoc = "aCmdCmdCustAss"; DbQueryJoin joinCmdCustAssoc = new DbQueryJoin(DbJoinType.Inner); joinCmdCustAssoc.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasCommodity_CmdCustAssoc); joinCmdCustAssoc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, aliasCommodity_CmdCustAssoc) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_AssocIdCustomer, aliasCommodity_CmdCustomer)); joinCmdCustAssoc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Code, aliasCommodity_CmdCustAssoc) + "='" + DbQuery.FormatForCondition(prm.AccountCodeCommodityCustomer) + "'"); qryCmdCust.Joins.Add(joinCmdCustAssoc); } filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity) + " IN (" + qryCmdCust.BuildQuery() + ")"); } else SaLogger.Error($"{SysUtil.Fn} CmdCust filter specified and CmdCust management not allowed"); } //--------------------------------------------------------------- // Status. String colCommodity_Status = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Status, aliasCommodity); if (prm.StatusCat == SbmCommodity.StatusCat.NotDeleted) filter.Add(colCommodity_Status + "<>'" + StatusDeleted + "'"); else if (prm.StatusCat == SbmCommodity.StatusCat.Current) filter.Add(colCommodity_Status + "='" + StatusCurrent + "'"); if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1"); return filter; } //------------------------------------------------------------------- // Commodity sort columns. public List GetCommoditySortColumns(SbmCommodity.Params prm) { // Sort sequence: List sortColumnNames = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for Commodity columns in case of conflict. String sortCol = String.Empty; if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.Commodity) { sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasCommodity); } else { sortCol = columnDfn.DataName; if (!StringUtil.IsBlank(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.Commodity_Code, aliasCommodity) + " ASC"); } return sortColumnNames; } //------------------------------------------------------------------- // Commodity count. private long GetCommodityCount(String filter) { ClearErrorState(); return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity)} As {aliasCommodity}", filter); } public override long GetCommodityCount(SbmCommodity.Params prm) { ClearErrorState(); return GetCommodityCount(GetCommodityQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // Commodity list. public override List GetCommodityList(SbmCommodity.Params prm) { ClearErrorState(); List commodities = new List(); DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity), aliasCommodity); Commodity_Db dbCommodity = new Commodity_Db(DbInfo); qry.Columns.AddRange(dbCommodity.ExistingColumnNames); qry.Filters.AddRange(GetCommodityQueryFilter(prm)); qry.OrderBy.AddRange(GetCommoditySortColumns(prm)); // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); dbCommand.CommandText = qry.BuildQuery(prm.ResultsPaging); using (DbDataReader dbDataReader = dbCommand.ExecuteReader()) { while (dbDataReader.Read()) { dbCommodity = new Commodity_Db(DbInfo); dbCommodity.PopulateFrom(dbDataReader); commodities.Add(CreateCommodity(dbCommodity)); } } } catch (Exception exc) { SetErrorState(ErrorMessage.DatabaseQueryException); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return commodities; } //------------------------------------------------------------------- // Commodity query execution. public override DbResultSet ExecuteCommodityQuery(List columns, SbmCommodity.Params prm) { ClearErrorState(); DbQuery query = CompileCommodityQuery(columns, prm); return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging)); } public override async Task ExecuteCommodityQueryAsync(List columns, SbmCommodity.Params prm) { ClearErrorState(); DbQuery query = CompileCommodityQuery(columns, prm); return await DbResultSet_DataReader.ExecuteQueryAsync(Database, query.BuildQuery(prm.ResultsPaging)) as DbResultSet; } private DbQuery CompileCommodityQuery(List columns, SbmCommodity.Params prm) { ClearErrorState(); PopulateLocationIdLists(); bool canViewSupplyFinancials = UserCanViewCommoditySupplyFinancials(); bool canViewSalesFinancials = UserCanViewCommoditySalesFinancials(); //--------------------------------------------------------------- // Construct query. DbQuery query = new DbQuery(Database.DbmsType); query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Commodity), aliasCommodity); // Stock locations. SysId locationStockId = null; List locationStockIds = new List(); if (prm.StockLocationFilter == Sbm.LocationFilter.All) locationStockIds = locationIds_All; else if (prm.StockLocationFilter == Sbm.LocationFilter.Calc) locationStockIds = locationIds_Calc; else if (SysId.IsValid(locationStockId)) locationStockIds.Add(locationStockId); else locationStockIds = locationIds_Sales; String stringLocactionStockId = locationStockIds.Concat(","); //--------------------------------------------------------------- // Commodity Properties - add columns as defined in query list. if (columns.HasId(SbmCommodity.Column.Id)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Type) || columns.HasId(SbmCommodity.Column.Type_Code) || columns.HasId(SbmCommodity.Column.Type_Desc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Type, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Code)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Code, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.DescBrief)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DescBrief, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.DescDetail)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DescDetail, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.DrawingNo)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DrawingNo, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.DrawingIssue)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DrawingIssue, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.ImagePath) || columns.HasId(SbmCommodity.Column.Image)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_ImagePath, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Category1Code) || columns.HasId(SbmCommodity.Column.Category1_Desc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Category, aliasCommodity)); if ((columns.HasId(SbmCommodity.Column.Category2Code) || columns.HasId(SbmCommodity.Column.Category2_Desc)) && ColumnExists(SbmDbDfn.ColumnIdx.Commodity_Category2)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Category2, aliasCommodity)); if ((columns.HasId(SbmCommodity.Column.Category3Code) || columns.HasId(SbmCommodity.Column.Category3_Desc)) && ColumnExists(SbmDbDfn.ColumnIdx.Commodity_Category3)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Category3, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Location)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Location, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Department)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Department, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.CatalogRef)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CatalogRef, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Weight) || columns.HasId(SbmCommodity.Column.Weight_ValueUnits)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Weight, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Weight_UomId) || columns.HasId(SbmCommodity.Column.Weight_Unit) || columns.HasId(SbmCommodity.Column.Weight_ValueUnits)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_UomIdWeight, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Length) || columns.HasId(SbmCommodity.Column.Length_ValueUnits)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Length, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Length_UomId) || columns.HasId(SbmCommodity.Column.Length_Unit) || columns.HasId(SbmCommodity.Column.Length_ValueUnits)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_UomIdLength, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Volume) || columns.HasId(SbmCommodity.Column.Volume_ValueUnits)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Volume, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Volume_UomId) || columns.HasId(SbmCommodity.Column.Volume_Unit) || columns.HasId(SbmCommodity.Column.Volume_ValueUnits)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_UomIdVolume, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Density) || columns.HasId(SbmCommodity.Column.Density_ValueUnits)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Density, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Density_UomId) || columns.HasId(SbmCommodity.Column.Density_Unit) || columns.HasId(SbmCommodity.Column.Density_ValueUnits)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_UomIdDensity, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.BoxQuantity) || columns.HasId(SbmCommodity.Column.BoxQuantity_ValueUnits)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_BoxQuantity, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.BoxQuantity_UomId) || columns.HasId(SbmCommodity.Column.BoxQuantity_Unit) || columns.HasId(SbmCommodity.Column.BoxQuantity_ValueUnits)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_UomIdBox, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Dimensions)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Dimensions, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SpecSummary)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SpecSummary, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.ICNTariffCode)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_ICNTariffCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.RangeCode) || columns.HasId(SbmCommodity.Column.RangeDesc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_RangeCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.ColourCode) || columns.HasId(SbmCommodity.Column.ColourDesc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_ColourCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SourceCode) || columns.HasId(SbmCommodity.Column.SourceDesc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SourceCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SupplyMethodCode) || columns.HasId(SbmCommodity.Column.SupplyMethodDesc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SupplyMethodCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.HandlingCode) || columns.HasId(SbmCommodity.Column.HandlingDesc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_HandlingCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.DeliveryCode) || columns.HasId(SbmCommodity.Column.DeliveryDesc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_DeliveryCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.MaterialCode) || columns.HasId(SbmCommodity.Column.MaterialDesc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_MaterialCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.FinishCode) || columns.HasId(SbmCommodity.Column.FinishDesc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_FinishCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.PromotionCode) || columns.HasId(SbmCommodity.Column.PromotionDesc)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_PromotionCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.NominalCode)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_NominalCode, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.NominalCodePurchase)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_NominalCodePurchase, aliasCommodity)); //--------------------------------------------------------------- // Currency (to come). if ((canViewSupplyFinancials && (columns.HasId(SbmCommodity.Column.CostPrice_Fmt))) || (canViewSalesFinancials && (columns.HasId(SbmCommodity.Column.SalesPrice_Fmt) || columns.HasId(SbmCommodity.Column.RetailPrice_Fmt) || columns.HasId(SbmCommodity.Column.RetailPricePlanned_Fmt) || columns.HasId(SbmCommodity.Column.GrossPrice_Fmt) || columns.HasId(SbmCommodity.Column.CarriageCostIndicative_Fmt)))) { } //--------------------------------------------------------------- // Purchasing. if (columns.HasId(SbmCommodity.Column.Supplier_Ref)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SupplierRef, aliasCommodity)); if (canViewSupplyFinancials && (columns.HasId(SbmCommodity.Column.CostPrice) || columns.HasId(SbmCommodity.Column.CostPrice_Fmt))) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CostPrice, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.PlaceOfOrigin)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_PlaceOfOrigin, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.MaterialCost) || columns.HasId(SbmCommodity.Column.MaterialCost_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_MaterialCost, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.MaterialCost_Fmt) || columns.HasId(SbmCommodity.Column.MaterialCurrencyId) || columns.HasId(SbmCommodity.Column.MaterialCurrency_Code) || columns.HasId(SbmCommodity.Column.MaterialCurrency_Symbol)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.ExWorksCost) || columns.HasId(SbmCommodity.Column.ExWorksCost_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_ExWorksCost, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.ExWorksCost_Fmt) || columns.HasId(SbmCommodity.Column.ExWorksCurrencyId) || columns.HasId(SbmCommodity.Column.ExWorksCurrency_Code) || columns.HasId(SbmCommodity.Column.ExWorksCurrency_Symbol)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdExWorks, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.ReorderLevel)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_ReorderLevel, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.ReorderQty)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_ReorderQty, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.QtyOnOrder)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_QtyOnOrder, aliasCommodity)); //--------------------------------------------------------------- // Sales. if (canViewSalesFinancials && (columns.HasId(SbmCommodity.Column.SalesPrice) || columns.HasId(SbmCommodity.Column.SalesPrice_Fmt) || columns.HasId(SbmCommodity.Column.GrossPrice) || columns.HasId(SbmCommodity.Column.GrossPrice_Fmt))) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesPrice, aliasCommodity)); if (canViewSalesFinancials && (columns.HasId(SbmCommodity.Column.RetailPrice) || columns.HasId(SbmCommodity.Column.RetailPrice_Fmt))) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_RetailPrice, aliasCommodity)); if (canViewSalesFinancials && (columns.HasId(SbmCommodity.Column.RetailPricePlanned) || columns.HasId(SbmCommodity.Column.RetailPricePlanned_Fmt))) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_RetailPricePlanned, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.CarriageCostIndicative) || columns.HasId(SbmCommodity.Column.CarriageCostIndicative_Fmt)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CarriageCostIndicative, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.MinOrderQty)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_MinOrderQty, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.UomIdSale)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_UomIdSale, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.PackQtySale)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_PackQty, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.LastOrderDate)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_LastOrderDate, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.LastOrderQty)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_LastOrderQty, aliasCommodity)); //--------------------------------------------------------------- // Sales budget. if (columns.HasId(SbmCommodity.Column.SalesProj_Annual)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjAnnual, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Jan) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth01, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Feb) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth02, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Mar) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth03, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Apr) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth04, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_May) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth05, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Jun) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth06, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Jul) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth07, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Aug) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth08, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Sep) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth09, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Oct) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth10, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Nov) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth11, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.SalesProj_Dec) || columns.HasId(SbmCommodity.Column.SalesProj_Period)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesProjMonth12, aliasCommodity)); // Stock. if (columns.HasId(SbmCommodity.Column.QtyInStock)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_QtyInStock, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.QtyAllocated)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_QtyAllocated, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.FreeStock)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_FreeStock, aliasCommodity)); // Common Properties if (columns.HasId(SbmCommodity.Column.Notes)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Notes, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.Status) || columns.HasId(SbmCommodity.Column.Status_Desc) || columns.HasId(SbmCommodity.Column.Status_Ind) || columns.HasId(SbmCommodity.Column.Status_Current_Y) || columns.HasId(SbmCommodity.Column.Status_Current_X) || columns.HasId(SbmCommodity.Column.Status_Current_Tick)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Status, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.CreateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CreateOn, aliasCommodity)); if (columns.HasId(SbmCommodity.Column.UpdateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_UpdateOn, aliasCommodity)); //--------------------------------------------------------------- // Supplier. bool hasSupplierName = columns.HasId(SbmCommodity.Column.Supplier_Name); if (hasSupplierName) { // Join to the association (owner) table. DbQueryJoin joinAssSupplier = new DbQueryJoin(DbJoinType.LeftOuter); joinAssSupplier.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasCommodity_AssocationSupplier); joinAssSupplier.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, aliasCommodity_AssocationSupplier) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdSupplier, aliasCommodity)); query.Joins.Add(joinAssSupplier); // Join to the affiliate (Supplier) table. DbQueryJoin joinAffSupplier = new DbQueryJoin(DbJoinType.LeftOuter); joinAffSupplier.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasCommodity_AffiliateSupplier); joinAffSupplier.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasCommodity_AffiliateSupplier) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, aliasCommodity_AssocationSupplier)); query.Joins.Add(joinAffSupplier); // Supplier Affiliate columns. List cmdSupplierAffiliateCols = new List() { SbmDbDfn.ColumnIdx.Affiliate_Name }; foreach (SbmDbDfn.ColumnIdx dbColumn in cmdSupplierAffiliateCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasCommodity_AffiliateSupplier), prefixCommodity_AffiliateSupplier + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------- // Customer. bool hasCustomerName = columns.HasId(SbmCommodity.Column.Customer_Name); if (hasCustomerName) { // Join to the association (owner table). DbQueryJoin joinAssCustomer = new DbQueryJoin(DbJoinType.LeftOuter); joinAssCustomer.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Association), aliasCommodity_AssocationCustomer); joinAssCustomer.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_Id, aliasCommodity_AssocationCustomer) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_AssIdCustomer, aliasCommodity)); query.Joins.Add(joinAssCustomer); // Join to the affiliate (customer) table. DbQueryJoin joinAffCustomer = new DbQueryJoin(DbJoinType.LeftOuter); joinAffCustomer.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Affiliate), aliasCommodity_AffiliateCustomer); joinAffCustomer.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Affiliate_Id, aliasCommodity_AffiliateCustomer) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Association_AffIdTarget, aliasCommodity_AssocationCustomer)); query.Joins.Add(joinAffCustomer); // Customer Affiliate columns. List cmdCustomerAffiliateCols = new List() { SbmDbDfn.ColumnIdx.Affiliate_Name }; foreach (SbmDbDfn.ColumnIdx dbColumn in cmdCustomerAffiliateCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasCommodity_AffiliateCustomer), prefixCommodity_AffiliateCustomer + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------- // Customer definition. if (CanManageCommodityCustomers()) { bool hasCmdCustField = false; if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_ProductCode); if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_AmountRetail); if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_AmountRetail_Fmt); if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_CurrencyIdRetail); if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_CurrencyIdRetail_Code); if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_CurrencyIdRetail_Symbol); if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_PromotionCode); if (!hasCmdCustField) hasCmdCustField = columns.HasId(SbmCommodity.Column.Cust_PromotionDesc); if (hasCmdCustField && (SysId.IsValid(prm.AssociationIdCommodityCustomer) || !StringUtil.IsBlank(prm.AccountCodeCommodityCustomer))) { // Join to the commodity customer. DbQueryJoin joinCmdCust = new DbQueryJoin(DbJoinType.LeftOuter); joinCmdCust.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.CommodityCustomer), aliasCommodity_CmdCustomer); joinCmdCust.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_CommodityId, aliasCommodity_CmdCustomer) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); if (SysId.IsValid(prm.AssociationIdCommodityCustomer)) { // Filter by the Customer's association Id. joinCmdCust.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_AssocIdCustomer, aliasCommodity_CmdCustomer) + "=" + prm.AssociationIdCommodityCustomer.ToString()); } query.Joins.Add(joinCmdCust); if (!StringUtil.IsBlank(prm.AccountCodeCommodityCustomer)) { // Join to the Association to filter by the Customer's account code. } // Add the CmdCust columns. List cmdCustCols = new List() { SbmDbDfn.ColumnIdx.CommodityCustomer_ProductCode, SbmDbDfn.ColumnIdx.CommodityCustomer_AmountRetail, SbmDbDfn.ColumnIdx.CommodityCustomer_CurrencyIdRetail, SbmDbDfn.ColumnIdx.CommodityCustomer_PromotionCode }; foreach (SbmDbDfn.ColumnIdx dbColumn in cmdCustCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasCommodity_CmdCustomer), prefixCommodity_CmdCustomer + SbmDbDfn.GetColumnName(dbColumn, false)); } } //--------------------------------------------------------------- // Uom Sale. if (columns.HasId(SbmCommodity.Column.UnitOfSale)) { // Join to the Unit of Measure table: DbQueryJoin joinUom = new DbQueryJoin(DbJoinType.LeftOuter); joinUom.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.UnitMeasure), aliasCommodity_UomSale); joinUom.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.UnitMeasure_Id, aliasCommodity_UomSale) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_UomIdSale, aliasCommodity)); query.Joins.Add(joinUom); // Add the UomSales columns. List uomSalesCols = new List() { SbmDbDfn.ColumnIdx.UnitMeasure_Single }; foreach (SbmDbDfn.ColumnIdx dbColumn in uomSalesCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasCommodity_UomSale), prefixCommodity_UomSale + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------- // Material Currency. if (columns.HasId(SbmCommodity.Column.MaterialCost_Fmt) || columns.HasId(SbmCommodity.Column.MaterialCurrency_Code) || columns.HasId(SbmCommodity.Column.MaterialCurrency_Symbol)) { // Join to the Currency table. DbQueryJoin joinCur = new DbQueryJoin(DbJoinType.LeftOuter); joinCur.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Currency), aliasCommodity_CurrencyMaterial); joinCur.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Currency_Id, aliasCommodity_CurrencyMaterial) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdMaterial, aliasCommodity)); query.Joins.Add(joinCur); // Add the Currency columns. List currencyMaterialCols = new List(); currencyMaterialCols.Add(SbmDbDfn.ColumnIdx.Currency_Code); currencyMaterialCols.Add(SbmDbDfn.ColumnIdx.Currency_Name); currencyMaterialCols.Add(SbmDbDfn.ColumnIdx.Currency_Symbol); currencyMaterialCols.Add(SbmDbDfn.ColumnIdx.Currency_Suffix); foreach (SbmDbDfn.ColumnIdx dbColumn in currencyMaterialCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasCommodity_CurrencyMaterial), prefixCommodity_CurrencyMaterial + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------- // ExWorks currency. if (columns.HasId(SbmCommodity.Column.ExWorksCost_Fmt) || columns.HasId(SbmCommodity.Column.ExWorksCurrency_Code) || columns.HasId(SbmCommodity.Column.ExWorksCurrency_Symbol)) { // Join to the Currency table. DbQueryJoin joinCur = new DbQueryJoin(DbJoinType.LeftOuter); joinCur.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Currency), aliasCommodity_CurrencyExWorks); joinCur.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Currency_Id, aliasCommodity_CurrencyExWorks) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_CurrencyIdExWorks, aliasCommodity)); query.Joins.Add(joinCur); // Add the Currency columns. List currencyExWorksCols = new List(); currencyExWorksCols.Add(SbmDbDfn.ColumnIdx.Currency_Code); currencyExWorksCols.Add(SbmDbDfn.ColumnIdx.Currency_Name); currencyExWorksCols.Add(SbmDbDfn.ColumnIdx.Currency_Symbol); currencyExWorksCols.Add(SbmDbDfn.ColumnIdx.Currency_Suffix); foreach (SbmDbDfn.ColumnIdx dbColumn in currencyExWorksCols) query.Columns.Add(SbmDbDfn.GetColumnNameQual(dbColumn, aliasCommodity_CurrencyExWorks), prefixCommodity_CurrencyExWorks + SbmDbDfn.GetColumnName(dbColumn, false)); } //--------------------------------------------------------------- // Tax code. if (columns.HasId(SbmCommodity.Column.TaxCode) || columns.HasId(SbmCommodity.Column.TaxRate) || columns.HasId(SbmCommodity.Column.GrossPrice)) { // Join to the Tax Code table. DbQueryJoin joinTxc = new DbQueryJoin(DbJoinType.LeftOuter); joinTxc.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.TaxCode), aliasCommodity_TaxCode_Sale); joinTxc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.TaxCode_Id, aliasCommodity_TaxCode_Sale) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_TaxCodeId, aliasCommodity)); query.Joins.Add(joinTxc); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.TaxCode_Code, aliasCommodity_TaxCode_Sale), prefixCommodity_TaxCode_Sale + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.TaxCode_Code, false)); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.TaxCode_TaxRate, aliasCommodity_TaxCode_Sale), prefixCommodity_TaxCode_Sale + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.TaxCode_TaxRate, false)); } if (canViewSalesFinancials && columns.HasId(SbmCommodity.Column.GrossPrice)) { // Calculate RRP: SalesPrice + TaxRate% String colCommodity_SalesPrice = "(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_SalesPrice, aliasCommodity) + "*(1.0+(" + prefixCommodity_TaxCode_Sale + SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.TaxCode_TaxRate, false) + "/100.0)))"; query.Columns.Add(colCommodity_SalesPrice, dataNameGrossPrice); } //--------------------------------------------------------------- // Last stock take. if (columns.HasId(SbmCommodity.Column.StockTake_Date)) { SysId locationIdSales = Internals.GetOwnerOption_StockLocation(Sbm.OrgOption_StockLocation.SalesOrderDefault); if (SysId.IsValid(locationStockId)) locationIdSales = locationStockId; if (SysId.IsValid(locationIdSales)) { // Join to the stock movements to identify the most recent stock take at the default sales location. String aliasCommodity_LastStockTake = "aCmdLST"; DbQuery qryStTk = new DbQuery(Database.DbmsType); qryStTk.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.StockLevel), aliasCommodity_LastStockTake); qryStTk.Columns.Add("MAX(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Recorded, aliasCommodity_LastStockTake) + ")"); qryStTk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_CommodityId, aliasCommodity_LastStockTake) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); qryStTk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_LocationId, aliasCommodity_LastStockTake) + "=" + locationIdSales.ToString()); qryStTk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Type, aliasCommodity_LastStockTake) + "=" + ((int)Sbm.StockLevelType.StockTake).ToString()); qryStTk.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Status, aliasCommodity_LastStockTake) + "='" + StatusCompleted + "'"); query.Columns.Add("(" + qryStTk.BuildQuery() + ")", dataNameLastStockTake); } } //--------------------------------------------------------------- // Sales. if (columns.HasId(SbmCommodity.Column.SalesYtdCalendar)) { // Current calendar year. DateTime earliest = new DateTime(DateTime.Today.Year, 1, 1); DateTime latest = DateTime.MinValue; query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_YtdCalendar); //if (DebugMode) SaLogger.Trace("BuildSalesQuantityQuery: " + BuildSalesQuantityQuery(earliest, latest, false, null)); } if (columns.HasId(SbmCommodity.Column.SalesPyCalendar)) { // Previous calendar year. DateTime earliest = new DateTime(DateTime.Today.Year, 1, 1); DateTime latest = new DateTime(DateTime.Today.Year - 1, 12, 31); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_PyCalendar); } if (columns.HasId(SbmCommodity.Column.SalesMonthCurrent)) { // Sales - current month. DateTime earliest = DateTime.Today.StartOfMonth(); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_MthCurrent); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast01)) { // Sales - part month 1: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-1); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth01); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast02)) { // Sales - part month 2: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-2); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth02); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast03)) { // Sales - part month 3: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-3); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth03); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast04)) { // Sales - part month 4: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-4); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth04); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast05)) { // Sales - part month 5: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-5); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth05); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast06)) { // Sales - part month 6: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-6); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth06); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast07)) { // Sales - part month 7: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-7); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth07); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast08)) { // Sales - part month 8: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-8); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth08); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast09)) { // Sales - part month 9: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-9); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth09); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast10)) { // Sales - part month 10: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-10); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth10); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast11)) { // Sales - part month 11: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-11); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth11); } if (columns.HasId(SbmCommodity.Column.SalesMonthPast12)) { // Sales - part month 12: DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(-12); DateTime latest = earliest.EndOfMonth(); query.Columns.Add("(" + BuildSalesQuantityQuery(earliest, latest, false, null) + ")", dataNameSales_Mth12); } if (columns.HasId(SbmCommodity.Column.StockSold_Period)) { // Stock sold during specified period. query.Columns.Add("(" + BuildSalesQuantityQuery(prm.StockSoldFrom, prm.StockSoldTo, false, null) + ")", dataNameStockSold_Period); } //--------------------------------------------------------------- // Allocated stock. if ((columns.HasId(SbmCommodity.Column.Stock_Allocated) || columns.HasId(SbmCommodity.Column.Stock_Available) || columns.HasId(SbmCommodity.Column.Stock_Available_MinZero)) && locationStockIds.Count > 0) { query.Columns.Add("(" + BuildAllocatedStockQuery(locationStockIds) + ")", dataNameStkLvl_Allocated); } if ((columns.HasId(SbmCommodity.Column.Stock_Allocated_Sales) || columns.HasId(SbmCommodity.Column.Stock_Available_Sales) || columns.HasId(SbmCommodity.Column.Stock_Available_Sales_MinZero)) && locationIds_Sales.Count > 0) { query.Columns.Add("(" + BuildAllocatedStockQuery(locationIds_Sales) + ")", dataNameStkLvl_Allocated_Sales); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Calc) && locationIds_Calc.Count > 0) { query.Columns.Add("(" + BuildAllocatedStockQuery(locationIds_Calc) + ")", dataNameStkLvl_Allocated_Calc); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_All) && locationIds_All.Count > 0) { query.Columns.Add("(" + BuildAllocatedStockQuery(locationIds_All) + ")", dataNameStkLvl_Allocated_All); } //--------------------------------------------------------------- // Current stock level. if ((columns.HasId(SbmCommodity.Column.Stock_CurrentLevel) || columns.HasId(SbmCommodity.Column.Stock_ImminentLevel) || columns.HasId(SbmCommodity.Column.Stock_Available) || columns.HasId(SbmCommodity.Column.Stock_Available_Sales)) && locationStockIds.Count > 0) { query.Columns.Add("(" + BuildCurrentStockQuery(locationStockIds) + ")", dataNameStkLvl_Current); } if ((columns.HasId(SbmCommodity.Column.Stock_CurrentLevel_Sales) || columns.HasId(SbmCommodity.Column.Stock_Available_Sales) || columns.HasId(SbmCommodity.Column.Stock_Available_Sales_MinZero)) && locationIds_Sales.Count > 0) { query.Columns.Add("(" + BuildCurrentStockQuery(locationIds_Sales) + ")", dataNameStkLvl_Current_Sales); } if (columns.HasId(SbmCommodity.Column.Stock_CurrentLevel_Calc) && locationIds_Calc.Count > 0) { query.Columns.Add("(" + BuildCurrentStockQuery(locationIds_Calc) + ")", dataNameStkLvl_Current_Calc); } if (columns.HasId(SbmCommodity.Column.Stock_CurrentLevel_All) && locationIds_All.Count > 0) { query.Columns.Add("(" + BuildCurrentStockQuery(locationIds_All) + ")", dataNameStkLvl_Current_All); } //--------------------------------------------------------------- // Stock bays. if (columns.HasId(SbmCommodity.Column.Stock_Bays)) { // Join to current stock level for the specified location to retrieve the bays. String aliasCommodity_StockBays = "aCmdStkBays"; DbQueryJoin joinStkBay = new DbQueryJoin(DbJoinType.LeftOuter); String sTblStkBays = (String)"(Select CommodityId, Min(IsNull(Bay1,'')+','+IsNull(Bay2,'')+','+IsNull(Bay3,'')) 'Bays' " + "From StockLevel " + "Where Type=10 And Status='CUR' And Len(Bay1)>0 " + // Type.eSapStockLevelType_CurrentLevel=10 (SysId.IsValid(prm.LocationIdStock) ? " And LocationId=" + prm.LocationIdStock.ToString() + " " : "") + "Group By CommodityId)"; joinStkBay.Table = new StringPair(sTblStkBays, aliasCommodity_StockBays); joinStkBay.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_CommodityId, aliasCommodity_StockBays) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); query.Columns.Add(aliasCommodity_StockBays + ".Bays", dataNameStkLvl_Bays); query.Joins.Add(joinStkBay); } if ((columns.HasId(SbmCommodity.Column.Stock_Bay1) || columns.HasId(SbmCommodity.Column.Stock_Bay2) || columns.HasId(SbmCommodity.Column.Stock_Bay3)) && SysId.IsValid(prm.LocationIdStock)) { // Join to current stock level for the specified location to retrieve the bays. String aliasCommodity_StkBay = "aCmdStkBay"; DbQueryJoin joinStkBay = new DbQueryJoin(DbJoinType.LeftOuter); joinStkBay.Table = new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.StockLevel), aliasCommodity_StkBay); joinStkBay.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Type, aliasCommodity_StkBay) + "=" + Sbm.StockLevelType.CurrentLevel.ToString()); joinStkBay.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_CommodityId, aliasCommodity_StkBay) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); joinStkBay.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_LocationId, aliasCommodity_StkBay) + "=" + prm.LocationIdStock.ToString()); joinStkBay.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Status, aliasCommodity_StkBay) + "='" + StatusCurrent + "'"); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Bay1, aliasCommodity_StkBay), dataNameStkLvl_Bay1); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Bay2, aliasCommodity_StkBay), dataNameStkLvl_Bay2); query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.StockLevel_Bay3, aliasCommodity_StkBay), dataNameStkLvl_Bay3); query.Joins.Add(joinStkBay); } //--------------------------------------------------------------- // Stock Due - Commodity and Container movements. bool bHasStockNextDueCols = (columns.HasId(SbmCommodity.Column.Stock_NextDue_Date) || columns.HasId(SbmCommodity.Column.Stock_NextDue_Quantity)); bool bHasCmdStockNextDueCols = (columns.HasId(SbmCommodity.Column.Stock_NextDue_Commodity_Date) || columns.HasId(SbmCommodity.Column.Stock_NextDue_Commodity_Quantity)); bool bHasContStockNextDueCols = (columns.HasId(SbmCommodity.Column.Stock_NextDue_Container_Date) || columns.HasId(SbmCommodity.Column.Stock_NextDue_Container_Quantity)); if ((bHasStockNextDueCols || bHasCmdStockNextDueCols) && (SysId.IsValid(locationStockId) || !stringLocactionStockId.IsEmpty())) { // When is the next commodity stock movement due and the associated quantity: String aliasCommodity_StockCommodity = "aCmdStkCmd"; String aliasCommodity_StockCommodityDate = "aCmdStkCmdDate"; // Sub query form join to consolidate commodity movements by date: DbQuery qryStkCmd = new DbQuery(Database.DbmsType); qryStkCmd.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), aliasCommodity_StockCommodity); qryStkCmd.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemId, aliasCommodity_StockCommodity)); qryStkCmd.Columns.Add("Min(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, aliasCommodity_StockCommodity) + ")", dataNameStkDue_NextCmdStkDate); qryStkCmd.GroupBy.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemId, aliasCommodity_StockCommodity)); qryStkCmd.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemType, aliasCommodity_StockCommodity) + "=" + ((int)Sbm.ItemType.Commodity).ToString()); qryStkCmd.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Type, aliasCommodity_StockCommodity) + "=" + ((int)Sbm.MovementType.StockTransfer).ToString()); if (SysId.IsValid(locationStockId)) qryStkCmd.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_LocationIdTo, aliasCommodity_StockCommodity) + "=" + locationStockId.ToString()); else { qryStkCmd.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_LocationIdTo, aliasCommodity_StockCommodity) + " IN (" + stringLocactionStockId + ")"); qryStkCmd.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_LocationIdFrom, aliasCommodity_StockCommodity) + " NOT IN (" + stringLocactionStockId + ")"); } qryStkCmd.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Status, aliasCommodity_StockCommodity) + "='" + StatusAwaiting + "'"); // Join main query to the commodity movements to get earliest expected movement date: DbQueryJoin joinStkCmd = new DbQueryJoin(DbJoinType.LeftOuter); joinStkCmd.Table = new StringPair("(" + qryStkCmd.BuildQuery() + ")", aliasCommodity_StockCommodityDate); joinStkCmd.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemId, aliasCommodity_StockCommodityDate) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); query.Joins.Add(joinStkCmd); query.Columns.Add(aliasCommodity_StockCommodityDate + "." + dataNameStkDue_NextCmdStkDate, dataNameStkDue_NextCmdStkDate); if (columns.HasId(SbmCommodity.Column.Stock_NextDue_Quantity) || columns.HasId(SbmCommodity.Column.Stock_NextDue_Commodity_Quantity)) { // Join to the commodity movements again and restrict to the date identified above. String aliasCommodity_StkCmdQty = "aStkCmdQty"; // Start with the same sub-query as above, but group by movement date as well as commodity Id and sum the quantities. qryStkCmd.Columns.Clear(); qryStkCmd.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemId, aliasCommodity_StockCommodity)); qryStkCmd.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, aliasCommodity_StockCommodity)); qryStkCmd.Columns.Add("Sum(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Quantity, aliasCommodity_StockCommodity) + ")", dataNameStkDue_NextCmdStkQty); qryStkCmd.GroupBy.Clear(); qryStkCmd.GroupBy.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemId, aliasCommodity_StockCommodity)); qryStkCmd.GroupBy.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, aliasCommodity_StockCommodity)); // Join main query to the commodity movements to get quantity for earliest expected movement date: DbQueryJoin joinStkCmdQty = new DbQueryJoin(DbJoinType.LeftOuter); joinStkCmdQty.Table = new StringPair("(" + qryStkCmd.BuildQuery() + ")", aliasCommodity_StkCmdQty); joinStkCmdQty.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemId, aliasCommodity_StkCmdQty) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id)); joinStkCmdQty.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, aliasCommodity_StkCmdQty) + "=" + aliasCommodity_StockCommodityDate + "." + dataNameStkDue_NextCmdStkDate); query.Joins.Add(joinStkCmdQty); query.Columns.Add(aliasCommodity_StkCmdQty + "." + dataNameStkDue_NextCmdStkQty, dataNameStkDue_NextCmdStkQty); } } if (StockControlConfig.AllowStockContainers() && Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Container)) && (bHasStockNextDueCols || bHasContStockNextDueCols) && (SysId.IsValid(locationStockId) || !stringLocactionStockId.IsEmpty())) { // When is the next container stock movement due that includes this commodity. // Sub query form join to consolidate commodity movements by date: String aliasCommodity_StockContainer_Movement = "aStkCntMov"; String aliasCommodity_StockContainer_Container = "aStkCntCnt"; String aliasCommodity_StkCntCit = "aStkCntCit"; DbQuery qryStkCnt = new DbQuery(Database.DbmsType); qryStkCnt.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Movement), aliasCommodity_StockContainer_Movement); qryStkCnt.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.Container), aliasCommodity_StockContainer_Container); qryStkCnt.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ContainerItem), aliasCommodity_StkCntCit); qryStkCnt.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemId, aliasCommodity_StkCntCit)); qryStkCnt.Columns.Add("MIN(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, aliasCommodity_StockContainer_Movement) + ")", dataNameStkDue_NextCntStkDate); qryStkCnt.GroupBy.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemId, aliasCommodity_StkCntCit)); qryStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Type, aliasCommodity_StockContainer_Movement) + "=" + ((int)Sbm.MovementType.StockTransfer).ToString()); qryStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemType, aliasCommodity_StockContainer_Movement) + "=" + (((int)Sbm.ItemType.Container).ToString()).ToString()); qryStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_Id, aliasCommodity_StockContainer_Container) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_ItemId, aliasCommodity_StockContainer_Movement)); qryStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ContainerId, aliasCommodity_StkCntCit) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_Id, aliasCommodity_StockContainer_Container)); qryStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemType, aliasCommodity_StkCntCit) + "=" + ((int)Sbm.ItemType.Commodity).ToString()); if (SysId.IsValid(locationStockId)) qryStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_LocationIdTo, aliasCommodity_StockContainer_Movement) + "=" + locationStockId.ToString()); else { qryStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_LocationIdTo, aliasCommodity_StockContainer_Movement) + " IN (" + stringLocactionStockId + ")"); qryStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_LocationIdFrom, aliasCommodity_StockContainer_Movement) + " NOT IN (" + stringLocactionStockId + ")"); } qryStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Status, aliasCommodity_StockContainer_Movement) + "='" + StatusAwaiting + "'"); qryStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Container_Status, aliasCommodity_StockContainer_Container) + "<>'" + StatusCancelled + "'"); // Join main query to the container movements to get earliest expected movement date: String aliasCommodity_StockContainerDate = "aStkCntDate"; DbQueryJoin joinStkCnt = new DbQueryJoin(DbJoinType.LeftOuter); joinStkCnt.Table = new StringPair("(" + qryStkCnt.BuildQuery() + ")", aliasCommodity_StockContainerDate); joinStkCnt.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemId, aliasCommodity_StockContainerDate) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); query.Joins.Add(joinStkCnt); query.Columns.Add(aliasCommodity_StockContainerDate + "." + dataNameStkDue_NextCntStkDate, dataNameStkDue_NextCntStkDate); if (columns.HasId(SbmCommodity.Column.Stock_NextDue_Quantity) || columns.HasId(SbmCommodity.Column.Stock_NextDue_Container_Quantity)) { // Join to the commodity movements again and restrict to the date identified above. String aliasCommodity_StockContainer_Quality = "aStkCntQty"; // Start with the same sub-query as above, but group by movement date as well as commodity Id and sum the quantities. qryStkCnt.Columns.Clear(); qryStkCnt.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemId, aliasCommodity_StkCntCit)); qryStkCnt.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, aliasCommodity_StockContainer_Movement)); qryStkCnt.Columns.Add("SUM(" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_Quantity, aliasCommodity_StkCntCit) + ")", dataNameStkDue_NextCntStkQty); qryStkCnt.GroupBy.Clear(); qryStkCnt.GroupBy.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemId, aliasCommodity_StkCntCit)); qryStkCnt.GroupBy.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, aliasCommodity_StockContainer_Movement)); // Join main query to the container movements to get quantity for the earliest expected movement date. DbQueryJoin joinStkCntQty = new DbQueryJoin(DbJoinType.LeftOuter); joinStkCntQty.Table = new StringPair("(" + qryStkCnt.BuildQuery() + ")", aliasCommodity_StockContainer_Quality); joinStkCntQty.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ContainerItem_ItemId, aliasCommodity_StockContainer_Quality) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); joinStkCntQty.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Movement_Movement, aliasCommodity_StockContainer_Quality) + "=" + aliasCommodity_StockContainerDate + "." + dataNameStkDue_NextCntStkDate); query.Joins.Add(joinStkCntQty); query.Columns.Add(aliasCommodity_StockContainer_Quality + "." + dataNameStkDue_NextCntStkQty, dataNameStkDue_NextCntStkQty); } } //--------------------------------------------------------------- // Imminent stock level. if ((columns.HasId(SbmCommodity.Column.Stock_Due_Imminently) || columns.HasId(SbmCommodity.Column.Stock_ImminentLevel)) && (SysId.IsValid(locationStockId) || !stringLocactionStockId.IsEmpty())) { // Calculate the imminent stock level: if (Internals.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.ImminentStock)) { PlannedStockMovements_Params prmPSM = new PlannedStockMovements_Params(); prmPSM.prmCmd = prm; prmPSM.excludeAwaitingContainers = !Internals.GetOwnerOption_AllowOption(Sbm.OrgOption_AllowOption.AwaitingContainersInImminentStock); int weeksImminentStock = Math.Max(0, Math.Min(12, Internals.GetOwnerOption_UpdateLimit(Sbm.OrgOption_PeriodWeeks.ImminentStockDue, 0))); prmPSM.latest = DateTime.Today.StartOfWorkingWeek().AddDays(weeksImminentStock * 7); query.Columns.Add(BuildPlannedStockMovementsQuery(prmPSM), dataNameStkDue_Imminent); } } //--------------------------------------------------------------- // Stock movements if (SysId.IsValid(locationStockId) || !StringUtil.IsBlank(stringLocactionStockId)) { // Stock due in by future weeks. if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week1)) { DateTime earliest = DateTime.MinValue;// No earliest date - to pick up any past planned movements. DateTime latest = DateTime.Today.StartOfWorkingWeek().AddDays(4); // End of this week (Monday + 4 = Friday). query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week1); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week2)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((2 * 7) - 9);// From the Saturday following week 1. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week2); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week3)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((3 * 7) - 9);// From the Saturday following week 2. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week3); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week4)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((4 * 7) - 9);// From the Saturday following week 3. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week4); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week5)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((5 * 7) - 9);// From the Saturday following week 4. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week5); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week6)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((6 * 7) - 9);// From the Saturday following week 5. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week6); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week7)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((7 * 7) - 9);// From the Saturday following week 6. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week7); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week8)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((8 * 7) - 9);// From the Saturday following week 7. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week8); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week9)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((9 * 7) - 9);// From the Saturday following week 8. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week9); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week10)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((10 * 7) - 9); // From the Saturday following week 9. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week10); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week11)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((11 * 7) - 9); // From the Saturday following week 10. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week11); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week12)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays((12 * 7) - 9); // From the Saturday following week 11. DateTime latest = earliest.AddDays(6);// End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week12); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week1To2)) { DateTime earliest = DateTime.MinValue;// No earliest date - to pick up any overdue movements. DateTime latest = DateTime.Today.StartOfWorkingWeek().AddDays(11); // End of the following week (Monday + 11 = Friday). query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week1To2); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week3To4)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(12); // From the Saturday following week 2. DateTime latest = earliest.AddDays(13);// End of the following week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week3To4); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week5To6)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(26); // From the Saturday following week 4. DateTime latest = earliest.AddDays(13);// End of the following week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week5To6); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week7To8)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(40); // From the Saturday following week 6. DateTime latest = earliest.AddDays(13);// End of the following week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week7To8); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week9To10)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(54); // From the Saturday following week 8. DateTime latest = earliest.AddDays(13);// End of the following week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week9To10); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week11To12)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(68); // From the Saturday following week 10. DateTime latest = earliest.AddDays(13);// End of the following week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week11To12); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week7On)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(40); // From the Saturday following week 6. DateTime latest = DateTime.MinValue; query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week7On); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Week13On)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(82); // From the Saturday following week 12. DateTime latest = DateTime.MinValue; query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Week13On); } //--------------------------------------------------------------- // Stock due in future months: if (columns.HasId(SbmCommodity.Column.Stock_DueIn_MonthCurrent)) { DateTime earliest = DateTime.MinValue; // No earliest date - to pick up any past planned movements. DateTime latest = DateTime.Today.EndOfMonth(); // Movements to end of current month. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_MonthCurr); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month01)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(1);// First day of month 1. DateTime latest = earliest.EndOfMonth();// Last day of month. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month01); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month02)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(2); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month02); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month03)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(3); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month03); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month04)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(4); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month04); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month05)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(5); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month05); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month06)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(6); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month06); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month07)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(7); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month07); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month08)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(8); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month08); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month09)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(9); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month09); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month10)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(10); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month10); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month11)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(11); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month11); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month12)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(12); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month12); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_MonthTo03)) { // Up to 3 months in future. DateTime earliest = DateTime.MinValue; DateTime latest = DateTime.Today.StartOfMonth().AddMonths(3).EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_MonthTo03); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_MonthTo06)) { // Up to 6 months in future. DateTime earliest = DateTime.MinValue; DateTime latest = DateTime.Today.StartOfMonth().AddMonths(6).EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_MonthTo06); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_MonthTo09)) { // Up to 9 months in future. DateTime earliest = DateTime.MinValue; DateTime latest = DateTime.Today.StartOfMonth().AddMonths(9).EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_MonthTo09); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_MonthTo12)) { // Up to 12 months in future. DateTime earliest = DateTime.MinValue; DateTime latest = DateTime.Today.StartOfMonth().AddMonths(12).EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_MonthTo12); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month04To06)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(4); DateTime latest = earliest.AddMonths(2).EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month04To06); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month07To09)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(7); DateTime latest = earliest.AddMonths(2).EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month07To09); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month10To12)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(10); DateTime latest = earliest.AddMonths(2).EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month10To12); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month07To12)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(7); DateTime latest = earliest.AddMonths(5).EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month07To12); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month04On)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(4); DateTime latest = DateTime.MinValue; query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month04On); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month05On)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(5); DateTime latest = DateTime.MinValue; query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month05On); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month06On)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(6); DateTime latest = DateTime.MinValue; query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month06On); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month07On)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(7); DateTime latest = DateTime.MinValue; query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month07On); } if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Month13On)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(13); DateTime latest = DateTime.MinValue; query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Month13On); } //--------------------------------------------------------------- // Stock provisionally due in: if (columns.HasId(SbmCommodity.Column.Stock_DueIn_Provisional)) { DateTime earliest = DateTime.MinValue; DateTime latest = DateTime.MinValue; query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkDue_Provisional); } //--------------------------------------------------------------- // Stock allocated by future weeks. if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Week1)) { DateTime earliest = DateTime.MinValue; // No earliest date - to pick up any past planned movements. DateTime latest = DateTime.Today.StartOfWorkingWeek().AddDays(4); // End of this week (Monday + 4 = Friday). query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Week1); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Week2)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(5); // From the Saturday following week 1. DateTime latest = earliest.AddDays(6); // End of that week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Week2); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Week3To4)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(12); // From the Saturday following week 2. DateTime latest = earliest.AddDays(13);// End of the following week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Week3To4); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Week5To6)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(26); // From the Saturday following week 4. DateTime latest = earliest.AddDays(13);// End of the following week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Week5To6); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Week7To8)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(40); // From the Saturday following week 6. DateTime latest = earliest.AddDays(13);// End of the following week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Week7To8); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Week9To10)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(54); // From the Saturday following week 8. DateTime latest = earliest.AddDays(13);// End of the following week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Week9To10); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Week11To12)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(68); // From the Saturday following week 10. DateTime latest = earliest.AddDays(13);// End of the following week. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Week11To12); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Week13On)) { DateTime earliest = DateTime.Today.StartOfWorkingWeek().AddDays(82); // From the Saturday following week 12. DateTime latest = DateTime.MinValue; query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Week13On); } // Stock allocations by month: if (columns.HasId(SbmCommodity.Column.Stock_Allocated_MonthCurrent)) { DateTime earliest = DateTime.MinValue; DateTime latest = DateTime.Today.StartOfMonth().EndOfMonth(); // End of current month. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_MonthCurr); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month01)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(1); // Start of next month. DateTime latest = earliest.EndOfMonth(); // End of next month. query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month01); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month02)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(2); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month02); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month03)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(3); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month03); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month04)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(4); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month04); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month05)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(5); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month05); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month06)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(6); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month06); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month07)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(7); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month07); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month08)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(8); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month08); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month09)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(9); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month09); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month10)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(10); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month10); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month11)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(11); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month11); } if (columns.HasId(SbmCommodity.Column.Stock_Allocated_Month12)) { DateTime earliest = DateTime.Today.StartOfMonth().AddMonths(12); DateTime latest = earliest.EndOfMonth(); query.Columns.Add(BuildPlannedStockMovementsQuery(earliest, latest, prm, true, false, null), dataNameStkAll_Month12); } } //--------------------------------------------------------------- // Requirements. if (columns.HasId(SbmCommodity.Column.Reqnt_AmountUnit_Earliest_ById)) { String qry = "Select req3.AmountUnit " + "From (Select Min(req1.Id) 'IdMin' From Requirement req1 Where req1.CommodityId=Commodity.Id Group By CommodityId) req2 " + "Inner Join Requirement req3 on req3.Id=req2.IdMin"; query.Columns.Add("(" + qry + ")", dataNameRequirement_AmtUnitEarlId); } if (columns.HasId(SbmCommodity.Column.Reqnt_AmountUnit_Earliest_ByCode)) { String sQry = "Select req3.AmountUnit " + "From (Select Min(req1.Id) 'IdMin' From Requirement req1 Where req1.ProductCode=Commodity.Code Group By ProductCode) req2 " + "Inner Join Requirement req3 on req3.Id=req2.IdMin"; query.Columns.Add("(" + sQry + ")", dataNameRequirement_AmtUnitEarlCode); } //--------------------------------------------------------------- // Commodity Customer count. if (columns.HasId(SbmCommodity.Column.CommodityCustomer_Count) && Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.CommodityCustomer))) { // Count the Customer items for this Commodity. String aliasCommodityCustomerCount = "aCmdCust"; DbQuery qryProc = new DbQuery(Database.DbmsType); qryProc.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.CommodityCustomer), aliasCommodityCustomerCount)); qryProc.Columns.Add("COUNT(*)"); qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_CommodityId, aliasCommodityCustomerCount) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommodityCustomer_Status, aliasCommodityCustomerCount) + " Not In ('" + StatusDeleted + "')"); query.Columns.Add("(" + qryProc.BuildQuery() + ")", dataNameCommodityCustomerCount); } // Commodity Supplier count. if (columns.HasId(SbmCommodity.Column.CommoditySupplier_Count) && Database.TableExists(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.CommoditySupplier))) { // Count the Supplier items for this Commodity. String aliasCommoditySupplierCount = "aCmdCust"; DbQuery qryProc = new DbQuery(Database.DbmsType); qryProc.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.CommoditySupplier), aliasCommoditySupplierCount)); qryProc.Columns.Add("COUNT(*)"); qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommoditySupplier_CommodityId, aliasCommoditySupplierCount) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.CommoditySupplier_Status, aliasCommoditySupplierCount) + " Not In ('" + StatusDeleted + "')"); query.Columns.Add("(" + qryProc.BuildQuery() + ")", dataNameCommoditySupplierCount); } //--------------------------------------------------------------- // Process count. if (columns.HasId(SbmCommodity.Column.Process_Count)) { // Count the processes for this commodity (in the ItemLink table): String aliasProcessCount = "aProc"; DbQuery qryProc = new DbQuery(Database.DbmsType); qryProc.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), aliasProcessCount)); qryProc.Columns.Add("COUNT(*)"); qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, aliasProcessCount) + "=" + ((int)Sbm.ItemType.Commodity).ToString()); qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasProcessCount) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); qryProc.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, aliasProcessCount) + "=" + ((int)Sbm.ItemType.Process).ToString()); query.Columns.Add("(" + qryProc.BuildQuery() + ")", dataNameProcessCount); } //--------------------------------------------------------------- // Portfolio item count. if (columns.HasId(SbmCommodity.Column.PortfolioItem_Count)) { // Count the portfolio items for this commodity. String aliasPortfolioItemCount = "CmdPrtItm"; DbQuery qryPrtItm = new DbQuery(Database.DbmsType); qryPrtItm.Tables.Add(new StringPair(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.PortfolioItem), aliasPortfolioItemCount)); qryPrtItm.Columns.Add("COUNT(*)"); //qryPrtItm.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.PortfolioItem_ItemType,aliasCommodity_PortfolioItem)+"="+String(eSapItemTypeCommodity)); qryPrtItm.Filters.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.PortfolioItem_CommodityId, aliasPortfolioItemCount) + "=" + SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Commodity_Id, aliasCommodity)); query.Columns.Add("(" + qryPrtItm.BuildQuery() + ")", dataNamePortfolioItemCount); } //--------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetCommodityQueryFilter(prm)); if (prm.IdsIncluded.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetCommoditySortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------- return query; } //------------------------------------------------------------------- } //======================================================================= }