Acumatica: не удается очистить PropertyException от сетки данных - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть сетка данных, которую можно редактировать, и пользователь может добавить запись. Пользователь может редактировать только одно свойство - тип записи и все остальные свойства - код устанавливает. Мне нужно предотвратить дублирование и выбросить исключение свойства, но я не могу удалить эту ошибку впоследствии. Моя проверка поднята в выбранной строке:

 public virtual void MPEmployeeTerminationItem_RowSelected(PXCache cache, PXRowSelectedEventArgs e)

Метод проверки:

  private bool ValidateDuplication(PXCache cache, MPEmployeeTerminationOtherItem row, int validNumberOfRecords)
    {
        bool isValid = OtherTerminationPayments.Select().FirstTableItems.Count(r => r.PaymentType == row.PaymentType) <= validNumberOfRecords && this.IsValidWeeklySalary;
        if (!isValid)
        {

            cache.RaiseExceptionHandling(typeof(MPEmployeeTerminationOtherItem.paymentType).Name, row, row.PaymentType, 
                new PXSetPropertyException(PXMessages.LocalizeFormat($"Duplication payment type ({row.PaymentType}) is not allowed.")) );
        }
        else
        {
            foreach (var item in OtherTerminationPayments.Select().FirstTableItems)
            {
                cache.RaiseExceptionHandling(typeof(MPEmployeeTerminationOtherItem.paymentType).Name, item, item.PaymentType, null);
            }
        }

        Save.SetEnabled(isValid);
        SaveClose.SetEnabled(isValid);

        return isValid;
    }

Проверка происходит enter image description here

I может очистить проверку, когда я изменяю тип второй записи: enter image description here Но она не очищает проверку, когда я изменяю тип записи для первой записи: enter image description here Отладка показывает, что запись действительна, и строка, которая должна устранить ошибку:

 cache.RaiseExceptionHandling(typeof(MPEmployeeTerminationOtherItem.paymentType).Name, item, item.PaymentType, null);

запускается последней, однако проверка по-прежнему выглядит так, как на скриншоте :: enter image description here Может быть, мне нужно запустить проверку в другом обработчике событий, или мой код проверки неверен?

Предложение с

PXUIFieldAttribute.SetError<MPEmployeeTerminationOtherItem.paymentType>(cache, sameRow, isError ? "Error message" : null);

Мой код:

 public virtual void MPEmployeeTerminationOtherItem_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
    {
        var row = e.Row as MPEmployeeTerminationOtherItem;
        if (row == null) return;
        HandleOtherTerminationItemRowFields(cache, row);
        PXUIFieldAttribute.SetEnabled<MPEmployeeTerminationOtherItem.overrideAmount>(cache, row, row.IsOverride == true);

        bool isNotDuplicated = ValidateDuplicationOtherTermination(row);
        bool isPaymentTypeValid = ValidateOtherPaymentPaymentType(row);

        PXUIFieldAttribute.SetError<MPEmployeeTerminationOtherItem.paymentType>(cache, row, isNotDuplicated && isPaymentTypeValid ?
            null : "Duplicated or empty Payment Type is not allowed.");
        Save.SetEnabled(isNotDuplicated && isPaymentTypeValid);
        SaveClose.SetEnabled(isNotDuplicated && isPaymentTypeValid);
    }

Не действительно работает, потому что эта ошибка проверки удаляет значение из Типа платежа следующим образом:

enter image description here, тогда как отладчик показывает мне значение Типа платежа как предыдущее. В результате у меня есть исключение проверки: enter image description here Тип платежа не установлен через интерфейс, но он существует в кеше. Можем ли мы предотвратить сброс этого типа платежа во время проверки?

Буду признателен за любую помощь или совет.

Ответы [ 2 ]

1 голос
/ 11 февраля 2020

Я нашел решение: все в порядке в выбранной строке :

 public virtual void MPEmployeeTerminationOtherItem_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
    {
        var row = e.Row as MPEmployeeTerminationOtherItem;
        if (row == null) return;
        ValidateTerminationOtherPayments(cache, row);
    }  

Но мы должны уведомить платформу о необходимости запуска и обновить проверку для ВСЕХ записей:

  public virtual void MPEmployeeTerminationOtherItem_PaymentType_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
    {
        var row = e.Row as MPEmployeeTerminationOtherItem;
        if (row.IsNull()) return;

        OtherTerminationPayments.View.RequestRefresh();//this line needs to check validation for all MPEmployeeTerminationOtherItems and update status of PaymentType if it is valid or not

    }

Следует обновить каркас также после удаления:

protected virtual void MPEmployeeTerminationOtherItem_RowDeleted(PXCache cache, PXRowDeletedEventArgs e)
    {
        var row = e.Row as MPEmployeeTerminationOtherItem;
        if (row.IsNull()) return;
        OtherTerminationPayments.View.RequestRefresh();//this line needs to check validation for all MPEmployeeTerminationOtherItems and update status of PaymentType if it is valid or not
    }

Вот в чем дело!

0 голосов
/ 10 февраля 2020

Шаблон выглядит хорошо, но при чтении кода не ясно, что ошибка очищается на том же объекте. Я бы порекомендовал рефакторинг этого метода, чтобы убедиться, что ошибка очищена на том же объекте, который был установлен.

bool isError = [condition];
MPEmployeeTerminationOtherItem sameRow = [make sure you call clear on the same object];

PXUIFieldAttribute.SetError<MPEmployeeTerminationOtherItem.paymentType>(cache, sameRow, isError ? "Error message" : null);
...