首页 > 解决方案 > 无法使用报价屏幕 CR304500 中的操作打开 SO 屏幕 SO301000

问题描述

我在销售报价屏幕中创建了一个名为 CREATE SO 的操作来创建销售订单。我无法使用此操作打开销售订单屏幕。尽管正在创建销售订单,但在创建 SO 时 SO 屏幕未打开。我不确定我的代码在哪里出错。请建议。谢谢。

      #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, () => 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>();
                        
                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"); // THIS ERROR IS ALSO NOT SHOWING WHILE ENCOUNTERING.
                }
                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)
                {
                    SOLine transline = new SOLine(); //EMPTY DAC OBJECT

                    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;

                    orderGraphObjet.Transactions.Insert(transline); //INSERT DAC INTO DATAVIEW

                    CROpportunityProductsExt xOppProductExt = PXCache<CROpportunityProducts>.GetExtension<CROpportunityProductsExt>(tran);
                    SOLineExt _soLext = PXCache<SOLine>.GetExtension<SOLineExt>(transline);   // GET DAC ENTENSION

                    _soLext.UsrXSeqID = xOppProductExt.UsrXSequenceID;
                    _soLext.UsrXGroupID = xOppProductExt.UsrXGroupID;
                    _soLext.UsrInternalRemk = xOppProductExt.UsrInternalRemk;   // ASSIGN CUSTOM FIELDS

                    orderGraphObjet.Transactions.Update(transline); // UPDATE DAC OBJECT IN DATAVIEW

                }
                orderGraphObjet.Actions.PressSave();
                var_orderCreated = true;

            //if (orderGraphObjet != null && orderHeaderObject != null)
            if (var_orderCreated)
            {
                orderGraphObjet.Document.Current = orderHeaderObject; // HERE I AM GETTING THE OrderType as well as OrderNbr to open the Document.

                throw new PXRedirectRequiredException(orderGraphObjet, "Document") { Mode = PXBaseRedirectException.WindowMode.NewWindow };
            }
     }

            #endregion


        }
}

标签: acumaticaacumatica-kb

解决方案


问题是重定向在 PXLongOperation 中。PXLongOperation 启动一个与 UI 无关的单独线程。为了解决这个问题,您可以在长操作完成后使用 PXCustomInfo 结构与 UI 线程对话,从而能够重定向到 so 屏幕。

// PXCustomInfoDefinition
public sealed class SORedirectionCustomInfo: IPXCustomInfo
{
    private PXGraph _OrderGraph;
    public SORedirectionCustomInfo(PXGraph orderGraph)
    {
        _OrderGraph = orderGraph;
    }

    public void Complete(PXLongRunStatus status, PXGraph graph)
    {
        if (status == PXLongRunStatus.Completed && graph is <YourQuoteGraphType>)
        {
            throw new PXRedirectRequiredException(orderGraphObjet, "Document") { Mode = PXBaseRedirectException.WindowMode.NewWindow };
        }
    }
}

// Long Operation Method
public virtual void CreateSalesOrderMethod(CRQuote quote, List<CROpportunityProducts> QuoteList)
{
    // Your code to create SO....
    if (var_orderCreated)
    {
        PXLongOperation.SetCustomInfo(new SORedirectionCustomInfo(orderGraphObjet));
    }
}

一旦长操作完成并创建订单,这应该能够成功重定向。


推荐阅读