如何将库存可用性状态添加到自定义网格(如SO301000)

时间:2019-03-19 20:16:04

标签: acumatica

我们将在页面上已定义网格的行中添加一个使用站点ID和库存ID的自定义屏幕。我们希望添加库存可用性详细信息,如SO301000(销售订单输入图)所示。

A)如何访问网格的状态区域以放置文本。 B)是否有我可以访问SO301000上使用的文本的标准方法。

1 个答案:

答案 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