如何检查是否按下了删除,因为删除项目时出现 MoveNext 错误
How to Check if Delete was Pressed as there is a MoveNext Error while deleting item
有没有办法检查是否在 Acumatica 屏幕中按下了删除操作?这是因为我有一个用于重新加载 StockItems 屏幕的代码,每当我删除一个项目时,它都会给我一个 movenext 错误,但该项目正在被成功删除。以下是我的重新加载代码:
[PXOverride]
public void Persist(Action persist)
{
persist();// this will call base Persist();
InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
if (inv != null && inv.InventoryID.HasValue)
{
grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
throw new PXRedirectRequiredException(grp, "Reloading Item");
}
}
作为我建议您添加到 DAC 字段 IsDeleted 的方法之一,如下所示:
[PXBool]
[PXDefault(false)]
public bool? IsDeleted { get; set; }
然后附加到 RowDeleting()。例如像这样:
protected virtual void ShipmentLine_RowDeleting(PXCache sender, PXRowDeletingEventArgs e)
{
ShipmentLine line = (ShipmentLine)e.Row;
line.IsDeleted = true;
}
最后将您的代码修改为以下场景:
[PXOverride]
public void Persist(Action persist)
{
ShipmentLine line = ViewShipmentLine.Current;
if(line.IsDeleted)
{
//do some logic which you consider as nesessary
}
persist();// this will call base Persist();
InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD,Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
if (inv != null && inv.InventoryID.HasValue)
{
grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
throw new PXRedirectRequiredException(grp, "Reloading Item");
}
}
希望对您有所帮助。
你可以按照Yura建议的方法,或者你可以用我认为的其他方法来实现..
你可以在调用base persist之前检查记录的缓存状态,如果缓存状态说它被删除,不要做你的重定向。
代码可能如下所示[未测试]
[PXOverride]
public void Persist(Action persist)
{
bool isDeletion = false;
InventoryItem CurrentItem = this.Base.Item.Cache.Current as InventoryItem ;
if(this.Base.Item.Cache.GetStatus(CurrentItem) == PXEntryStatus.Deleted) // Helps to check whether the operation is deletion
isDeletion = true;
persist();// this will call base Persist();
if(!isDeletion)
{
InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
if (inv != null && inv.InventoryID.HasValue)
{
grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
throw new PXRedirectRequiredException(grp, "Reloading Item");
}
}
}
编辑:
我发现上面的代码不能作为 InventoryItem
this.Base.Item.Current // is returning null
这是你的 movenext 错误的基本问题,所以我建议你按如下方式更新你的代码
[PXOverride]
public void Persist(Action persist)
{
persist();// this will call base Persist();
InventoryItem CurrentItem = this.Base.Item.Current as InventoryItem;
if (CurrentItem != null)
{
InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, CurrentItem.InventoryCD.Trim());
if (inv != null && inv.InventoryID.HasValue)
{
grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
throw new PXRedirectRequiredException(grp, "Reloading Item");
}
}
}
有没有办法检查是否在 Acumatica 屏幕中按下了删除操作?这是因为我有一个用于重新加载 StockItems 屏幕的代码,每当我删除一个项目时,它都会给我一个 movenext 错误,但该项目正在被成功删除。以下是我的重新加载代码:
[PXOverride]
public void Persist(Action persist)
{
persist();// this will call base Persist();
InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
if (inv != null && inv.InventoryID.HasValue)
{
grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
throw new PXRedirectRequiredException(grp, "Reloading Item");
}
}
作为我建议您添加到 DAC 字段 IsDeleted 的方法之一,如下所示:
[PXBool]
[PXDefault(false)]
public bool? IsDeleted { get; set; }
然后附加到 RowDeleting()。例如像这样:
protected virtual void ShipmentLine_RowDeleting(PXCache sender, PXRowDeletingEventArgs e)
{
ShipmentLine line = (ShipmentLine)e.Row;
line.IsDeleted = true;
}
最后将您的代码修改为以下场景:
[PXOverride]
public void Persist(Action persist)
{
ShipmentLine line = ViewShipmentLine.Current;
if(line.IsDeleted)
{
//do some logic which you consider as nesessary
}
persist();// this will call base Persist();
InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD,Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
if (inv != null && inv.InventoryID.HasValue)
{
grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
throw new PXRedirectRequiredException(grp, "Reloading Item");
}
}
希望对您有所帮助。
你可以按照Yura建议的方法,或者你可以用我认为的其他方法来实现..
你可以在调用base persist之前检查记录的缓存状态,如果缓存状态说它被删除,不要做你的重定向。
代码可能如下所示[未测试]
[PXOverride]
public void Persist(Action persist)
{
bool isDeletion = false;
InventoryItem CurrentItem = this.Base.Item.Cache.Current as InventoryItem ;
if(this.Base.Item.Cache.GetStatus(CurrentItem) == PXEntryStatus.Deleted) // Helps to check whether the operation is deletion
isDeletion = true;
persist();// this will call base Persist();
if(!isDeletion)
{
InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, this.Base.Item.Current.InventoryCD.Trim());
if (inv != null && inv.InventoryID.HasValue)
{
grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
throw new PXRedirectRequiredException(grp, "Reloading Item");
}
}
}
编辑:
我发现上面的代码不能作为 InventoryItem
this.Base.Item.Current // is returning null
这是你的 movenext 错误的基本问题,所以我建议你按如下方式更新你的代码
[PXOverride]
public void Persist(Action persist)
{
persist();// this will call base Persist();
InventoryItem CurrentItem = this.Base.Item.Current as InventoryItem;
if (CurrentItem != null)
{
InventoryItemMaint grp = PXGraph.CreateInstance<InventoryItemMaint>();
InventoryItem inv = PXSelect<InventoryItem, Where<InventoryItem.inventoryCD, Equal<Required<InventoryItem.inventoryCD>>>>.Select(grp, CurrentItem.InventoryCD.Trim());
if (inv != null && inv.InventoryID.HasValue)
{
grp.Item.Current = grp.Item.Search<InventoryItem.inventoryID>(inv.InventoryID);
throw new PXRedirectRequiredException(grp, "Reloading Item");
}
}
}