Функция называется StatusField
.
Вы определяете поле состояния в сетке управления ASPX:
<px:PXGrid ID="grid" runat="server" DataSourceID="ds" StatusField="Availability">
Это может быть установлено с событием FieldSelecting:
public void SOLine_Availability_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
Экран заказа клиента объединяет его спредставление пользовательских данных выделения, которое затрудняет повторное использование:
public LSSOLine lsselect;
В LSSOLine
классе вы найдете метод Availability_FieldSelecting, который вычисляет значение:
public override void Availability_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
{
var fetchMode = ((SOLine) e.Row)?.Completed == true
? AvailabilityFetchMode.None
: AvailabilityFetchMode.ExcludeCurrent;
IQtyAllocated availability = AvailabilityFetch(sender, (SOLine)e.Row, fetchMode | AvailabilityFetchMode.TryOptimize);
if (availability != null)
{
PXResult<InventoryItem, INLotSerClass> item = ReadInventoryItem(sender, ((SOLine)e.Row).InventoryID);
decimal unitRate = INUnitAttribute.ConvertFromBase<SOLine.inventoryID, SOLine.uOM>(sender, e.Row, 1m, INPrecision.NOROUND);
availability.QtyOnHand = PXDBQuantityAttribute.Round((decimal)availability.QtyOnHand * unitRate);
availability.QtyAvail = PXDBQuantityAttribute.Round((decimal)availability.QtyAvail * unitRate);
availability.QtyNotAvail = PXDBQuantityAttribute.Round((decimal)availability.QtyNotAvail * unitRate);
availability.QtyHardAvail = PXDBQuantityAttribute.Round((decimal)availability.QtyHardAvail * unitRate);
if(IsAllocationEntryEnabled)
{
Decimal? allocated = PXDBQuantityAttribute.Round((decimal)(((SOLine)e.Row).LineQtyHardAvail ?? 0m) * unitRate); ;
e.ReturnValue = PXMessages.LocalizeFormatNoPrefix(Messages.Availability_AllocatedInfo,
sender.GetValue<SOLine.uOM>(e.Row), FormatQty(availability.QtyOnHand), FormatQty(availability.QtyAvail), FormatQty(availability.QtyHardAvail), FormatQty(allocated));
}
else
e.ReturnValue = PXMessages.LocalizeFormatNoPrefix(Messages.Availability_Info,
sender.GetValue<SOLine.uOM>(e.Row), FormatQty(availability.QtyOnHand), FormatQty(availability.QtyAvail), FormatQty(availability.QtyHardAvail));
AvailabilityCheck(sender, (SOLine)e.Row, availability);
}
else
{
//handle missing UOM
INUnitAttribute.ConvertFromBase<SOLine.inventoryID, SOLine.uOM>(sender, e.Row, 0m, INPrecision.QUANTITY);
e.ReturnValue = string.Empty;
}
base.Availability_FieldSelecting(sender, e);
}
Iпосоветовал бы пропустить использование LSSOLine и просто скопировать его метод FieldSelecting.
Этот подход более подробно описан в следующем ответе: https://stackoverflow.com/a/45034612/7376238