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 GetLogProperties(SbmItemLink itemLink) { return new List() { 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 filters = new List(); 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 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 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(); } //------------------------------------------------------------------- } //======================================================================= }