我们将在页面上已定义网格的行中添加一个使用站点ID和库存ID的自定义屏幕。我们希望添加库存可用性详细信息,如SO301000(销售订单输入图)所示。
A)如何访问网格的状态区域以放置文本。 B)是否有我可以访问SO301000上使用的文本的标准方法。
答案 0 :(得分:1)
该功能称为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);
}
我建议跳过使用LSSOLine并仅复制它的FieldSelecting方法。
该方法在其他答案中有更详细的说明: https://stackoverflow.com/a/45034612/7376238