Acumatica - Проверка полей в OrderQty - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь установить предупреждение в поле OrderQty, когда выбрана определенная UOM. У нас есть UOM, который имеет только кратные 50 числа, поэтому это должно означать, что количество должно быть кратно 50. Я хотел бы отобразить предупреждение, если пользователь ввел, скажем, 40, тогда он сказал бы, что это должно быть введено кратный 50. Мой код компилируется нормально, он просто не выдает предупреждение при вводе значения, которое должно вызвать исключение.

График ввода SOOrder:

protected void SOLine_OrderQty_FieldVerifying(PXCache cache, PXFieldVerifyingEventArgs e)
    {

      var row = (SOLine)e.Row;

      if (row == null) return;

      SOLine line = Base.Transactions.Current;

      if (line.UOM != "CCP") return;
      if (line.UOM == "CCP")
        {
          if (line.OrderQty % 50 == 0) return;
          else
            {
              throw new PXSetPropertyException("Please enter a value in multiples of 50.", PXErrorLevel.Warning);
            }
        }

    }

Я также пробовал:

protected void SOLine_OrderQty_FieldVerifying(PXCache cache, PXFieldVerifyingEventArgs e)
    {

      var row = (SOLine)e.Row;

      if (row == null) return;

      if (row.UOM != "CCP") return;
      if (row.UOM == "CCP")
        {
          if (row.OrderQty % 50 == 0) return;
          else
            {
              throw new PXSetPropertyException("Please enter a value in multiples of 50.", PXErrorLevel.Warning);
            }
        }

    }

CCP - это UOM, в котором кол-во должно быть кратно 50, и никакая другая UOM не должна выдавать предупреждение, если оно не установлено.

Обновление 1: Обновил код до этого:

 protected void SOLine_OrderQty_FieldVerifying(PXCache cache, PXFieldVerifyingEventArgs e)
    {

      var row = (SOLine)e.Row;

      if (row == null) return;

      if (row.UOM != "CCP") return;
      if (row.UOM == "CCP")
        {

          if ((decimal?)e.NewValue % 50 == 0) return;
          if ((decimal?) e.NewValue % 50 != 0)
    {
        cache.RaiseExceptionHandling<SOLine.orderQty>(e.Row, ((SOLine)e.Row).OrderQty,
            new PXSetPropertyException("Please enter a value in multiples of 50.", PXErrorLevel.Warning));
    }
        }

    }

Я перешел в состояние e.NewValue для введенного значения. Предупреждающее сообщение все еще не выдано.

1 Ответ

0 голосов
/ 27 июня 2018

Вы должны смотреть на PXFieldVerifyingEventArgs NewValue (e.NewValue), чтобы увидеть, что является новым введенным значением.

Пример: (decimal?)e.NewValue % 50 == 0

Когда вы используете строку OrderQty, вы просматриваете значение до того, как пользователь ввел новое значение. Чтобы получить новое значение, введенное пользователем, вам нужно посмотреть на NewValue для любого события проверки поля.

График SOOrderEntry имеет пример его использования в OrderQty:

protected virtual void SOLine_OrderQty_FieldVerifying(PXCache sender, PXFieldVerifyingEventArgs e)
{
    if ((decimal?)e.NewValue < ((SOLine)e.Row).ClosedQty && ((SOLine)e.Row).RequireShipping == true && (((SOLine)e.Row).LineType == "GI" || ((SOLine)e.Row).LineType == "GN"))
    {
        throw new PXSetPropertyException(CS.Messages.Entry_GE, sender.GetStateExt<SOLine.closedQty>(e.Row));
    }
}

Из-за сгенерированного исключения будет отображаться предупреждение, но также отменяется введенное пользователем значение. Поскольку вы запрашиваете предупреждение, я предполагаю, что вы хотите разрешить пользователю вводить не кол-во лотов в 50 (и сохранить введенное значение).

В этом примере отображается предупреждение без отмены введенного пользователем значения:

protected void SOLine_OrderQty_FieldVerifying(PXCache cache, PXFieldVerifyingEventArgs e, PXFieldVerifying del)
{
    if ((decimal?) e.NewValue % 50 != 0)
    {
        cache.RaiseExceptionHandling<SOLine.orderQty>(e.Row, ((SOLine)e.Row).OrderQty,
            new PXSetPropertyException("Please enter a value in multiples of 50.", PXErrorLevel.Warning));
    }

    if (del != null)
    {
        del(cache, e);
    }
}
...