Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemLink.cs
T

636 lines
28 KiB
C#

using Sarand.BusinessMgr.Net.Standard.Base.App;
using Sarand.BusinessMgr.Net.Standard.Base.Bus;
using Sarand.BusinessMgr.Net.Standard.Dbas.Bus;
using Sarand.BusinessMgr.Net.Standard.Dbas.Internal;
using Sarand.BusinessMgr.Net.Standard.Dbas.UpdateLog;
using Sarand.Net.Standard.Base.App;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Dbas;
using Sarand.Net.Standard.Base.Utils;
using Sarand.Net.Standard.Dbas.Data;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
namespace Sarand.BusinessMgr.Net.Standard.Dbas.Mgr
{
//=======================================================================
// 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(Msg_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(Msg_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<SbmItemLink> 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<SbmItemLink> itemLinksLocal = new List<SbmItemLink>(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<SbmItemLink> 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<SbmItemLink> itemLinksLocal = new List<SbmItemLink>(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<string> GetItemLinkQueryFilter(SbmItemLink.Params prm)
{
List<String> filter = new List<String>();
// 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<String> GetItemLinkSortColumns(SbmItemLink.Params prm)
{
// Sort sequence:
List<String> sortColumnCodes = new List<String>();
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<SbmItemLink> GetItemLinkList(SbmItemLink.Params prm)
{
ClearErrorState();
List<SbmItemLink> itemLinks = new List<SbmItemLink>();
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(Msg_DatabaseQueryException);
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
}
}
return itemLinks;
}
//-------------------------------------------------------------------
// ItemLink query execution.
public override DbResultSet ExecuteItemLinkQuery(List<ColumnDfn> 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));
}
//-------------------------------------------------------------------
}
//=======================================================================
}