Skip to main content
Question

Warnings are lost once an exception is thrown

  • November 29, 2023
  • 0 replies
  • 103 views

Forum|alt.badge.img

Hi,

My requirement is to catch the warning raised by Acumatica on the Purchase Order Screen for Order Total field. If there is a warning message regarding budget exceeded, I need to convert it to an error and stop the Release From Hold Action.

I implemented the code but it works only one time the button is clicked, the next time the button is clicked, since the warnings from Acumatica are gone, the code does not work.

Steps:

  1. On Page load, there is a warning on the field Order total (The project budget is exceeded. For details, check warnings in the document lines.)
  2. Click Release from Hold button, error message is shown and the field is highlighted - Working as expected. Warning messages are lost because I raised exception.
  3. Click Release from Hold again, I am able to proceed since the Acumatica Warnings are not there after step 2.

Is it possible to retain the warnings as well as shown a message to the user at same time?

public bool IsBudgetExceeded { get; set; } = false;

        public delegate IEnumerable ReleaseFromHoldDelegate(PXAdapter adapter);

        [PXOverride]
        public virtual IEnumerable ReleaseFromHold(PXAdapter adapter, ReleaseFromHoldDelegate baseMethod)
        {
            if (Base.Document.Current != null)
            {
                // Check If there is any Allocation Rule in progress
                bool isAllocationTaskPrgress = IsAllocationTaskInProgress();
                PXTrace.WriteInformation("isAllocationTaskPrgress:" + isAllocationTaskPrgress);
                if (isAllocationTaskPrgress)
                {
                    // Check If Budget is exceeded
                    bool isBudgetExceeded = CheckBudgetisExceeded();
                    PXTrace.WriteInformation("isBudgetExceeded:" + isBudgetExceeded);
                    if (isBudgetExceeded)
                    {
                        Base.Document.Cache.RaiseExceptionHandling<POOrder.curyOrderTotal>(Base.Document.Current, Base.Document.Current.CuryOrderTotal,
                                              new PXSetPropertyException(PX.Objects.PM.Messages.BudgetControlDocumentWarning, PXErrorLevel.Warning));
                        throw new PXException(PX.Objects.PM.Messages.BudgetControlDocumentWarning);
                    }
                }
            }
            return adapter.Get<POOrder>();
        }

        public void POOrder_RowUpdated(PXCache sender, PXRowUpdatedEventArgs e, PXRowUpdated del)
        {
            del?.Invoke(sender, e);
            if (e.Row == null)
                return;

            string warning = PXUIFieldAttribute.GetWarning<POOrder.curyOrderTotal>(sender, e.Row);

            if (!string.IsNullOrEmpty(warning)
                && warning.Contains(PX.Objects.PM.Messages.BudgetControlDocumentWarning))
            {
                IsBudgetExceeded = true;
            }
            else
            {
                IsBudgetExceeded = false;                
            }
        }
        public void POOrder_curyOrderTotal_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e, PXFieldSelecting del)
        {
            del?.Invoke(sender, e);
            if (e.Row == null)
                return;

            string warning = PXUIFieldAttribute.GetWarning<POOrder.orderQty>(sender, e.Row);

            if (!string.IsNullOrEmpty(warning)
                && warning.Contains(PX.Objects.PM.Messages.BudgetControlDocumentWarning))
            {
                IsBudgetExceeded = true;
            }
            else
            {
                IsBudgetExceeded = false;
            }
        }

        private bool IsAllocationTaskInProgress()
        {
            bool isAllocationTaskPrgress;
            var projectId = Base.Document.Current.ProjectID;
            PXTrace.WriteInformation("projectId:" + projectId);
            PXSelectBase<PMTask> selectTasks = new PXSelect<PMTask, Where<PMTask.projectID, Equal<Required<PMTask.projectID>>, And<PMTask.allocationID, IsNotNull>>>(Base);

            List<PMTask> tasks = new List<PMTask>();
            foreach (PMTask pmTask in selectTasks.Select(projectId))
            {
                tasks.Add(pmTask);
            }
            isAllocationTaskPrgress = tasks.Where(s => ApplicableAllocationRules.Contains(s.AllocationID.ToUpper())).Any();
            return isAllocationTaskPrgress;
        }

        private bool CheckBudgetisExceeded()
        {
            return IsBudgetExceeded;
        }

 

0 replies

Be the first to reply!

Reply


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings