580 lines
25 KiB
C#
580 lines
25 KiB
C#
using Sarand.Net.Standard.Base.App;
|
|
using Sarand.Net.Standard.Base.Core;
|
|
using Sarand.Net.Standard.Base.Bus;
|
|
using Sarand.Net.Standard.Base.Dbas;
|
|
using Sarand.Net.Standard.Base.ItemData;
|
|
using Sarand.Net.Standard.Dbas.Base;
|
|
using Sarand.Net.Standard.Dbas.Data;
|
|
using Sarand.Net.Standard.Dbas.ItemData.Internal;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data.Common;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using Sarand.Net.Standard.Base.Utils;
|
|
|
|
namespace Sarand.Net.Standard.Dbas.ItemData
|
|
{
|
|
//=======================================================================
|
|
internal class SaItemDataMgr_Dbas : SaItemDataMgr
|
|
{
|
|
//-------------------------------------------------------------------
|
|
// Data members.
|
|
private SaItemDataConsole_Dbas itemDataConsole = null;
|
|
|
|
//-------------------------------------------------------------------
|
|
// Static initialisation.
|
|
static SaItemDataMgr_Dbas()
|
|
{
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Construction.
|
|
internal SaItemDataMgr_Dbas(SaItemDataConsole_Dbas itemDataConsole)
|
|
{
|
|
this.itemDataConsole = itemDataConsole;
|
|
DbInfo = new DbDataItem.DatabaseInfo(itemDataConsole.Database);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Properties.
|
|
public String TableName_ItemData { get { return SaItemDataDbDfn.GetTableName(SaItemDataDbDfn.TableIdx.SaItemData); } }
|
|
internal ISacsDatabase Database { get { return itemDataConsole.Database; } }
|
|
private DbDataItem.DatabaseInfo DbInfo { get; }
|
|
public override bool DatabaseIsValid { get { return (Database != null && Database.GetTableNames().Contains(TableName_ItemData)); } }
|
|
public override bool CanUpdateDatabase { get { return DatabaseIsValid; } }
|
|
|
|
//*******************************************************************
|
|
// I t e m D a t a
|
|
//*******************************************************************
|
|
// Utilities.
|
|
public override bool ItemHasData(ItemId itemId, bool ignoreDeleted = true)
|
|
{
|
|
ClearErrorState();
|
|
if (!ItemId.IsValid(itemId)) return false;
|
|
SaItemData.Params prmItemData = new SaItemData.Params();
|
|
prmItemData.ItemIdsIncluded.Add(itemId);
|
|
prmItemData.StatusCat = (ignoreDeleted ? SaItemData.StatusCat.NotDeleted : SaItemData.StatusCat.Any);
|
|
return (GetItemDataCount(prmItemData) > 0);
|
|
}
|
|
public override bool ItemHasData(ItemId itemId, String dataType, bool ignoreDeleted = true)
|
|
{
|
|
ClearErrorState();
|
|
if (!ItemId.IsValid(itemId)) return false;
|
|
if (StringUtil.IsEmpty(dataType)) return false;
|
|
SaItemData.Params prmItemData = new SaItemData.Params();
|
|
prmItemData.ItemIdsIncluded.Add(itemId);
|
|
prmItemData.DataTypesIncluded.Add(dataType);
|
|
prmItemData.StatusCat = (ignoreDeleted ? SaItemData.StatusCat.NotDeleted : SaItemData.StatusCat.Any);
|
|
return (GetItemDataCount(prmItemData) > 0);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Create Item.
|
|
public override SaItemData CreateItemData(ItemId itemId)
|
|
{
|
|
ClearErrorState();
|
|
return new SaItemData_Dbas(null, itemId, 0);
|
|
}
|
|
private SaItemData CreateItemData(SaItemData_Db dbItemData)
|
|
{
|
|
ClearErrorState();
|
|
SaItemData itemData = new SaItemData_Dbas(null, new ItemId(dbItemData._ItemType, new SysId(dbItemData._ItemId)), (ushort)dbItemData._Flags);
|
|
PopulateFrom(dbItemData, itemData);
|
|
return itemData;
|
|
}
|
|
private SaItemData CreateItemData(DbDataReader dataReader)
|
|
{
|
|
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
|
|
dbItemData.PopulateFrom(dataReader);
|
|
return CreateItemData(dbItemData);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Item exists.
|
|
public override bool ItemDataExists(SysId id)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(id)) return false;
|
|
SaItemData.Params prmItemData = new SaItemData.Params();
|
|
prmItemData.IdsIncluded.Add(id);
|
|
prmItemData.StatusCat = SaItemData.StatusCat.Any;
|
|
return (GetItemDataCount(prmItemData) > 0);
|
|
}
|
|
public override bool ItemDataExists(ItemId itemId, String dataType, bool ignoreDeleted = true)
|
|
{
|
|
ClearErrorState();
|
|
if (!ItemId.IsValid(itemId)) return false;
|
|
if (StringUtil.IsEmpty(dataType)) return false;
|
|
SaItemData.Params prmItemData = new SaItemData.Params();
|
|
prmItemData.ItemIdsIncluded.Add(itemId);
|
|
prmItemData.DataTypesIncluded.Add(dataType);
|
|
prmItemData.StatusCat = (ignoreDeleted ? SaItemData.StatusCat.NotDeleted : SaItemData.StatusCat.Any);
|
|
return (GetItemDataCount(prmItemData) > 0);
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Get Item Data.
|
|
public override SaItemData GetItemData(SysId id)
|
|
{
|
|
ClearErrorState();
|
|
if (!SysId.IsValid(id)) return null;
|
|
SaItemData.Params prmItemData = new SaItemData.Params();
|
|
prmItemData.IdsIncluded.Add(id);
|
|
prmItemData.StatusCat = SaItemData.StatusCat.Any;
|
|
return GetItemData(prmItemData);
|
|
}
|
|
public override SaItemData GetItemData(ItemId itemId, String dataType)
|
|
{
|
|
ClearErrorState();
|
|
if (!ItemId.IsValid(itemId)) return null;
|
|
if (StringUtil.IsEmpty(dataType)) return null;
|
|
SaItemData.Params prmItemData = new SaItemData.Params();
|
|
prmItemData.ItemIdsIncluded.Add(itemId);
|
|
prmItemData.DataTypesIncluded.Add(dataType);
|
|
prmItemData.StatusCat = SaItemData.StatusCat.Any;
|
|
return GetItemData(prmItemData);
|
|
}
|
|
public override SaItemData GetItemData(SaItemData.Params prmItemData)
|
|
{
|
|
return GetItemData(GetItemDataQueryFilter(prmItemData).Concat(" And ", "(", ")"));
|
|
}
|
|
private SaItemData GetItemData(String filter)
|
|
{
|
|
ClearErrorState();
|
|
if (GetItemDataCount(filter) != 1) return null;
|
|
SaItemData itemData = null;
|
|
// Query data.
|
|
using (var dbConnection = Database.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
dbConnection.Open();
|
|
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
|
|
dbItemData.PopulateFrom(dbCommand, aliasItemData, filter);
|
|
itemData = CreateItemData(dbItemData);
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
SetErrorState(Msg_DatabaseQueryException);
|
|
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
|
}
|
|
}
|
|
return itemData;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Validate ItemData.
|
|
public override bool IsValidItemDataData(SaItemData.Data itemDataData, SaItemData.ErrField errField)
|
|
{
|
|
ClearErrorState();
|
|
if (!base.IsValidItemDataData(itemDataData, errField)) return false;
|
|
return true;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Insert ItemData.
|
|
public override bool InsertItemData(SaItemData itemData, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
ClearErrorState();
|
|
if (!IsValidItemData(itemData)) return false;
|
|
if (SysId.IsValid(itemData.Id)) return SetErrorState(ErrorMessage.ValiditemId);
|
|
using (var dbConnection = Database.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
dbConnection.Open();
|
|
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
|
|
PopulateTo(dbItemData, itemData, dbUpdateInfo);
|
|
if (SaItemData_Db.FieldsNonId.Contains("Id"))
|
|
{
|
|
// Generate next Id.
|
|
dbItemData._Id = SysId.ToInt(Database.GetNextId("SaItemData", dbUpdateInfo));
|
|
}
|
|
dbItemData.ExecuteInsertCommand(dbCommand);
|
|
itemData.Id = new SysId(dbItemData._Id);
|
|
}
|
|
catch (Exception exc) { SetErrorState(exc.Message); }
|
|
}
|
|
return OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Update item.
|
|
public override bool UpdateItemData(SaItemData itemData, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
ClearErrorState();
|
|
if (!IsValidItemData(itemData)) return false;
|
|
if (!SysId.IsValid(itemData.Id)) return SetErrorState(ErrorMessage.InvalidItemId);
|
|
using (var dbConnection = Database.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
// Retrieve item.
|
|
dbConnection.Open();
|
|
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
|
|
dbItemData.PopulateFrom(dbCommand, aliasItemData, aliasItemData + ".Id=" + SysId.ToString(itemData.Id));
|
|
// Update item.
|
|
PopulateTo(dbItemData, itemData, dbUpdateInfo);
|
|
dbItemData.ExecuteUpdateCommand(dbCommand);
|
|
}
|
|
catch (Exception exc) { SetErrorState(exc.Message); }
|
|
}
|
|
return OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Delete item.
|
|
public override bool ItemDataCanBeDeleted(SaItemData itemData)
|
|
{
|
|
ClearErrorState();
|
|
if (!base.ItemDataCanBeDeleted(itemData)) return false;
|
|
return true;
|
|
}
|
|
public override bool DeleteItemData(SaItemData itemData, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
ClearErrorState();
|
|
if (!ItemDataCanBeDeleted(itemData)) return false;
|
|
using (var dbConnection = Database.CreateConnection())
|
|
using (var dbCommand = dbConnection.CreateCommand())
|
|
{
|
|
try
|
|
{
|
|
// Retrieve item.
|
|
dbConnection.Open();
|
|
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
|
|
dbItemData.PopulateFrom(dbCommand, aliasItemData, aliasItemData + ".Id=" + SysId.ToString(itemData.Id));
|
|
// Delete item.
|
|
dbCommand.CommandType = System.Data.CommandType.Text;
|
|
dbCommand.CommandText = "DELETE FROM " + SaItemDataDbDfn.GetTableName(SaItemDataDbDfn.TableIdx.SaItemData) + " WHERE Id=" + SysId.ToString(itemData.Id) + ";";
|
|
dbCommand.ExecuteNonQuery();
|
|
}
|
|
catch (Exception exc) { SetErrorState(exc.Message); }
|
|
}
|
|
return OK;
|
|
}
|
|
public override bool ClearItemData(ItemId itemId, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
ClearErrorState();
|
|
if (!ItemId.IsValid(itemId)) return SetErrorState(Msg_ItemIdNotSpecified);
|
|
String colItemType = SaItemDataDbDfn.GetColumnName(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType);
|
|
String colItemId = SaItemDataDbDfn.GetColumnName(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId);
|
|
String query = "Delete From " + TableName_ItemData + " WHERE " + colItemType + "=" + itemId.Type.ToString() + " AND " + colItemId + "=" + SysId.ToString(itemId.Id);
|
|
Database.ExecuteNonQuery(query);
|
|
if (Database.HasErrorState())
|
|
SetErrorState("Failed to clear Item Data - " + Database.ErrorStateMessage);
|
|
return OK;
|
|
}
|
|
public override bool ClearItemData(ItemId itemId, String dataType, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
ClearErrorState();
|
|
if (!ItemId.IsValid(itemId)) return SetErrorState(Msg_ItemIdNotSpecified);
|
|
if (StringUtil.IsEmpty(dataType)) return SetErrorState("Data type must be specified");
|
|
String colItemType = SaItemDataDbDfn.GetColumnName(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType);
|
|
String colItemId = SaItemDataDbDfn.GetColumnName(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId);
|
|
String colDataType = SaItemDataDbDfn.GetColumnName(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType);
|
|
String query = "Delete From " + TableName_ItemData + " WHERE " + colItemType + "=" + itemId.Type.ToString() + " AND " + colItemId + "=" + SysId.ToString(itemId.Id) + " AND " + colDataType + "='" + dataType + "';";
|
|
Database.ExecuteNonQuery(query);
|
|
if (Database.HasErrorState())
|
|
SetErrorState("Failed to clear Item Data - " + Database.ErrorStateMessage);
|
|
return OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Copy data properties to and from database.
|
|
private void PopulateTo(SaItemData_Db dbItemData, SaItemData itemData, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
dbItemData._ItemType = itemData.ItemId.Type;
|
|
dbItemData._ItemId = SysId.ToInt(itemData.ItemId.Id);
|
|
dbItemData._DataType = itemData.DataType;
|
|
dbItemData._ItemData = itemData.ItemData;
|
|
// Common properties.
|
|
dbItemData._Notes = itemData.Notes;
|
|
dbItemData._Status = SacsSystem.GetStatusCode(itemData.Status);
|
|
dbItemData._Flags = (short)itemData.Flags;
|
|
if (!SysId.IsValid(itemData.Id))
|
|
{
|
|
dbItemData._CreateOn = DateTime.Now;
|
|
dbItemData._CreateBy = dbUpdateInfo.UserId.ToInt();
|
|
dbItemData._CreateHost = dbUpdateInfo.Host;
|
|
}
|
|
dbItemData._UpdateOn = DateTime.Now;
|
|
dbItemData._UpdateBy = dbUpdateInfo.UserId.ToInt();
|
|
dbItemData._UpdateHost = dbUpdateInfo.Host;
|
|
}
|
|
private void PopulateFrom(SaItemData_Db dbItemData, SaItemData itemData)
|
|
{
|
|
//itemData.ItemId = new ItemId(dbItemData._ItemType, new SysId(dbItemData._ItemId));
|
|
itemData.DataType = dbItemData._DataType;
|
|
itemData.ItemData = dbItemData._ItemData;
|
|
// Common properties.
|
|
itemData.Notes = dbItemData._Notes;
|
|
itemData.Status = SacsSystem.GetStatusForCode(dbItemData._Status);
|
|
itemData.SetCreateStamp(dbItemData._CreateOn, new SysId(dbItemData._CreateBy), dbItemData._CreateHost);
|
|
itemData.SetUpdateStamp(dbItemData._UpdateOn, new SysId(dbItemData._UpdateBy), dbItemData._UpdateHost);
|
|
itemData.AcceptChanges();
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// ItemData column definitions.
|
|
private static readonly String aliasItemData = "aItmDat";
|
|
private void SetItemDataColDfn
|
|
(ColumnDfn col, String caption, int width, SaItemDataDbDfn.ColumnIdx dbCol,
|
|
ColumnAlignment align = ColumnAlignment.Default, DataValue.DataType dataType = DataValue.DataType.String,
|
|
String alias = "", String prefix = "")
|
|
{
|
|
if (String.IsNullOrEmpty(alias) && SaItemDataDbDfn.GetTableForColumn(dbCol) == SaItemDataDbDfn.TableIdx.SaItemData)
|
|
alias = aliasItemData;
|
|
col.Set(caption, width, (int)dbCol, prefix + SaItemDataDbDfn.GetColumnName(dbCol, false), SaItemDataDbDfn.GetColumnNameQual(dbCol, alias), dataType, align);
|
|
}
|
|
public override ColumnDfn GetItemDataColumnDfn(SaItemData.Column columnId, string caption = "", int width = 0)
|
|
{
|
|
ColumnDfn columnDfn = new ColumnDfn((int)columnId, caption, width);
|
|
switch (columnId)
|
|
{
|
|
case SaItemData.Column.Pos:
|
|
SetItemDataColDfn(columnDfn, "Pos", 45, SaItemDataDbDfn.ColumnIdx.Unknown, ColumnAlignment.Right);
|
|
columnDfn.SortMode = ColumnDfn.ColumnSortMode.Off;
|
|
columnDfn.ReadOnly = true;
|
|
columnDfn.Resizable = false;
|
|
break;
|
|
case SaItemData.Column.Id:
|
|
SetItemDataColDfn(columnDfn, "Id", 60, SaItemDataDbDfn.ColumnIdx.SaItemData_Id, ColumnAlignment.Right, DataValue.DataType.Long);
|
|
columnDfn.ReadOnly = true;
|
|
break;
|
|
case SaItemData.Column.ItemType:
|
|
SetItemDataColDfn(columnDfn, "Item type", 80, SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType, ColumnAlignment.Center, DataValue.DataType.Long);
|
|
columnDfn.ReadOnly = true;
|
|
break;
|
|
case SaItemData.Column.ItemType_Desc:
|
|
SetItemDataColDfn(columnDfn, "Item type", 100, SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType);
|
|
columnDfn.ReadOnly = true;
|
|
break;
|
|
case SaItemData.Column.DataType:
|
|
SetItemDataColDfn(columnDfn, "Data type", 100, SaItemDataDbDfn.ColumnIdx.SaItemData_DataType);
|
|
columnDfn.MaxLength = (int)SaItemDataDbDfn.GetColTextLen(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType);
|
|
break;
|
|
case SaItemData.Column.ItemData:
|
|
SetItemDataColDfn(columnDfn, "Data", 240, SaItemDataDbDfn.ColumnIdx.SaItemData_ItemData);
|
|
columnDfn.MaxLength = (int)SaItemDataDbDfn.GetColTextLen(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemData);
|
|
break;
|
|
// Common properties.
|
|
case SaItemData.Column.Notes:
|
|
SetItemDataColDfn(columnDfn, "Notes", 240, SaItemDataDbDfn.ColumnIdx.SaItemData_Notes);
|
|
columnDfn.MaxLength = (int)SaItemDataDbDfn.GetColTextLen(SaItemDataDbDfn.ColumnIdx.SaItemData_Notes);
|
|
break;
|
|
case SaItemData.Column.Status:
|
|
SetItemDataColDfn(columnDfn, "Status", 80, SaItemDataDbDfn.ColumnIdx.SaItemData_Status, ColumnAlignment.Center);
|
|
break;
|
|
case SaItemData.Column.Status_Desc:
|
|
SetItemDataColDfn(columnDfn, "Status", 90, SaItemDataDbDfn.ColumnIdx.SaItemData_Status, ColumnAlignment.Center);
|
|
break;
|
|
case SaItemData.Column.Status_Ind:
|
|
SetItemDataColDfn(columnDfn, "Status", 80, SaItemDataDbDfn.ColumnIdx.SaItemData_Status, ColumnAlignment.Center, DataValue.DataType.TriState);
|
|
columnDfn.TriStateFormat = ColumnTriStateFormat.Lights;
|
|
break;
|
|
case SaItemData.Column.CreateOn_Date:
|
|
SetItemDataColDfn(columnDfn, "Created", 80, SaItemDataDbDfn.ColumnIdx.SaItemData_CreateOn, ColumnAlignment.Center, DataValue.DataType.Date);
|
|
columnDfn.ReadOnly = true;
|
|
break;
|
|
case SaItemData.Column.UpdateOn_Date:
|
|
SetItemDataColDfn(columnDfn, "Updated", 80, SaItemDataDbDfn.ColumnIdx.SaItemData_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;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// ItemData query filter.
|
|
public override List<string> GetItemDataQueryFilter(SaItemData.Params prm)
|
|
{
|
|
List<String> filter = new List<String>();
|
|
|
|
// Item Data Id.
|
|
String colId = SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Id, aliasItemData);
|
|
String includedIds = prm.IdsIncluded.Concat(",");
|
|
if (!includedIds.IsEmpty())
|
|
filter.Add(colId + " IN (" + includedIds + ")");
|
|
String excludedIds = prm.IdsExcluded.Concat(",");
|
|
if (!excludedIds.IsEmpty())
|
|
filter.Add(colId + " NOT IN (" + excludedIds + ")");
|
|
|
|
// Item Ids.
|
|
List<String> filterItemId = new List<String>();
|
|
String colItemType = SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType, aliasItemData);
|
|
String colItemId = SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId, aliasItemData);
|
|
foreach (ItemId itemId in prm.ItemIdsIncluded)
|
|
{
|
|
filterItemId.Add(colItemType + "=" + itemId.Type.ToString() + " And " + colItemId + "=" + SysId.ToString(itemId.Id));
|
|
}
|
|
if (filterItemId.Count > 0)
|
|
filter.Add(filterItemId.Concat(" Or ", "(", ")"));
|
|
|
|
// Included Data Types.
|
|
List<String> dataTypeFilter = new List<string>();
|
|
String colDataType = SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType, aliasItemData);
|
|
foreach (String dataType in prm.DataTypesIncluded)
|
|
{
|
|
dataTypeFilter.Add(colDataType + "='" + DbQuery.FormatForCondition(dataType) + "'");
|
|
}
|
|
if (dataTypeFilter.Count > 0)
|
|
filter.Add(dataTypeFilter.Concat(" Or ", "(", ")"));
|
|
|
|
// Status.
|
|
String colStatus = SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Status, aliasItemData);
|
|
String statusCurrent = SacsSystem.GetStatusCode(SaStatus.Current);
|
|
String statusDeleted = SacsSystem.GetStatusCode(SaStatus.Deleted);
|
|
if (prm.StatusCat == SaItemData.StatusCat.CurrentOnly)
|
|
filter.Add(colStatus + " In ('" + statusCurrent + "')");
|
|
else if (prm.StatusCat == SaItemData.StatusCat.NotDeleted)
|
|
filter.Add(colStatus + " Not In ('" + statusDeleted + "')");
|
|
else if (prm.StatusCat == SaItemData.StatusCat.DeletedOnly)
|
|
filter.Add(colStatus + " In ('" + statusDeleted + "')");
|
|
|
|
if (filter.Count < 1 && prm.IncludeDefaultFilter) filter.Add("1=1");
|
|
return filter;
|
|
}
|
|
// ItemData sort columns.
|
|
public List<String> GetItemDataSortColumns(SaItemData.Params prm)
|
|
{
|
|
// Sort sequence:
|
|
List<String> sortColumnNames = new List<String>();
|
|
foreach (var columnDfn in prm.SortColumns)
|
|
{
|
|
// Need to ensure correct alias used for ItemData columns in case of conflict.
|
|
String sortCol = String.Empty;
|
|
if (SaItemDataDbDfn.GetTableForColumn((SaItemDataDbDfn.ColumnIdx)columnDfn.DbColumn) == SaItemDataDbDfn.TableIdx.SaItemData)
|
|
{
|
|
sortCol = SaItemDataDbDfn.GetColumnNameQual((SaItemDataDbDfn.ColumnIdx)columnDfn.DbColumn, aliasItemData);
|
|
}
|
|
else
|
|
{
|
|
sortCol = columnDfn.DataName;
|
|
if (!StringUtil.IsEmpty(columnDfn.SortDataName))
|
|
{
|
|
sortCol = columnDfn.SortDataName;
|
|
}
|
|
}
|
|
if (!sortCol.IsEmpty())
|
|
{
|
|
DbOrderByNullMode orderByNullMode = DbOrderByNullMode.Default; // eSaOrderByDemoteNulls, eSaOrderByPromoteNulls
|
|
sortColumnNames.Add(DbQuery.FormatForOrderBy(sortCol, columnDfn.SortAscending, orderByNullMode).Concat(", "));
|
|
}
|
|
}
|
|
sortColumnNames.RemoveBlanks();
|
|
if (sortColumnNames.IsEmpty())
|
|
{
|
|
// Default sort columns:
|
|
sortColumnNames.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType, aliasItemData) + " DESC");
|
|
sortColumnNames.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId, aliasItemData) + " DESC");
|
|
sortColumnNames.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType, aliasItemData) + " DESC");
|
|
}
|
|
return sortColumnNames;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// ItemData count.
|
|
private long GetItemDataCount(String filter)
|
|
{
|
|
ClearErrorState();
|
|
return Database.GetRowCount(SaItemDataDbDfn.GetTableName(SaItemDataDbDfn.TableIdx.SaItemData) + " As " + aliasItemData, filter);
|
|
}
|
|
public override long GetItemDataCount(SaItemData.Params prm)
|
|
{
|
|
ClearErrorState();
|
|
return GetItemDataCount(GetItemDataQueryFilter(prm).Concat(" AND ", "(", ")"));
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Item Data list.
|
|
public override List<SaItemData> GetItemDataList(SaItemData.Params prm)
|
|
{
|
|
ClearErrorState();
|
|
List<SaItemData> itemDatas = new List<SaItemData>();
|
|
DbQuery qry = new DbQuery(Database.DbmsType);
|
|
qry.Tables.Add(TableName_ItemData, aliasItemData);
|
|
SaItemData_Db dbItemData = new SaItemData_Db(DbInfo);
|
|
qry.Columns.AddRange(dbItemData.ExistingColumnNames);
|
|
qry.Filters.AddRange(GetItemDataQueryFilter(prm));
|
|
qry.OrderBy.AddRange(GetItemDataSortColumns(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())
|
|
itemDatas.Add(CreateItemData(dbDataReader));
|
|
}
|
|
}
|
|
catch (Exception exc)
|
|
{
|
|
SetErrorState(Msg_DatabaseQueryException);
|
|
SaLogger.Warn($"{SysUtil.Fn}\n\tQuery: {dbCommand.CommandText}\n\t{ExceptionUtil.GetErrorStateMessage(exc)}");
|
|
}
|
|
}
|
|
return itemDatas;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// Item Data query.
|
|
public override DbResultSet ExecuteItemDataQuery(List<ColumnDfn> columns, SaItemData.Params prm)
|
|
{
|
|
ClearErrorState();
|
|
|
|
//---------------------------------------------------------------------
|
|
// Construct query.
|
|
DbQuery query = new DbQuery(Database.DbmsType);
|
|
query.Tables.Add(SaItemDataDbDfn.GetTableName(SaItemDataDbDfn.TableIdx.SaItemData), aliasItemData);
|
|
|
|
// Add columns as defined in query list.
|
|
if (columns.HasId(SaItemData.Column.Id))
|
|
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Id, aliasItemData));
|
|
if (columns.HasId(SaItemData.Column.ItemType) || columns.HasId(SaItemData.Column.ItemType_Desc))
|
|
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemType, aliasItemData));
|
|
if (columns.HasId(SaItemData.Column.ItemId))
|
|
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemId, aliasItemData));
|
|
if (columns.HasId(SaItemData.Column.DataType))
|
|
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_DataType, aliasItemData));
|
|
if (columns.HasId(SaItemData.Column.ItemData))
|
|
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_ItemData, aliasItemData));
|
|
if (columns.HasId(SaItemData.Column.Notes))
|
|
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Notes, aliasItemData));
|
|
if (columns.HasId(SaItemData.Column.Status) || columns.HasId(SaItemData.Column.Status_Desc) || columns.HasId(SaItemData.Column.Status_Ind))
|
|
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_Status, aliasItemData));
|
|
if (columns.HasId(SaItemData.Column.CreateOn_Date))
|
|
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_CreateOn, aliasItemData));
|
|
if (columns.HasId(SaItemData.Column.UpdateOn_Date))
|
|
query.Columns.Add(SaItemDataDbDfn.GetColumnNameQual(SaItemDataDbDfn.ColumnIdx.SaItemData_UpdateOn, aliasItemData));
|
|
|
|
//---------------------------------------------------------------------
|
|
// Populate filter.
|
|
query.Filters.AddRange(GetItemDataQueryFilter(prm));
|
|
|
|
// Configure sort sequence.
|
|
foreach (String sortColumn in GetItemDataSortColumns(prm))
|
|
query.OrderBy.Add(sortColumn);
|
|
|
|
//---------------------------------------------------------------------
|
|
//return new DbResultSet_DataTableReader(Database, query.BuildQuery(prm.ResultsPaging));
|
|
return DbResultSet_DataReader.ExecuteQuery(Database, query.BuildQuery(prm.ResultsPaging));
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|