Если вы хотите, чтобы логика событий выполнялась только при вызове 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 веб-службы.