Files
BusinessMgr-2019/SaBusMgrStandardDbas/Dbas/Mgr/SbmDataItemMgr_Dbas-ItemLink-Utils.cs
T
2024-11-19 09:47:00 +00:00

155 lines
6.6 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 - Utils.
//=======================================================================
partial class SbmDataItemMgr_Dbas
{
//-------------------------------------------------------------------
// 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;
}
//-------------------------------------------------------------------
// Associated items.
public override bool UpdateLinkedItems(Sbm.AssociatedItemMode itemMode, Sbm.ItemLinkType itemLinkType, ref ItemId itemIdParent, ref ItemId itemIdChild, ItemId itemId, List<SbmItemLink> itemLinks)
{
ClearErrorState();
// If the fixed item hasn't previously been specified, store the value now.
if (ItemLinkParentIsFixed(itemMode) && itemIdParent.Type == itemId.Type && !SysId.IsValid(itemIdParent.Id))
itemIdParent = itemId;
else if (ItemLinkChildIsFixed(itemMode) && itemIdChild.Type == itemId.Type && !SysId.IsValid(itemIdChild.Id))
itemIdChild = itemId;
// Validate the configuration.
if (ItemLinkConfigIsValid(itemMode, itemLinkType))
return SetErrorState("Invalid configuration for associated items");
// Validate fixed item:
if (ItemLinkParentIsFixed(itemMode))
{
if (itemIdParent != itemId)
return SetErrorState("Inconsistent parent item specified");
}
else if (ItemLinkChildIsFixed(itemMode))
{
if (itemIdChild != itemId)
return SetErrorState("Inconsistent child item specified");
}
if (ItemLinkParentIsFixed(itemMode))
{
// Parent item is fixed - update its child items as specified in the list:
if (itemLinks != null) itemLinks.SetSequences();
if (!DataItemMgr.StoreFromItemLinks(itemLinkType, itemId, itemLinks, DbUpdateInfo))
return SetErrorState($"Failed to store associated items - {DataItemMgr.ErrorStateMessage}");
}
else if (ItemLinkChildIsFixed(itemMode))
{
// Child item is fixed - update its parent items as specified in the list:
if (!DataItemMgr.StoreToItemLinks(itemLinkType, itemId, itemLinks, DbUpdateInfo))
return SetErrorState($"Failed to store associated items - {DataItemMgr.ErrorStateMessage}");
}
return !HasErrorState();
}
//-------------------------------------------------------------------
}
//=======================================================================
}