Я создаю отгрузку типа «Перенос» на настраиваемом экране, используя приведенный ниже код, отгрузка создается успешно, но статус на экране «Заказ на продажу» не обновляется, а также не позволяет мне снова создавать отгрузку с экрана «Заказ на продажу», потому что он уже имеет открытая отгрузка.
Статус обновляется, когда я подтверждаю отправку.
soShipmentGraph.CreateShipment(soOrderGraph.Document.Current, graph.Document.Current.SiteID, graph.Document.Current.ShipDate, false, SOOperation.Issue, created);
Статус обновляется ближе к концу метода CreateShipment на основе значения поля SOOrder.UpdateShipmentCntr, если во время создания отправки не было сгенерировано исключение:
if (order.OpenShipmentCntr > 0)
{
order.Status = SOOrderStatus.Shipping;
order.Hold = false;
soorder.Update(order);
}
Поле OpenShipmentCntr обновляется методом SOShipmentEntry.UpdateShipmentCntr:
protected virtual void UpdateShipmentCntr(PXCache sender, object Row, short? Counter)
{
SOOrder order = (SOOrder)PXParentAttribute.SelectParent(sender, Row, typeof(SOOrder));
if (order != null)
{
order.ShipmentDeleted = (Counter == -1) ? true : (bool?)null;
order.ShipmentCntr += Counter;
if (((SOOrderShipment)Row).Confirmed == false)
{
order.OpenShipmentCntr += Counter;
}
soorder.Cache.SetStatus(order, PXEntryStatus.Updated);
}
}
При создании отгрузки SOShipmentEntry должна вставить запись SOOrderShipment, которая связывает SOOrder (заказ на продажу) с записями SOShipment (отгрузка). SOOrderShipment должен быть виден на вкладке «Заказы» для отправки:
После вставки записи SOOrderShipment возникает событие SOOrderShipment RowInserted в SOShipmentEntry:
protected virtual void SOOrderShipment_RowInserted(PXCache sender, PXRowInsertedEventArgs e)
{
UpdateShipmentCntr(sender, e.Row, (short)1);
}
Я не смог определить причину, по которой статус не изменится, поэтому предлагаю отладить шаги, ведущие к изменению статуса заказа на продажу.
Спасибо HB_Acumatica, это решило мою проблему. если (order.OpenShipmentCntr> 0) {order.Status = SOOrderStatus.Shipping; order.Hold = false; soorder.Update (заказ); }