Acumatica предупреждающее сообщение влияет только на экран отгрузки SO302000 - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь отображать предупреждение каждый раз, когда поле ShippedQty изменяется на значение

Я добавил приведенный ниже код, чтобы расширить граф SOShipmentEntry, который выполняет мою первоначальную цель, но проблема в том, что теперь добавленный код также используется действием «Создать отгрузку» в «Заказах на продажу - SO301000»"screen / form.

Обсудить действие создания отгрузки

namespace PX.Objects.SO
{
  public class SOShipmentEntry_Extension : PXGraphExtension<SOShipmentEntry>
{
  #region Event Handlers

  protected void SOShipLine_ShippedQty_FieldUpdated(PXCache cache,PXFieldUpdatedEventArgs e)
{


         var myrow = (SOShipLine)e.Row;
            if (myrow == null) return;


                if (myrow.ShippedQty >= myrow.OrigOrderQty)
                {

                }
            else
            {
                throw new PXSetPropertyException("The difference between the shipped-qty and the ordered-qty will be placed on a back-order", PXErrorLevel.Warning);
            }  

}


  #endregion
 }
}

В то время как предупреждение позволяет пользователю сохранять изменения в отгрузке на экране отгрузки / форма SO302000 (Поскольку исключение настроено как предупреждение, а не ошибка), я получаю следующую ошибку при создании отправки с помощью кнопки «Создать отгрузку» на экране «Заказы на продажу - SO301000».

Предупреждение работает нормально для режима формы

Предупреждение становится ошибкой при обработке в фоновом режиме с помощью кнопки действия

Любые идеи длявыполнить это?Насколько я понимаю, если я хочу внести глобальные изменения в поле, я должен внести их в ЦАП, но если я хочу внести изменения, которые влияют только на экраны / формы, где используется график, то я должен внести эти изменения всам код графика.Я предполагаю, что кнопка действия «Создать отгрузку» на экране «Заказы на продажу» создает экземпляр графика, в который я добавил код, поэтому мне интересно, каковы мои варианты здесь.

С уважением,

- Acumatica новичок

1 Ответ

0 голосов
/ 14 сентября 2018

Если вы хотите, чтобы логика событий выполнялась только при вызове CreateShipment с экрана «Отгрузка», вы можете переопределить другие вызовы CreateShipment для динамического удаления вашего обработчика событий.

Событие, которое вызывает действие CreateShipment из SalesOrderEntrygraph is Action:

public PXAction<SOOrder> action;
[PXUIField(DisplayName = "Actions", MapEnableRights = PXCacheRights.Select)]
[PXButton]
protected virtual IEnumerable Action(PXAdapter adapter,
    [PXInt]
    [PXIntList(new int[] { 1, 2, 3, 4, 5 }, new string[] { "Create Shipment", "Apply Assignment Rules", "Create Invoice", "Post Invoice to IN", "Create Purchase Order" })]
    int? actionID,
    [PXDate]
    DateTime? shipDate,
    [PXSelector(typeof(INSite.siteCD))]
    string siteCD,
    [SOOperation.List]
    string operation,
    [PXString()]
    string ActionName
    )

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

SOShipmentEntry docgraph = PXGraph.CreateInstance<SOShipmentEntry>();

// >> Remove event handler
SOShipmentEntry_Extension docgraphExt = docgraph.GetExtension<SOShipmentEntry_Extension>();
docgraph.FieldUpdated.RemoveHandler<SOShipLine.shippedQuantity>(docgrapExt.SOShipLine_ShippedQty_FieldUpdated);
// << Remove event handler

docgraph.CreateShipment(order, SiteID, filter.ShipDate, adapter.MassProcess, operation, created);

Обратите внимание, что для ссылки на метод SOShipLine_ShippedQty_FieldUpdated из другого графа вам нужно сделать его общедоступным:

public void SOShipLine_ShippedQty_FieldUpdated(PXCache cache,PXFieldUpdatedEventArgs e)

Я также описал, как это сделать в этом ответе: Обновление настраиваемого поля заканчивается бесконечным циклом


Если вы хотите, чтобы логика событий выполнялась только при ее изменении впользовательский интерфейс или веб-служба.

Вы можете использовать логическое свойство ExternalCall параметра PXFieldUpdatedEventArgs.Это значение свойства будет истинно, только если поле отправителя изменяется в пользовательском интерфейсе или веб-службой.

Пример использования:

protected void SOShipLine_ShippedQty_FieldUpdated(PXCache cache,PXFieldUpdatedEventArgs e)
{
   // If ShippedQty was updated in the UI or by a web service call
   if (e.ExternalCall)
   {
      // The logic here won't be executed when CreateShipment is invoked
   }
}

Свойство ExternalCall (PXFieldUpdatedEventArgs)

Получает значение, указывающее, было ли изменено новое значение текущего поля ЦАП в пользовательском интерфейсе или через API веб-службы.

...