Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemLink.cs
T
2021-07-08 20:50:46 +01:00

727 lines
32 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
{
//=======================================================================
partial class SbmDataItemMgr_Dbas
{
//*******************************************************************
// I t e m L i n k s
//*******************************************************************
//-------------------------------------------------------------------
// Data members.
//-------------------------------------------------------------------
// Utilities.
private List<StringPair> GetLogProperties(SbmItemLink itemLink)
{
return new List<StringPair>()
{
new StringPair("Id",SysId.ToString(itemLink.Id)),
new StringPair("DataContent",itemLink.DataContent),
new StringPair("Status",itemLink.StatusCode)
};
}
public override bool DoDbCleanup()
{
ClearErrorState();
/*RS_ItemLink* prsLink = (pSys ? pSys.ItemLinkRecordSet() : NULL);
if (!prsLink) return SetException("failed to create ItemLink recordset");
if (!HasException())
{
//---------------------------------------------------------------
// Jan10: Item Links with Seq=0.
// These are prohibiting the primary key that includes this column.
// Should be able to set the value in sequence for the parent ('From') item.
//---------------------------------------------------------------
// Keep track of previous values:
eSapItemLinkType eLinkTypePrev = eSapItemLink_Unknown;
eSapItemType eTypeFromPrev = eSapItemTypeUnknown;
SaSysId itemIdFromPrev;
int iNextSeq = 1;
int iRowsModified = 0, iParentItemsFound = 0;
// Restrict to Seq=0 and sort by parent item:
prsLink->AddToSort(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_Type, false));
prsLink->AddToSort(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, false));
prsLink->AddToSort(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, false));
prsLink->AddToFilter(SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_Seq) + "=0");
prsLink->Open();
while (!HasException() && prsLink->IsOpen() && !prsLink->IsEOF())
{
// Reset the sequence if the parent item has changed:
if (eLinkTypePrev != (eSapItemLinkType)prsLink->iType || eTypeFromPrev != (eSapItemType)prsLink->iItemTypeTo || itemIdFromPrev != prsLink->iItemIdTo)
{
iNextSeq = 1;
eLinkTypePrev = (eSapItemLinkType)prsLink->iType;
eTypeFromPrev = (eSapItemType)prsLink->iItemTypeTo;
itemIdFromPrev = prsLink->iItemIdTo;
iParentItemsFound++;
}
prsLink->Edit();
prsLink->iSeq = iNextSeq++;
if (!prsLink->Update())
SetException("failed to update link (" + prsLink->Exception() + ")");
iRowsModified++;
// Move to the next record in the result set:
prsLink->MoveNext();
}
SATRACE("\nSapDataItemMgr_Odbc::DoDbCleanup\n\tParent items found: " + String(iParentItemsFound) + "\n\tRows modified: " + String(iRowsModified) + "\n\n");
//---------------------------------------------------------------
}*/
return !HasErrorState();
}
public override bool ClearDataItem(Sbm.ItemType itemType, SysId itemId)
{
ClearErrorState();
if ((int)itemType < 1 || !SysId.IsValid(itemId)) return false;
List<String> filters = new List<String>();
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);
filters.Add(colItemTypeFrom + "=" + ((int)itemType).ToString() + " AND " + colItemIdFrom + "=" + itemId.ToString());
filters.Add(colItemTypeTo + "=" + ((int)itemType).ToString() + " AND " + colItemIdTo + "=" + itemId.ToString());
String filter = filters.Concat(" OR ", "(", ")");
//return db.ExecuteDelete("DELETE FROM" + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink) + " WHERE " + filter);
db.ExecuteDelete(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), filter);
return false;
}
//-------------------------------------------------------------------
// Get ItemLink.
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("Multiple Item Links found");
return null;
}
SbmItemLink itemLink = null;
// Query data.
using (var dbConnection = db.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("Database query exception");
SaLogger.Warn(GetType().Name + ".GetItemLink\n\tQuery: " + dbCommand.CommandText + "\n\tException: " + exc.Message);
}
}
return itemLink;
}
//-------------------------------------------------------------------
// Create ItemLink.
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(Internals, new SysId(), 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(Internals, new SysId(0), (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 ItemLink.
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 db.GetRowCount(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), /*SbmDbDfn.GetColumnName(SbmDbDfn.ColumnIdx.ItemLink_Type),*/ filter) > 0;
}
//-------------------------------------------------------------------
// Validate ItemLink.
public override bool IsValidItemLinkData(SbmItemLink.Data data, SbmItemLink.ErrField errField)
{
ClearErrorState();
if (!base.IsValidItemLinkData(data, errField)) return false;
return true;
}
//-------------------------------------------------------------------
// Insert ItemLink.
public override bool InsertItemLink(SbmItemLink itemLink, DbUpdateInfo dbUpdateInfo)
{
String fn = GetType().Name + ".InsertItemLink";
ClearErrorState();
if (!IsValidItemLink(itemLink)) return false;
if (SysId.IsValid(itemLink.Id)) return SetErrorState(ErrorMessage.ValiditemId);
using (var dbConnection = db.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
dbConnection.Open();
ItemLink_Db dbItemLink = new ItemLink_Db(DbInfo);
PopulateTo(dbItemLink, itemLink, dbUpdateInfo);
if (ItemLink_Db.FieldsNonId.Contains("Id"))
{
// Generate next Id.
//dbItemLink._Id = SysId.ToInt(db.GetNextId("ItemLink", dbUpdateInfo));
}
dbItemLink.ExecuteInsertCommand(dbCommand);
itemLink.Id = new SysId(0);
itemLink.Changed = false;
if (DebugMode) SaLogger.Debug(fn + " Inserted. " + GetLogProperties(itemLink).Concat(": ").Concat("", "\n\t"));
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// Update ItemLink.
public override bool UpdateItemLink(SbmItemLink itemLink, DbUpdateInfo dbUpdateInfo)
{
String fn = GetType().Name + ".UpdateItemLink";
ClearErrorState();
if (!IsValidItemLink(itemLink)) return false;
if (!SysId.IsValid(itemLink.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
if (!itemLink.Changed)
{
if (DebugMode) SaLogger.Debug(fn + " Data not changed. " + GetLogProperties(itemLink).Concat(": ").Concat("", "\n\t"));
return true;
}
using (var dbConnection = db.CreateConnection())
using (var dbCommand = dbConnection.CreateCommand())
{
try
{
// Retrieve ItemLink.
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(fn + " Updated. " + GetLogProperties(itemLink).Concat(": ").Concat("", "\n\t"));
// Record updates.
updateLogMonitor.RecordUpdatedValues(itemLink);
updateLogMonitor.LogUpdates();
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// 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, Sbm.ItemType itemTypeFrom, SysId 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 (itemLink.ItemTypeFrom != itemTypeFrom) return SetErrorState("inconsistent 'from' item type found in item list");
if (itemLink.ItemIdFrom != itemIdFrom) 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 = itemTypeFrom;
prm.ItemIdFrom = itemIdFrom;
foreach (SbmItemLink itemLink in DataItemMgr.GetItemLinkList(prm))
{
// Does this link still exist in the list.
if (itemLinksLocal.FindByLink(itemLinkType, itemTypeFrom, itemIdFrom, 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, itemTypeFrom, itemIdFrom, 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 !HasErrorState();
}
public override bool StoreToItemLinks(Sbm.ItemLinkType itemLinkType, Sbm.ItemType itemTypeTo, SysId 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 (itemLink.ItemTypeFrom != itemTypeTo) return SetErrorState("inconsistent 'from' item type found in item list");
if (itemLink.ItemIdFrom != itemIdTo) 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 = itemTypeTo;
prm.ItemIdFrom = itemIdTo;
foreach (SbmItemLink itemLink in DataItemMgr.GetItemLinkList(prm))
{
// Does this link still exist in the list.
if (itemLinksLocal.FindByLink(itemLinkType, prm.ItemTypeFrom, prm.ItemIdFrom, itemTypeTo, 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, prm.ItemTypeFrom, prm.ItemIdFrom, itemTypeTo, 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 !HasErrorState();
}
//-------------------------------------------------------------------
// 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)
{
String fn = GetType().Name + ".DeleteItemLink";
ClearErrorState();
if (!ItemLinkCanBeDeleted(itemLink)) return false;
using (var dbConnection = db.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(fn + " Deleted. " + GetLogProperties(itemLink).Concat(": ").Concat("", "\n\t"));
}
catch (Exception exc) { SetErrorState(exc.Message); }
}
return !HasErrorState();
}
//-------------------------------------------------------------------
// 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;
itemLink.DataContent = dbItemLink._DataContent;
// Common properties.
itemLink.Notes = dbItemLink._Notes;
itemLink.Status = SacsSystem.GetStatusForCode(dbItemLink._Status);
itemLink.SetCreateStamp(dbItemLink._CreateOn, new SysId(dbItemLink._CreateBy), dbItemLink._CreateHost);
itemLink.SetUpdateStamp(dbItemLink._UpdateOn, new SysId(dbItemLink._UpdateBy), dbItemLink._UpdateHost);
itemLink.AcceptChanges();
}
//-------------------------------------------------------------------
// ItemLink alias & prefix.
private static readonly String aliasItemLink = "aItmLnk";
private static readonly String prefixItemLink = "ItmLnk_";
//-------------------------------------------------------------------
// Setting ItemLink column definitions.
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)SbmDbDfn.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, aliasItemLink, prefixItemLink);
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.IncludedIds.Concat(",");
String colItemLink_Id = SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.Unknown, aliasItemLink);
if (!includedIds.IsEmpty())
filter.Add(colItemLink_Id + " IN (" + includedIds + ")");
String excludedIds = prm.ExcludedIds.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 db.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)
{
List<SbmItemLink> ItemLinkes = new List<SbmItemLink>();
DbQuery qry = new DbQuery(db.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 = db.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);
ItemLinkes.Add(CreateItemLink(dbItemLink));
}
}
}
catch (Exception exc)
{
SaLogger.Warn(GetType().Name + ".GetItemLinkList\n\tQuery: " + dbCommand.CommandText + "\n\tException: " + exc.Message);
}
}
return ItemLinkes;
}
//-------------------------------------------------------------------
// ItemLink query execution.
public override DbResultSet ExecuteItemLinkQuery(List<ColumnDfn> columns, SbmItemLink.Params prm)
{
ClearErrorState();
//---------------------------------------------------------------------
// Construct build database query.
DbQuery query = new DbQuery(db.DbmsType);
query.Tables.Add(SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink), aliasItemLink);
// ItemLink Properties - add columns as defined in query list.
if (columns.HasId((int)SbmItemLink.Column.Type))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Type, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.ItemTypeFrom))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeFrom, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.ItemIdFrom))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdFrom, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.ItemTypeTo))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemTypeTo, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.ItemIdTo))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_ItemIdTo, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.Seq))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Seq, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.Completed))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Completed, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.DataContent))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_DataContent, aliasItemLink));
// Common Properties
if (columns.HasId((int)SbmItemLink.Column.Notes))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Notes, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.Flag))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Flags, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.Status) || columns.HasId((int)SbmItemLink.Column.Status_Desc) || columns.HasId((int)SbmItemLink.Column.Status_Ind))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_Status, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.CreateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_CreateOn, aliasItemLink));
if (columns.HasId((int)SbmItemLink.Column.UpdateOn_Date))
query.Columns.Add(SbmDbDfn.GetColumnNameQual(SbmDbDfn.ColumnIdx.ItemLink_UpdateOn, aliasItemLink));
//---------------------------------------------------------------------
// Populate filter.
query.Filters.AddRange(GetItemLinkQueryFilter(prm));
if (prm.IncludedIds.Count != 1)
{
// Configure sort sequence.
foreach (String sortColumn in GetItemLinkSortColumns(prm))
query.OrderBy.Add(sortColumn);
}
//---------------------------------------------------------------------
//return new DbResultSet_DataTableReader(db, query.BuildQuery());
return DbResultSet_DataReader.ExecuteQuery(db, query.BuildQuery(prm.ResultsPaging));
}
//-------------------------------------------------------------------
}
//=======================================================================
}