2016-02-27 68 views
0

在销售订单页面中,我创建了PXAction按钮,其目的是保存,将用户定义的复选框字段设置为true刷新页面。当复选框为真时,SQL触发器运行, SOLine Like价格等等。当前它保存并重定向到Base对象并检查字段,但新的重定向页面不显示SQL触发器完成的更改,直到我手动按刷新/ F5或按我的第二次按钮。抛出新的PXRedirectRequiredException不重新加载最新数据

,如果我做的按钮手动做什么,只是保存页面,检查用户定义的复选框,然后按F5的变化能准确反映(从触发)有没有一种方法,我可以实现整页刷新就像一个F5,而不是诉诸Throw new PXredirectRequiredException()

这里是我的代码调用基对象,并重定向到基地:

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); 
     }   
    } 

在此先感谢。

回答

0

我结束了使用grp.Document.Current = grp.Document.Search<SOLine.orderNbr>(sLine.OrderNbr);之前,新的异常,并将其加载的所有更新值的正确。而不是仅仅将grp设置为基本文档,或者只是将异常抛出到基本。

+0

很好,你找到了适合你的东西。确保你包含订单类型,因为它也是这样的关键的一部分:docgraph.Document.Search (order.OrderNbr,order.OrderType); – Brendan

0

使用扩展名并更新dac扩展中的值时,您需要调用基表上的更新。在你的情况下,它看起来像你的分机上SOOrder,所以你需要调用类似于下面的示例更新:

//after you set your SOOrderExt.UsrRecalcPrice call this... 
Base.Document.Update(sOrder); 
//now call PressSave... 

你应该能够做到这一点,而不重定向withing这样的事情在地方重定向:

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; 
    } 
+0

当然,我会建议不要使用任何SQL代码,如触发器和存储过程,因为这违背了使用功能强大和灵活的Acumatica框架的好处。 – Brendan

+0

我试着做你所建议的,不幸的是它没有工作,并最终使SOOrder页面的性能挂起,而不是刷新。此外,我理解您对使用触发器和存储过程的关注,这只是一个临时修复,而我正在寻找更好的实现方法。 – JB90

+0

我包含另一个例子。我没有SO命令的扩展名来测试。您可能遇到的另一个问题是,触发完成之前触发动作的返回,以及为什么我认为调用另一个选择可能会有所帮助。也可以尝试使用PXSelectReadOnly代替PXSelect,以确保它从数据库获取结果,而不仅仅是缓存。 – Brendan