using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.BusinessMgr.Net.Standard.Dbas.Bus; using Sarand.BusinessMgr.Net.Standard.Dbas.Internal; using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.Utils; using Sarand.Net.Standard.Dbas.Data; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr { //======================================================================= // Data Item Manager - Item Links. //======================================================================= partial class SbmDataItemMgr_Dbas { //------------------------------------------------------------------- // Get Item. public override SbmItemLink GetItemLink(SbmItemLink.Params prm) { return GetItemLink(GetItemLinkQueryFilter(prm).Concat(" AND ", "(", ")")); } private SbmItemLink GetItemLink(String filter) { ClearErrorState(); long count = GetItemLinkCount(filter); if (count == 0) return null; if (count != 1) { SetErrorState(ErrorMessage.MultipleItemsFound); return null; } SbmItemLink itemLink = null; // Query data. using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); ItemLink_Db dbItemLink = new ItemLink_Db(DbInfo); dbItemLink.PopulateFrom(dbCommand, aliasItemLink, filter); itemLink = CreateItemLink(dbItemLink); } catch (Exception exc) { SetErrorState(ErrorMessage.DatabaseQueryException); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return itemLink; } //------------------------------------------------------------------- // Create Item. public override SbmItemLink CreateItemLink(Sbm.ItemLinkType itemLinkType, Sbm.ItemType itemTypeFrom, SysId itemIdFrom, Sbm.ItemType itemTypeTo, SysId itemIdTo) { ClearErrorState(); SbmItemLink itemLink = null; if (itemLinkType > 0) itemLink = new SbmItemLink_Dbas(itemLinkType, itemTypeFrom, itemIdFrom, itemTypeTo, itemIdTo, 0); else SetErrorState("Asset type not identified"); return itemLink; } private SbmItemLink_Dbas CreateItemLink(ItemLink_Db dbItemLink) { ClearErrorState(); SbmItemLink_Dbas itemLink = new SbmItemLink_Dbas((Sbm.ItemLinkType)dbItemLink._Type, (Sbm.ItemType)dbItemLink._ItemTypeFrom, new SysId(dbItemLink._ItemIdFrom), (Sbm.ItemType)dbItemLink._ItemTypeTo, new SysId(dbItemLink._ItemIdTo), (ushort)dbItemLink._Flags); PopulateFrom(dbItemLink, itemLink); return itemLink; } //------------------------------------------------------------------- // Has Item. public override bool HasItemLinks(Sbm.ItemType itemType, SysId itemId) { ClearErrorState(); if ((int)itemType > 0 || !SysId.IsValid(itemId)) return false; String colItemTypeFrom = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom); String colItemIdFrom = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom); String colItemTypeTo = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo); String colItemIdTo = SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo); String filterItemFrom = colItemTypeFrom + "=" + ((int)itemType).ToString() + " AND " + colItemIdFrom + "=" + itemId.ToString(); String filterItemTo = colItemTypeTo + "=" + ((int)itemType).ToString() + " AND " + colItemIdTo + "=" + itemId.ToString(); String filter = "(" + filterItemFrom + ") OR (" + filterItemTo + ")"; return Database.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), /*SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_Type),*/ filter) > 0; } //------------------------------------------------------------------- // Validate Item. public override bool IsValidItemLinkData(SbmItemLink.Data data, SbmItemLink.ErrField errField) { ClearErrorState(); if (!base.IsValidItemLinkData(data, errField)) return false; return true; } //------------------------------------------------------------------- // Insert Item. public override bool InsertItemLink(SbmItemLink itemLink, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidItemLink(itemLink)) return false; if (SysId.IsValid(itemLink.Id)) return SetErrorState(ErrorMessage.ValidItemId); using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { dbConnection.Open(); ItemLink_Db dbItemLink = new ItemLink_Db(DbInfo); PopulateTo(dbItemLink, itemLink, dbUpdateInfo); dbItemLink.ExecuteInsertCommand(dbCommand); itemLink.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Inserted. " + GetLogProperties(itemLink).Concat(": ").Concat("", "\n\t")); } catch (Exception exc) { SetErrorState(exc.Message); } } return OK; } //------------------------------------------------------------------- // Update Item. public override bool UpdateItemLink(SbmItemLink itemLink, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!IsValidItemLink(itemLink)) return false; if (!SysId.IsValid(itemLink.Id)) return SetErrorState(ErrorMessage.InvalidItemId); if (!itemLink.Changed) { if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Data not changed. " + GetLogProperties(itemLink).Concat(": ").Concat("", "\n\t")); return true; } using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve Item. dbConnection.Open(); ItemLink_Db dbItemLink = new ItemLink_Db(DbInfo); dbItemLink.PopulateFrom(dbCommand, aliasItemLink, "Id=" + SysId.ToString(itemLink.Id)); SbmUpdateLogItemMonitor_ItemLink updateLogMonitor = new SbmUpdateLogItemMonitor_ItemLink(Internals, CreateItemLink(dbItemLink)); // Update properties. PopulateTo(dbItemLink, itemLink, dbUpdateInfo); dbItemLink.ExecuteUpdateCommand(dbCommand); itemLink.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Updated. " + GetLogProperties(itemLink).Concat(": ").Concat("", "\n\t")); // Record updates. updateLogMonitor.RecordUpdatedValues(itemLink); updateLogMonitor.LogUpdates(); } catch (Exception exc) { SetErrorState(exc.Message); } } return OK; } //------------------------------------------------------------------- // U p d a t e I t e m L i n k s //------------------------------------------------------------------- // Jan-2010: Duplicate Item Links [MPE] // 10490 key value with multiple rows // LinkType = 10 [eSapItemLink_ItemProcess]; Item Type From = 32: 406 key values, last updated early 2005. // LinkType = 20 [eSapItemLink_Requirement_CostEstimate]; Item Type From = 52: 1080 key values, last updated recently. // Problem stems from sequence not being set for cost estimates. //------------------------------------------------------------------- public override bool StoreFromItemLinks(Sbm.ItemLinkType itemLinkType, ItemId itemIdFrom, List itemLinks, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if ((int)itemLinkType < 1) return SetErrorState("invalid link type"); // Validate item links. foreach (SbmItemLink itemLink in itemLinks) { if (itemLink == null) continue; if (itemLink.ItemLinkType != itemLinkType) return SetErrorState("inconsistent link type found in item list"); if ((int)itemLink.ItemTypeFrom != itemIdFrom.Type) return SetErrorState("inconsistent 'from' item type found in item list"); if (itemLink.ItemIdFrom != itemIdFrom.Id) return SetErrorState("inconsistent 'from' item id found in item list"); if (itemLink.Seq < 1) return SetErrorState("invalid sequence (" + itemLink.Seq.ToString() + ") found in item list"); } // Make copy for a links list so can keep track of those that have been updated - NB Do not delete any of the links in this list as they are owned by the external list. List itemLinksLocal = new List(itemLinks); SbmItemLink.Params prm = new SbmItemLink.Params(); prm.ItemLinkType = itemLinkType; prm.ItemTypeFrom = (Sbm.ItemType)itemIdFrom.Type; prm.ItemIdFrom = itemIdFrom.Id; foreach (SbmItemLink itemLink in DataItemMgr.GetItemLinkList(prm)) { // Does this link still exist in the list. if (itemLinksLocal.FindByLink(itemLinkType, (Sbm.ItemType)itemIdFrom.Type, itemIdFrom.Id, prm.ItemTypeTo, prm.ItemIdTo)) { if (UpdateItemLink(itemLink, dbUpdateInfo)) { // Want to SetChangesMade(false) but would have to do it in the main list rather than the copy. } else SetErrorState("failed to update link"); // Remove the lisk from the local list (without deleting it). itemLinksLocal.RemoveByLink(itemLinkType, (Sbm.ItemType)itemIdFrom.Type, itemIdFrom.Id, prm.ItemTypeTo, prm.ItemIdTo); } else { // Link no longer required. if (!DeleteItemLink(itemLink, dbUpdateInfo)) SetErrorState("failed to delete link"); } } foreach (SbmItemLink itemLink in itemLinksLocal) { if (InsertItemLink(itemLink, dbUpdateInfo)) { // Want to SetChangesMade(false) but would have to do it in the main list rather than the copy. } else SetErrorState("failed to add link"); } return OK; } public override bool StoreToItemLinks(Sbm.ItemLinkType itemLinkType, ItemId itemIdTo, List itemLinks, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if ((int)itemLinkType < 1) return SetErrorState("invalid link type"); // Validate item links. foreach (SbmItemLink itemLink in itemLinks) { if (itemLink == null) continue; if (itemLink.ItemLinkType != itemLinkType) return SetErrorState("inconsistent link type found in item list"); if ((short)itemLink.ItemTypeFrom != itemIdTo.Type) return SetErrorState("inconsistent 'from' item type found in item list"); if (itemLink.ItemIdFrom != itemIdTo.Id) return SetErrorState("inconsistent 'from' item id found in item list"); if (itemLink.Seq < 1) return SetErrorState("invalid sequence (" + itemLink.Seq.ToString() + ") found in item list"); } // Make copy for a links list so can keep track of those that have been updated - NB Do not delete any of the links in this list as they are owned by the external list. List itemLinksLocal = new List(itemLinks); SbmItemLink.Params prm = new SbmItemLink.Params(); prm.ItemLinkType = itemLinkType; prm.ItemTypeFrom = (Sbm.ItemType)itemIdTo.Type; prm.ItemIdFrom = itemIdTo.Id; foreach (SbmItemLink itemLink in DataItemMgr.GetItemLinkList(prm)) { // Does this link still exist in the list. if (itemLinksLocal.FindByLink(itemLinkType, prm.ItemTypeFrom, prm.ItemIdFrom, (Sbm.ItemType)itemIdTo.Type, itemIdTo.Id)) { if (UpdateItemLink(itemLink, dbUpdateInfo)) { // Want to SetChangesMade(false) but would have to do it in the main list rather than the copy. } else SetErrorState("failed to update link"); // Remove the lisk from the local list (without deleting it). itemLinksLocal.RemoveByLink(itemLinkType, prm.ItemTypeFrom, prm.ItemIdFrom, (Sbm.ItemType)itemIdTo.Type, itemIdTo.Id); } else { // Link no longer required. if (!DeleteItemLink(itemLink, dbUpdateInfo)) SetErrorState("failed to delete link"); } } foreach (SbmItemLink itemLink in itemLinksLocal) { if (InsertItemLink(itemLink, dbUpdateInfo)) { // Want to SetChangesMade(false) but would have to do it in the main list rather than the copy. } else SetErrorState("failed to add link"); } return OK; } //------------------------------------------------------------------- // Delete ItemLink. public override bool ItemLinkCanBeDeleted(SbmItemLink itemLink) { ClearErrorState(); if (!base.ItemLinkCanBeDeleted(itemLink)) return false; return true; } public override bool DeleteItemLink(SbmItemLink itemLink, DbUpdateInfo dbUpdateInfo) { ClearErrorState(); if (!ItemLinkCanBeDeleted(itemLink)) return false; using (var dbConnection = Database.CreateConnection()) using (var dbCommand = dbConnection.CreateCommand()) { try { // Retrieve ItemLink. dbConnection.Open(); ItemLink_Db dbItemLink = new ItemLink_Db(DbInfo); dbItemLink.PopulateFrom(dbCommand, aliasItemLink, "Id=" + itemLink.Id.ToString()); // Delete ItemLink. dbCommand.CommandType = System.Data.CommandType.Text; dbCommand.CommandText = "DELETE FROM " + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink) + " WHERE Id=" + SysId.ToString(itemLink.Id) + ";"; dbCommand.ExecuteNonQuery(); itemLink.Changed = false; if (DebugMode) SaLogger.Debug($"{SysUtil.Fn} Deleted. " + GetLogProperties(itemLink).Concat(": ").Concat("", "\n\t")); } catch (Exception exc) { SetErrorState(exc.Message); } } return OK; } //------------------------------------------------------------------- // Copy data properties to and from database. private void PopulateTo(ItemLink_Db dbItemLink, SbmItemLink itemLink, DbUpdateInfo dbUpdateInfo) { //dbItemLink._Id = itemLink.Id.ToInt(); dbItemLink._Type = (short)itemLink.ItemLinkType; dbItemLink._ItemTypeFrom = (short)itemLink.ItemTypeFrom; dbItemLink._ItemIdFrom = SysId.ToInt(itemLink.ItemIdFrom); dbItemLink._ItemTypeTo = (short)itemLink.ItemTypeTo; dbItemLink._ItemIdTo = SysId.ToInt(itemLink.ItemIdTo); dbItemLink._Seq = itemLink.Seq; dbItemLink._Completed = itemLink.Completed; dbItemLink._DataContent = itemLink.DataContent; // Common properties. dbItemLink._Notes = itemLink.Notes; dbItemLink._Status = SacsSystem.GetStatusCode(itemLink.Status); dbItemLink._Flags = (short)itemLink.Flags; if (!SysId.IsValid(itemLink.Id)) { dbItemLink._CreateOn = DateTime.UtcNow; dbItemLink._CreateBy = dbUpdateInfo.UserId.ToInt(); dbItemLink._CreateHost = dbUpdateInfo.Host; } dbItemLink._UpdateOn = DateTime.UtcNow; dbItemLink._UpdateBy = dbUpdateInfo.UserId.ToInt(); dbItemLink._UpdateHost = dbUpdateInfo.Host; } private void PopulateFrom(ItemLink_Db dbItemLink, SbmItemLink itemLink) { //itemLink.Id = new SysId(dbItemLink._Id); itemLink.ItemLinkType = (Sbm.ItemLinkType)dbItemLink._Type; itemLink.ItemTypeFrom = (Sbm.ItemType)dbItemLink._ItemTypeFrom; itemLink.ItemIdFrom = new SysId(dbItemLink._ItemIdFrom); itemLink.ItemTypeTo = (Sbm.ItemType)dbItemLink._ItemTypeTo; itemLink.ItemIdTo = new SysId(dbItemLink._ItemIdTo); itemLink.Seq = dbItemLink._Seq; itemLink.Completed = dbItemLink._Completed ?? default(DateTime); itemLink.DataContent = dbItemLink._DataContent; // Common properties. itemLink.Notes = dbItemLink._Notes; itemLink.Status = SacsSystem.GetStatusForCode(dbItemLink._Status); itemLink.SetCreateStamp(dbItemLink._CreateOn ?? default(DateTime), new SysId(dbItemLink._CreateBy ?? 0), dbItemLink._CreateHost); itemLink.SetUpdateStamp(dbItemLink._UpdateOn ?? default(DateTime), new SysId(dbItemLink._UpdateBy ?? 0), dbItemLink._UpdateHost); itemLink.AcceptChanges(); } //------------------------------------------------------------------- // Column definitions. private static readonly String aliasItemLink = "aItmLnk"; // Column definition population. private void SetItemLinkColDfn (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.ItemLink) alias = aliasItemLink; 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 ItemLink column definition. public override ColumnDfn GetItemLinkColumnDfn(SbmItemLink.Column columnId, string caption = "", int width = 0) { ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width); switch (columnId) { case SbmItemLink.Column.Pos: SetItemLinkColDfn(columnDfn, "Pos", 45, SbmDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right); columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off; columnDfn.ReadOnly = true; columnDfn.Resizable = false; break; /*case SbmItemLink.Column.Id: SetItemLinkColDfn(columnDfn, "Id", 60, SbmDbDfn.ColumnIdx.ItemLink_Id, ColumnAlignment.Right, DataValue.DataType.Long); columnDfn.ReadOnly = true; break;*/ // ItemLink Properties. case SbmItemLink.Column.Type: case SbmItemLink.Column.Type_Desc: SetItemBatchColDfn(columnDfn, "Type", 70, SbmDbDfn.ColumnIdx.ItemLink_Type, ColumnAlignment.Center, DataValue.DataType.Long); break; case SbmItemLink.Column.ItemTypeFrom: SetItemLinkColDfn(columnDfn, "Item Type From", 90, SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom); break; case SbmItemLink.Column.ItemIdFrom: SetItemLinkColDfn(columnDfn, "Item Id From", 45, SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmItemLink.Column.ItemTypeTo: SetItemLinkColDfn(columnDfn, "Item Type To", 90, SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo); break; case SbmItemLink.Column.ItemIdTo: SetItemLinkColDfn(columnDfn, "Item Id To", 45, SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, ColumnAlignment.Right, DataValue.DataType.Long); break; case SbmItemLink.Column.Seq: SetItemLinkColDfn(columnDfn, "Seq", 35, SbmDbDfn.ColumnIdx.ItemLink_Seq, ColumnAlignment.Right, DataValue.DataType.String); break; case SbmItemLink.Column.Completed: SetItemLinkColDfn(columnDfn, "Completed", 75, SbmDbDfn.ColumnIdx.ItemLink_Completed, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; break; case SbmItemLink.Column.DataContent: SetItemLinkColDfn(columnDfn, "Data Content", 50, SbmDbDfn.ColumnIdx.ItemLink_DataContent); break; // Common properties. case SbmItemLink.Column.Notes: SetItemLinkColDfn(columnDfn, "Notes", 200, SbmDbDfn.ColumnIdx.ItemLink_Notes); break; case SbmItemLink.Column.Flag: SetItemLinkColDfn(columnDfn, "Flags", 40, SbmDbDfn.ColumnIdx.ItemLink_Flags, ColumnAlignment.Center, DataValue.DataType.Long); break; case SbmItemLink.Column.Status: SetItemLinkColDfn(columnDfn, "Status", 80, SbmDbDfn.ColumnIdx.ItemLink_Status, ColumnAlignment.Center); break; case SbmItemLink.Column.Status_Desc: SetItemLinkColDfn(columnDfn, "Status", 80, SbmDbDfn.ColumnIdx.ItemLink_Status); break; case SbmItemLink.Column.Status_Ind: SetItemLinkColDfn(columnDfn, "Status", 80, SbmDbDfn.ColumnIdx.ItemLink_Status, ColumnAlignment.Center, DataValue.DataType.TriState); columnDfn.TriStateFormat = ColumnTriStateFormat.Lights; break; case SbmItemLink.Column.CreateOn_Date: SetItemLinkColDfn(columnDfn, "Created", 80, SbmDbDfn.ColumnIdx.ItemLink_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; columnDfn.ReadOnly = true; break; case SbmItemLink.Column.UpdateOn_Date: SetItemLinkColDfn(columnDfn, "Updated", 80, SbmDbDfn.ColumnIdx.ItemLink_UpdateOn, ColumnAlignment.Center, DataValue.DataType.Date); columnDfn.DateFormat = "d-MMM-yy"; columnDfn.ReadOnly = true; break; } if (!String.IsNullOrEmpty(caption)) columnDfn.Caption = caption; if (width > 0) columnDfn.Width = width; return columnDfn; } //------------------------------------------------------------------- // ItemLink query filter. public override List GetItemLinkQueryFilter(SbmItemLink.Params prm) { List filter = new List(); // ItemLink Id. String includedIds = prm.IdsIncluded.Concat(","); String colItemLink_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Unknown, aliasItemLink); if (!includedIds.IsEmpty()) filter.Add(colItemLink_Id + " IN (" + includedIds + ")"); String excludedIds = prm.IdsExcluded.Concat(","); if (!excludedIds.IsEmpty()) filter.Add(colItemLink_Id + " NOT IN (" + excludedIds + ")"); // Type if (prm.ItemLinkType > 0) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Type, aliasItemLink) + "=" + ((int)prm.ItemLinkType).ToString()); // ItemFrom. if (prm.ItemTypeFrom > 0) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, aliasItemLink) + "=" + ((int)prm.ItemTypeFrom).ToString()); if (SysId.IsValid(prm.ItemIdFrom)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasItemLink) + "=" + prm.ItemIdFrom.ToString()); // ItemTo. if (prm.ItemTypeTo > 0) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, aliasItemLink) + "=" + ((int)prm.ItemTypeTo).ToString()); if (SysId.IsValid(prm.ItemIdTo)) filter.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, aliasItemLink) + "=" + prm.ItemIdTo.ToString()); if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1"); return filter; } // ItemLink sort columns. public List GetItemLinkSortColumns(SbmItemLink.Params prm) { // Sort sequence: List sortColumnCodes = new List(); foreach (var columnDfn in prm.SortColumns) { // Need to ensure correct alias used for ItemLink columns in case of conflict. String sortCol = String.Empty; if (SbmDbDfn.GetTableForColumn((SbmDbDfn.ColumnIdx)columnDfn.DbColumn) == SbmDbDfn.TableIdx.ItemLink) { sortCol = SbmDbDfn.GetColumnNameQual((SbmDbDfn.ColumnIdx)columnDfn.DbColumn, aliasItemLink); } else { sortCol = columnDfn.DataName; if (!StringUtil.IsEmpty(columnDfn.SortDataName)) sortCol = columnDfn.SortDataName; } if (!sortCol.IsEmpty()) { DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls sortColumnCodes.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", ")); } } sortColumnCodes.RemoveBlanks(); if (sortColumnCodes.IsEmpty()) { // Default sort columns: sortColumnCodes.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Type, aliasItemLink) + " ASC"); } return sortColumnCodes; } //------------------------------------------------------------------- // ItemLink count. private long GetItemLinkCount(String filter) { ClearErrorState(); return Database.GetRowCount($"{SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink)} As " + aliasItemLink, filter); } public override long GetItemLinkCount(SbmItemLink.Params prm) { ClearErrorState(); return GetItemLinkCount(GetItemLinkQueryFilter(prm).Concat(" AND ", "(", ")")); } //------------------------------------------------------------------- // ItemLink list. public override List GetItemLinkList(SbmItemLink.Params prm) { ClearErrorState(); List itemLinks = new List(); DbQuery qry = new DbQuery(Database.DbmsType); qry.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), aliasItemLink); ItemLink_Db dbItemLink = new ItemLink_Db(DbInfo); qry.Columns.AddRange(dbItemLink.ExistingColumnNames); qry.Filters.AddRange(GetItemLinkQueryFilter(prm)); qry.OrderBy.AddRange(GetItemLinkSortColumns(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()) { dbItemLink = new ItemLink_Db(DbInfo); dbItemLink.PopulateFrom(dbDataReader); itemLinks.Add(CreateItemLink(dbItemLink)); } } } catch (Exception exc) { SetErrorState(ErrorMessage.DatabaseQueryException); SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}"); } } return itemLinks; } //------------------------------------------------------------------- // ItemLink query execution. public override DbResultSet ExecuteItemLinkQuery(List columns, SbmItemLink.Params prm) { ClearErrorState(); //--------------------------------------------------------------------- // Construct build database query. DbQuery query = new DbQuery(Database.DbmsType); query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), aliasItemLink); // ItemLink Properties - add columns as defined in query list. if (columns.HasId(SbmItemLink.Column.Type)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Type, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.ItemTypeFrom)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.ItemIdFrom)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.ItemTypeTo)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.ItemIdTo)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.Seq)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Seq, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.Completed)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Completed, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.DataContent)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_DataContent, aliasItemLink)); // Common Properties if (columns.HasId(SbmItemLink.Column.Notes)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Notes, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.Flag)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Flags, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.Status) || columns.HasId(SbmItemLink.Column.Status_Desc) || columns.HasId(SbmItemLink.Column.Status_Ind)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Status, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.CreateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_CreateOn, aliasItemLink)); if (columns.HasId(SbmItemLink.Column.UpdateOn_Date)) query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_UpdateOn, aliasItemLink)); //--------------------------------------------------------------------- // Populate filter. query.Filters.AddRange(GetItemLinkQueryFilter(prm)); if (prm.IdsIncluded.Count != 1) { // Configure sort sequence. foreach (String sortColumn in GetItemLinkSortColumns(prm)) query.OrderBy.Add(sortColumn); } //--------------------------------------------------------------------- //return new DbResultSet_DataTableReader(Database, query.BuildQuery()); return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging)); } //------------------------------------------------------------------- } //======================================================================= }