155 lines
6.6 KiB
C#
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 SetErrorState("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())
|
|
SetErrorState("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 OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
public override bool ClearDataItem(SbmItemId itemId, DbUpdateInfo dbUpdateInfo)
|
|
{
|
|
ClearErrorState();
|
|
if (!ItemId.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)itemId.Type} AND {colItemIdFrom}={SysId.ToLong(itemId.Id)}");
|
|
filters.Add($"{colItemTypeTo}={(int)itemId.Type} AND {colItemIdTo}={SysId.ToLong(itemId.Id)}");
|
|
String filter = filters.Concat(" OR ", "(", ")");
|
|
//return Database.ExecuteDelete("DELETE FROM" + SbmDbDfn.GetTableName(SbmDbDfn.TableIdx.ItemLink) + " WHERE " + filter);
|
|
Database.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 OK;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
}
|
|
//=======================================================================
|
|
}
|