-->

How to call SetPropertyException from another even

2019-06-04 07:57发布

问题:

Below is my code to insert whatever value is entered into my UsrWLAmt field into my BudgetGrid representing the history of the fields values.

I want to raise a warning prompting the user to enter a value into the details field in the BudgetGrid History

protected void PMProject_UsrWLAmt_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
{
  if(InvokeBaseHandler != null)
    InvokeBaseHandler(cache, e);
  var row = (PMProject)e.Row;
        PMProject con = Base.Project.Current;
        PX.Objects.PM.ProjectExt item = con.GetExtension<PX.Objects.PM.ProjectExt>();
        if (item.UsrWLAmt > 0)
        {
            atcBudgetHis bud = new atcBudgetHis();
            bud.CreatedDateTime = DateTime.Now;
            bud.Value = item.UsrWLAmt;
            BudgetGrid.Insert(bud);
            // to attach the exception object to the field
            BudgetGrid.View.Cache.RaiseExceptionHandling<atcBudgetHis.details>(
            bud, " ",
            new PXSetPropertyException(
            "Please specifiy reason for budget change.",
            PXErrorLevel.Warning));

        }
    }

I've also tried BudgetGrid.Cahce.RaiseExceptionHandling

The code above doesn't raise any trace errors.

EDIT:

PXUIFieldAttribute.SetWarning<atcBudgetHis.details>(BudgetGrid.Cache, null, "Please specifiy reason for budget change.");

Works for all rows but

PXUIFieldAttribute.SetWarning<atcBudgetHis.details>(BudgetGrid.Cache, bud, "Please specifiy reason for budget change.");

Doesn't raise any warnings.

I could create another field above the grid for the notes to be inserted, but is there a way I can set the warning for the last row in the BudgetGird?

回答1:

It seems like you tried to set a warning on a DAC instance that didn't exists in the grid at the moment the event was called.

Have you tried setting the warning on the existing row returned in the event handler parameter instead?

PXUIFieldAttribute.SetWarning<atcBudgetHis.details>(BudgetGrid.Cache, row, "Please specify reason for budget change.");

The warning applies to all rows that satisfy the condition that executes this line. If you want to display it for only the last row, you would have to manually check if the row received in the parameter is the same as the last row in your data view and only then execute the warning for that row.



回答2:

First things first, to show a warning in Acumatica one of the following events must be used:

  • FieldVerifying and throw PXSetPropertyException, when warning should appear only during the time user updates a record

  • RowUpdating with RaiseExceptionHandling method invoked on PXCache, if warning should appear on multiple fields only during the time user updates a record

  • RowSelected with RaiseExceptionHandling method invoked on PXCache, if warning should appear on multiple fields all the time until a user addresses the cause of warning

I guess for your particular scenario, RowSelected might work best to constantly show warnings for all empty cells within Notes column:

public void atcBudgetHis_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
    atcBudgetHis row = e.Row as atcBudgetHis;
    if (row == null) return;

    if (string.IsNullOrEmpty(row.Details))
    {
        sender.RaiseExceptionHandling<atcBudgetHis.details>(row, string.Empty,
            new PXSetPropertyException("Please specify reason for budget change.", PXErrorLevel.Warning));
    }
    else
    {
        sender.RaiseExceptionHandling<atcBudgetHis.details>(row, row.Details, null);
    }
}


回答3:

The solution was to use the RowInserted event for my grid and pass the row variable into SetWarning



回答4:

You need to change this code:

BudgetGrid.Insert(bud);
// to attach the exception object to the field
BudgetGrid.View.Cache.RaiseExceptionHandling<atcBudgetHis.details>(bud, " ",new PXSetPropertyException("Please specifiy reason for budget change.",PXErrorLevel.Warning));

To something like this:

bud = BudgetGrid.Insert(bud); //you need to get the "bud" which is in the cache
// to attach the exception object to the field
BudgetGrid.View.Cache.RaiseExceptionHandling<atcBudgetHis.details>(bud, " ",new PXSetPropertyException("Please specifiy reason for budget change.",PXErrorLevel.Warning));


标签: acumatica