Acumatica 如何将库存可用性状态添加到自定义网格(如SO301000)
我们正在添加一个自定义屏幕,该屏幕利用页面上定义的网格行中的站点ID和库存ID。我们希望添加库存可用性详细信息,如SO301000销售订单条目图所示 A如何访问网格的状态区域以放置文本。 B对于SO301000上使用的文本,是否有一个标准方法可供访问。该功能称为StatusField 您可以在网格ASPX控件上定义状态字段:Acumatica 如何将库存可用性状态添加到自定义网格(如SO301000),acumatica,Acumatica,我们正在添加一个自定义屏幕,该屏幕利用页面上定义的网格行中的站点ID和库存ID。我们希望添加库存可用性详细信息,如SO301000销售订单条目图所示 A如何访问网格的状态区域以放置文本。 B对于SO301000上使用的文本,是否有一个标准方法可供访问。该功能称为StatusField 您可以在网格ASPX控件上定义状态字段: <px:PXGrid ID="grid" runat="server" DataSourceID="ds" StatusField="Availability">
<px:PXGrid ID="grid" runat="server" DataSourceID="ds" StatusField="Availability">
Sales order(销售订单)屏幕将其与allocation custom data view(分配自定义数据视图)混为一谈,这使得其难以重复使用:
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,只复制它的fieldselection方法
该方法在另一个答案中有更详细的记录:
在我的用例中,尝试重用LSSOLine似乎是一个相当具有挑战性的问题。如果可以在标准代码中修改可用性以允许类似字符串availability=GetAvailabilityint这样的内容,那就太好了?目录ID,int?子项ID,int?siteID,SOLine sOLinel,这样我们就可以进行标准调用,并可以在SOLine与null相关时选择性地传递SOLine。null只是获取当前可用性。但现在,我将使用您指向Brendan发布的代码示例作为基础,并尝试合并您的文章中所示的数据/格式以保持一致性。再次感谢!
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);
}