抛出新的 PXRedirectRequiredException 不重新加载最新数据
Throw new PXRedirectRequiredException not reloading most recent data
在销售订单页面,我创建了 PXAction
按钮,目的是保存,将用户定义的复选框字段设置为 true 刷新 page.A SQL 触发器在复选框运行时运行是真的,它改变了 SOLine Like 价格等的值。目前它保存并重定向到 Base 对象并检查一个字段,但是新的重定向页面不显示 SQL 触发器完成的更改,直到我手动按下 refresh/F5 或再次按下我的按钮。
但是如果我手动执行按钮的操作并保存页面,请选中用户定义的复选框,然后按 F5更改被准确反映(从触发器)有没有一种方法可以像 F5 那样实现整页刷新,而不是求助于 Throw new PXredirectRequiredException()
这是我调用 Base 对象并重定向到 Base 的代码:
public PXAction<SOOrder> KSRefresh;
[PXUIField(DisplayName = "Recal Prices")]
[PXButton(CommitChanges = true)]
protected virtual void kSRefresh()
{
SOLine sLine = PXSelect<SOLine, Where<SOLine.orderNbr, Equal<Required<SOLine.orderNbr>>>>.Select(Base, this.Base.Document.Current.OrderNbr);
SOOrder sOrder = PXSelect<SOOrder, Where<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>.Select(Base, this.Base.Document.Current.OrderNbr);
SOOrderExt sOrderExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(sOrder);
sOrderExt.UsrRecalcPrice = true;
Base.Actions.PressSave();
if (sLine != null && sLine.InventoryID.HasValue)
{
throw new PXRedirectRequiredException(Base, null);
}
}
这是我的代码,尝试重定向到新实例中的基础副本实例,以测试这是否会反映触发器所做的新更改:
public PXAction<SOOrder> KSRefresh;
[PXUIField(DisplayName = "Recal Prices")]
[PXButton(CommitChanges = true)]
protected virtual void kSRefresh()
{
SOLine sLine = PXSelect<SOLine, Where<SOLine.orderNbr, Equal<Required<SOLine.orderNbr>>>>.Select(Base, this.Base.Document.Current.OrderNbr);
SOOrder sOrder = PXSelect<SOOrder, Where<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>.Select(Base, this.Base.Document.Current.OrderNbr);
SOOrderExt sOrderExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(sOrder);
sOrderExt.UsrRecalcPrice = true;
SOOrderEntry grp = PXGraph.CreateInstance<SOOrderEntry>();
Base.Actions.PressSave();
grp.Document.Current = Base.Document.Current;
if (sLine != null && sLine.InventoryID.HasValue)
{
throw new PXRedirectRequiredException(grp, null);
}
}
提前致谢。
使用扩展并更新 dac 扩展中的值时,您需要在基础 table 上调用更新。在您的情况下,您的扩展程序似乎在 SOOrder 上,因此您需要调用类似于以下示例的更新:
//after you set your SOOrderExt.UsrRecalcPrice call this...
Base.Document.Update(sOrder);
//now call PressSave...
你应该能够在没有重定向的情况下使用类似这样的东西代替重定向来做到这一点:
SOOrder sOrder = PXSelect<SOOrder, Where<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>.Select(Base, this.Base.Document.Current.OrderNbr);
SOOrderExt sOrderExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(sOrder);
sOrderExt.UsrRecalcPrice = true;
Base.Document.Update(sOrder);
Base.Actions.PressSave();
Base.Document.Current = PXSelect<SOOrder,
Where<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>.Select(Base,
sOrder.OrderNbr);
另一个示例是 CopyOrder 操作的 SOOrderEntry 图。也许返回 IEnumerable 并返回订单列表(列表仅包含您的 1 个订单)以查看是否刷新。这是示例:
public PXAction<SOOrder> copyOrder;
[PXUIField(DisplayName = "Copy Order", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select, Visible = false)]
[PXLookupButton]
public virtual IEnumerable CopyOrder(PXAdapter adapter)
{
List<SOOrder> list = adapter.Get<SOOrder>().ToList();
if (copyparamfilter.AskExt(setStateFilter, true) == WebDialogResult.OK && string.IsNullOrEmpty(copyparamfilter.Current.OrderType) == false)
{
this.Save.Press();
SOOrder order = PXCache<SOOrder>.CreateCopy(Document.Current);
// Put your code here, press save, then return the list with the current document
//this.CopyOrderProc(order, copyparamfilter.Current);
List<SOOrder> rs = new List<SOOrder> {Document.Current};
return rs;
}
return list;
}
我最终在新异常之前使用了 grp.Document.Current = grp.Document.Search<SOLine.orderNbr>(sLine.OrderNbr);
,它正确加载了所有更新的值。而不是仅仅将 grp 设置为基本文档或者只是将异常抛给 Base。
在销售订单页面,我创建了 PXAction
按钮,目的是保存,将用户定义的复选框字段设置为 true 刷新 page.A SQL 触发器在复选框运行时运行是真的,它改变了 SOLine Like 价格等的值。目前它保存并重定向到 Base 对象并检查一个字段,但是新的重定向页面不显示 SQL 触发器完成的更改,直到我手动按下 refresh/F5 或再次按下我的按钮。
但是如果我手动执行按钮的操作并保存页面,请选中用户定义的复选框,然后按 F5更改被准确反映(从触发器)有没有一种方法可以像 F5 那样实现整页刷新,而不是求助于 Throw new PXredirectRequiredException()
这是我调用 Base 对象并重定向到 Base 的代码:
public PXAction<SOOrder> KSRefresh;
[PXUIField(DisplayName = "Recal Prices")]
[PXButton(CommitChanges = true)]
protected virtual void kSRefresh()
{
SOLine sLine = PXSelect<SOLine, Where<SOLine.orderNbr, Equal<Required<SOLine.orderNbr>>>>.Select(Base, this.Base.Document.Current.OrderNbr);
SOOrder sOrder = PXSelect<SOOrder, Where<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>.Select(Base, this.Base.Document.Current.OrderNbr);
SOOrderExt sOrderExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(sOrder);
sOrderExt.UsrRecalcPrice = true;
Base.Actions.PressSave();
if (sLine != null && sLine.InventoryID.HasValue)
{
throw new PXRedirectRequiredException(Base, null);
}
}
这是我的代码,尝试重定向到新实例中的基础副本实例,以测试这是否会反映触发器所做的新更改:
public PXAction<SOOrder> KSRefresh;
[PXUIField(DisplayName = "Recal Prices")]
[PXButton(CommitChanges = true)]
protected virtual void kSRefresh()
{
SOLine sLine = PXSelect<SOLine, Where<SOLine.orderNbr, Equal<Required<SOLine.orderNbr>>>>.Select(Base, this.Base.Document.Current.OrderNbr);
SOOrder sOrder = PXSelect<SOOrder, Where<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>.Select(Base, this.Base.Document.Current.OrderNbr);
SOOrderExt sOrderExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(sOrder);
sOrderExt.UsrRecalcPrice = true;
SOOrderEntry grp = PXGraph.CreateInstance<SOOrderEntry>();
Base.Actions.PressSave();
grp.Document.Current = Base.Document.Current;
if (sLine != null && sLine.InventoryID.HasValue)
{
throw new PXRedirectRequiredException(grp, null);
}
}
提前致谢。
使用扩展并更新 dac 扩展中的值时,您需要在基础 table 上调用更新。在您的情况下,您的扩展程序似乎在 SOOrder 上,因此您需要调用类似于以下示例的更新:
//after you set your SOOrderExt.UsrRecalcPrice call this...
Base.Document.Update(sOrder);
//now call PressSave...
你应该能够在没有重定向的情况下使用类似这样的东西代替重定向来做到这一点:
SOOrder sOrder = PXSelect<SOOrder, Where<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>.Select(Base, this.Base.Document.Current.OrderNbr);
SOOrderExt sOrderExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(sOrder);
sOrderExt.UsrRecalcPrice = true;
Base.Document.Update(sOrder);
Base.Actions.PressSave();
Base.Document.Current = PXSelect<SOOrder,
Where<SOOrder.orderNbr, Equal<Required<SOOrder.orderNbr>>>>.Select(Base,
sOrder.OrderNbr);
另一个示例是 CopyOrder 操作的 SOOrderEntry 图。也许返回 IEnumerable 并返回订单列表(列表仅包含您的 1 个订单)以查看是否刷新。这是示例:
public PXAction<SOOrder> copyOrder;
[PXUIField(DisplayName = "Copy Order", MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select, Visible = false)]
[PXLookupButton]
public virtual IEnumerable CopyOrder(PXAdapter adapter)
{
List<SOOrder> list = adapter.Get<SOOrder>().ToList();
if (copyparamfilter.AskExt(setStateFilter, true) == WebDialogResult.OK && string.IsNullOrEmpty(copyparamfilter.Current.OrderType) == false)
{
this.Save.Press();
SOOrder order = PXCache<SOOrder>.CreateCopy(Document.Current);
// Put your code here, press save, then return the list with the current document
//this.CopyOrderProc(order, copyparamfilter.Current);
List<SOOrder> rs = new List<SOOrder> {Document.Current};
return rs;
}
return list;
}
我最终在新异常之前使用了 grp.Document.Current = grp.Document.Search<SOLine.orderNbr>(sLine.OrderNbr);
,它正确加载了所有更新的值。而不是仅仅将 grp 设置为基本文档或者只是将异常抛给 Base。