【问题标题】:Unable to Update Custom Field in Sales Quote Screen From Sales Order on an Action Event无法根据操作事件的销售订单更新销售报价屏幕中的自定义字段
【发布时间】:2021-04-14 12:11:22
【问题描述】:

我在销售报价屏幕中创建了一个操作来创建销售订单。正在创建销售订单。如果创建了销售订单,我希望将创建的订单编号填充到销售报价屏幕的自定义字段中,并禁用操作按钮。虽然我在系统中没有收到任何错误。 当我刷新销售报价屏幕时,我得到了确切的结果,但不是在单击 Create SO Action 期间。

我不确定我哪里出错了。请参考下面的代码和图片:谢谢。 以下是我的代码:

  public class QuoteMaint_Extension : PXGraphExtension<QuoteMaint>
  {

        #region Event Handlers

        protected void CRQuote_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
        {
            var row = (CRQuote)e.Row;
            CRQuoteExt quoteExt = PXCache<CRQuote>.GetExtension<CRQuoteExt>(row);

            if (quoteExt.UsrOrderNbr != null)
            {
                createSalesOrder.SetEnabled(false);
            }
            else
            {
                createSalesOrder.SetEnabled(true);
            }
    }

        #endregion

        #region Create Sales Order

        public PXAction<CRQuote> createSalesOrder;
        [PXUIField(DisplayName = "Create SO", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Update)]
        [PXProcessButton(CommitChanges = true)]

        public IEnumerable CreateSalesOrder(PXAdapter adapter)
        {
            QuoteMaint graphObject = PXGraph.CreateInstance<QuoteMaint>();

            foreach (CRQuote quote in adapter.Get())
            {
                //Create resultset for Quote Details
                PXResultset<CROpportunityProducts> PXSetLine = PXSelect<CROpportunityProducts,
                 Where<CROpportunityProducts.quoteID,
                 Equal<Required<CROpportunityProducts.quoteID>>>>.Select(this.Base, quote.QuoteID);

                List<CROpportunityProducts> QuoteList = new List<CROpportunityProducts>();

                foreach (CROpportunityProducts line in PXSetLine)
                {
                    QuoteList.Add(line);
                }

                PXLongOperation.StartOperation(this, delegate ()
                {
                    CreateSalesOrderMethod(quote, QuoteList);
                });

                yield return quote;
            }

        }
        //Private Method for Create Sales Order
        public virtual void CreateSalesOrderMethod(CRQuote quote, List<CROpportunityProducts> QuoteList)
        {
            //Base.Save.Press();
            bool var_orderCreated = false;
            bool erroroccured = false;
            string ErrMsg = "";

            SOOrderEntry orderGraphObjet = PXGraph.CreateInstance<SOOrderEntry>();
            SOOrder orderHeaderObject = new SOOrder();
            QuoteMaint currGRPH = PXGraph.CreateInstance<QuoteMaint>();
            var Extension = this.Base.GetExtension<QuoteMaint_Extension>();
            try
            {
                BAccount customer = PXSelect<BAccount, Where<BAccount.bAccountID, Equal<Current<CRQuote.bAccountID>>>>.Select(this.Base, quote.BAccountID);
                if (customer.Type == "CU")
                {
                    orderHeaderObject.CustomerID = quote.BAccountID;
                }
                else
                {
                    throw new PXException("Business Account not converted to Customer yet");
                }
                orderHeaderObject.CuryOrderTotal = quote.CuryProductsAmount;
                orderHeaderObject.CuryTaxTotal = quote.CuryTaxTotal;
                orderHeaderObject.OrderDesc = quote.Subject;

                orderHeaderObject = orderGraphObjet.CurrentDocument.Insert(orderHeaderObject);
                orderGraphObjet.CurrentDocument.Current = orderHeaderObject;
                orderGraphObjet.Actions.PressSave();

                orderHeaderObject = orderGraphObjet.CurrentDocument.Current;

                foreach (CROpportunityProducts tran in QuoteList)
                {

                    CROpportunityProductsExt xOppProductExt = PXCache<CROpportunityProducts>.GetExtension<CROpportunityProductsExt>(tran); 
                    SOLine transline = new SOLine();

                    SOLineExt _soLext = PXCache<SOLine>.GetExtension<SOLineExt>(transline);
                   
                    transline.OrderNbr = orderHeaderObject.OrderNbr;
                    transline.BranchID = orderHeaderObject.BranchID;
                    transline.InventoryID = tran.InventoryID;
                    transline.TranDesc = tran.Descr;
                    transline.UOM = tran.UOM;
                    transline.OrderQty = tran.Quantity;
                    transline.SiteID = tran.SiteID;
                    transline.CuryUnitPrice = tran.CuryUnitPrice;
                    transline.CuryExtPrice = tran.CuryExtPrice;
                    _soLext.UsrXSeqID = xOppProductExt.UsrXSequenceID;
                    _soLext.UsrXGroupID = xOppProductExt.UsrXGroupID;
                    _soLext.UsrInternalRemk = xOppProductExt.UsrInternalRemk;

                    orderGraphObjet.Transactions.Insert(transline);
                }
                orderGraphObjet.Actions.PressSave();
                var_orderCreated = true;
            }
            catch (Exception e)
            {
                erroroccured = true;
                ErrMsg = e.Message;
            }

            if (erroroccured)
            {
                throw new PXException("Cannot create Order: " + ErrMsg);
            }
            else
            {
                if(var_orderCreated)
                {
                    CRQuote QUOT = Base.Quote.Current;
                    CRQuoteExt QUOT_EXT = PXCache<CRQuote>.GetExtension<CRQuoteExt>(QUOT);
                    QUOT_EXT.UsrOrderNbr = orderHeaderObject.OrderNbr;
                    Base.Quote.Update(QUOT);
                    Base.Save.Press();
                }

            }
            

        }

        #endregion
    }
}

DAC 字段:

#region UsrOrderNbr
        [PXDBString(50)]
        [PXUIField(DisplayName = "Sales Order Nbr", IsReadOnly = true)]
        [PXSelector(
           typeof(Search<SOOrder.orderNbr>),
           typeof(SOOrder.orderType),
           typeof(SOOrder.orderNbr),
           typeof(SOOrder.curyOrderTotal),
           typeof(SOOrder.status),
            Filterable = true)]

        public virtual string UsrOrderNbr { get; set; }
        public abstract class usrOrderNbr : PX.Data.BQL.BqlString.Field<usrOrderNbr> { }
        #endregion

【问题讨论】:

    标签: acumatica acumatica-kb


    【解决方案1】:

    在定义 SOLine 键之前,从 transLine 对象获取 DAC 扩展。尝试在将transLine 插入数据视图后移动GetExtension 调用。

    SOLine transline = new SOLine();
    SOLineExt _soLext = PXCache<SOLine>.GetExtension<SOLineExt>(transline);
    

    模式应该是这样的:

    1. 创建空的 DAC 对象
    2. 在数据视图中插入 DAC 对象
    3. 获取 DAC 扩展并分配自定义字段
    4. 在数据视图中更新 DAC 对象

    【讨论】:

    • 我尝试了你给出的步骤,但没有运气。首次单击 CREATE SO 操作时,Sales Order Nbr 字段未更新,我需要再次刷新页面。 SOLine transline = new SOLine(); //空 DAC 对象 //分配系统字段 orderGraphObjet.Transactions.Insert(transline); //INSERT DAC INTO DATAVIEW SOLineExt _soLext = PXCache.GetExtension(transline); // 获取 DAC ENTENSION // 分配自定义字段 orderGraphObjet.Transactions.Update(transline); // 更新数据视图中的 DAC 对象
    • 删除 PXSelector 属性或向其添加属性 ValidateValue=False。还要检查调试器中的值。尝试保存一个常量值,因为不清楚在尝试保存时是否已经计算了所需的值。
    • HI Hugues,我已经按照你的指示做了。我已经使用调试器检查了该值,它计算了确切的值。但仍然没有运气。该字段未更新。您是否建议执行任何相关字段以获得所需的结果。如果有请建议...谢谢:)
    • CRQuote 是一个投影DAC,你扩展了 Standalone.CRQuote 和投影吗?
    • 嗨 Hugues,是的,我已经扩展了 CRQuote.Standalone
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多