【问题标题】:Acumatica Override Opportunity Create SO actionAcumatica Override Opportunity 创建 SO 操作
【发布时间】:2022-04-06 05:48:07
【问题描述】:

我需要修改机会屏幕上创建销售订单操作的行为。

我正在努力寻找可能的最佳/干扰最小的方法。我在下面有一个基本代码的 sn-p。

我需要做的改变比较简单。我需要填充新 SO 上存在的一些自定义字段。

最好的方法是什么?

public PXAction<CROpportunity> createSalesOrder;
[PXUIField(DisplayName = Messages.CreateSalesOrder, MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select)]
[PXButton(ImageKey = PX.Web.UI.Sprite.Main.DataEntry)]
public virtual IEnumerable CreateSalesOrder(PXAdapter adapter)
{
    foreach (CROpportunity opportunity in adapter.Get<CROpportunity>())
    {
        Customer customer = (Customer)PXSelect<Customer, Where<Customer.bAccountID, Equal<Current<CROpportunity.bAccountID>>>>
            .SelectSingleBound(this, new object[] { opportunity });
        if (customer == null)
        {
            throw new PXException(Messages.ProspectNotCustomer);
        }

        if (CreateOrderParams.AskExtFullyValid((graph, viewName) => { }, DialogAnswerType.Positive))
        {
            Actions.PressSave();
            PXLongOperation.StartOperation(this, delegate()
            {
                var grapph = PXGraph.CreateInstance<OpportunityMaint>();
                grapph.Opportunity.Current = opportunity;
                grapph.CreateOrderParams.Current = CreateOrderParams.Current;
                grapph.DoCreateSalesOrder(CreateOrderParams.Current);
            });
        }
        yield return opportunity;
    }

}

protected virtual void DoCreateSalesOrder(CreateSalesOrderFilter param)
{
    bool recalcAny = param.RecalculatePrices == true ||
                     param.RecalculateDiscounts == true ||
                     param.OverrideManualDiscounts == true ||
                     param.OverrideManualDocGroupDiscounts == true ||
                     param.OverrideManualPrices == true;

    var opportunity = this.Opportunity.Current;
    Customer customer = (Customer)PXSelect<Customer, Where<Customer.bAccountID, Equal<Current<CROpportunity.bAccountID>>>>.Select(this);

【问题讨论】:

    标签: acumatica


    【解决方案1】:

    一个简单的覆盖应该可以实现您的目标。下面是一个示例,它在创建销售订单操作期间将自定义逻辑注入事件处理程序 SOOrder.RowInserted。然后让动作正常完成。这种方法使用您的自定义逻辑扩展操作,同时保留操作的基本代码。

        public class OpportunityMaint_Extension : PXGraphExtension<OpportunityMaint>
    {
        public delegate IEnumerable CreateSalesOrderDelegate(PXAdapter adapter);
        [PXOverride]
        public IEnumerable CreateSalesOrder(PXAdapter adapter, CreateSalesOrderDelegate baseMethod)
        {
            PXGraph.InstanceCreated.AddHandler<SOOrderEntry>((graph) =>
            {
                graph.RowInserted.AddHandler<SOOrder>((sender, e) =>
                {
                    SOOrder order = (SOOrder)e.Row;
                    SOOrderExt orderExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(order);
    
                    orderExt.UsrCustomOne = "Howdy";  //assign anything you want here
                });
            });
    
            return baseMethod(adapter);
        }
    }
    

    }

    【讨论】:

    • 哇,这看起来正是我需要的。我实际上需要从 CROpportunity 和 CROpportunityProducts DAC 中提取数据并更新 SOOrder 和 SOLine 上的自定义字段。我可以为 SOLine 添加第二个 addhandler 吗?引用与 SOOrder 和 SOLine 关联的 CROpportunity 和 CROpportunityProducts DAC 的正确方法是什么?非常感谢您的帮助。
    • 我通过添加第二个 addhander 来为 SOOrder 和 SOLine 工作。对于 SOOrder,我只使用 Base.Opportunity.Current 来访问 CROpportunity 对象。我唯一不确定的是如何在 RowInserted 事件中引用与 SOLine 关联的 CROpportunityProducts 对象。
    • 我最终将 SOLine 事件更改为行更新,然后根据 SortOrder 将原始 Opp 产品线与 SOLine 匹配。基本代码的编写方式发生在任何数据字段更新之前。这似乎工作正常,虽然我仍然想知道是否有更优雅的方法。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多