如何禁用销售订单屏幕折扣计算

时间:2018-12-05 08:17:37

标签: acumatica

我对销售订单进行了修改,需要用派生值更新销售订单行单价。这很好,并且在选择了该项目并且执行了SOLine_RowUpdating事件中的代码之后,将显示新的单价。但是,在选择数量之后,SOLine_RowUpdating会再次执行,然后系统会像往常一样计算折扣。由于我有自己的价格,不可以打折,因此我想超越或取消此标准折扣计算,只保留我的价格。这是SOLine_RowUpdating代码,它运行良好。

protected virtual void SOLine_RowUpdating(PXCache sender, PXRowUpdatingEventArgs e)
 {
   if (e.NewRow == null) {return; }

  Customer customer = Base.customer.Current;
  if (customer == null) return;

  SOLine soLine = (SOLine)e.NewRow;
  int BAAccountID = Convert.ToInt32(customer.BAccountID);
  int lCompanyID = PX.Data.Update.PXInstanceHelper.CurrentCompany;
  int lInventoryID = Convert.ToInt32(soLine.InventoryID);

  LookupPriceAndDiscountDetails(BAAccountID, lCompanyID, lInventoryID);  // My own code
  sender.SetValueExt<SOLine.curyUnitPrice>(soLine, gdNewUnitPrice);      //New price is in gdNewUnitPrice

  Base.Transactions.Cache.RaiseRowUpdated(soLine, soLine);
  Base.Transactions.View.RequestRefresh();
}

经过大量调查,我发现各种帖子都建议采用这种方法来清除/取消折扣,实际上,我可以在标准PX.Objects.SO.SOOrderEntry Row_Updated事件中找到它,但是当我在自己的方法中尝试时图形扩展名,它不会更新或清除,因为soline(缓存)值仍显示折扣号。我一定想念一些简单的东西。

此时任何想法都受到赞赏...

protected void SOLine_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e)
{
  SOLine row = e.Row as SOLine;
  DiscountEngine<SOLine>.ClearDiscount(sender,row);
  // RecalculateDiscounts(sender, row);  // ? (Maybe this) 
}

2 个答案:

答案 0 :(得分:1)

您步入正轨。再说几句。 1. Acumatica将始终执行基本的SOLine_RowUpdated事件,然后将执行您的SOLine_RowUpdated 2.如果要控制SOLine_RowUpdated事件的执行流程,可以执行以下操作:

protected void SOLine_RowUpdated(PXCache cache, PXRowUpdatedEventArgs e, PXRowUpdated del)
{
    //some code
    //del or pointer to basic method can be called like this:
   del(cache, e);
}
  1. del将指向方法SOLine_RowUpdated
  2. 的指针

您将有以下选择:

a。根本不要调用del(我不建议您使用这种方法,因为基本方法中有很多人员,而不仅仅是折扣计算)

b。致电del,然后删除折扣信息

c。如果您的方法ClearDiscount无法清除折扣信息,则可能是因为它试图通过简单的赋值来实现此目的,也许您可​​以尝试改用SetValueExt方法。

还有一点要记住。默认情况下,Acumatica将调用基本的RowUpdated方法,然后将调用您的方法,因此您无需使用委托。建议您从RowUpdated图形扩展的SetValueExt开始,而不是简单分配。

答案 1 :(得分:1)

为了简化操作,您可以使用以下图形扩展名关闭对RecalculateDiscounts的调用:

public class SOOrderEntryExtension : PXGraphExtension<SOOrderEntry>
{
    [PXOverride]
    public virtual void RecalculateDiscounts(PXCache sender, SOLine line, Action<PXCache, SOLine> del)
    {
        // if no discounts wanted, just return

        // else call the base/standard Acumatica calc discounts on sales order...
        if (del != null)
        {
            del(sender, line);
        }
    }
}

您还可以通过使用ARSalesPriceMaint上的图形扩展来编写自己的定价逻辑:

public class ARSalesPriceMaintExtension : PXGraphExtension<ARSalesPriceMaint>
{
    [PXOverride]
    public virtual decimal? CalculateSalesPriceInt(PXCache sender, string custPriceClass, int? customerID, int? inventoryID, int? siteID, CurrencyInfo currencyinfo, decimal? quantity, string UOM, DateTime date, bool alwaysFromBaseCurrency,
        Func<PXCache, string, int?, int?, int?, CurrencyInfo, decimal?, string, DateTime, bool, decimal?> del)
    {
        //run your custom price logic here and return

        // or return the base/standard Acumatica price logic...
        return del?.Invoke(sender, custPriceClass, customerID, inventoryID, siteID, currencyinfo, quantity, UOM, date, alwaysFromBaseCurrency);
    }
}

通过这种方式,您无需与事件发生冲突,而是覆盖事件用于在销售订单上设置折扣和价格的调用。我也相信ARSalesPRiceMaint扩展将使用定价逻辑覆盖其他屏幕,这有助于减少不同订单输入屏幕上的重复代码。