我对销售订单进行了修改,需要用派生值更新销售订单行单价。这很好,并且在选择了该项目并且执行了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)
}
答案 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);
}
您将有以下选择:
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扩展将使用定价逻辑覆盖其他屏幕,这有助于减少不同订单输入屏幕上的重复代码。