如何在机会产品网格页脚中显示产品可用性?

Ric*_*ick 0 acumatica

在销售订单文档网格页脚中。它显示产品的可用性。

在此处输入图片说明

如何在机会产品网格中做同样的事情?更何况,您如何强制将其显示在页脚而不是简单的网格列?有这种属性吗?

感谢您的答复。

在此处输入图片说明

Bre*_*dan 6

如果我们与销售订单进行比较,则销售订单行在期间从LSSOLine获取其值Availabilty_FieldSelecting。页面上的连线是通过标签在选项卡上StatusField="Availability"。我们可以通过添加未绑定扩展字段,然后在字段中选择填充值来执行类似操作。一种替代方法是实现一个类似于(更好的首选解决方案)LSCROpportunityProducts继承的类。为了保持这种简单性并专注于仅使字段显示文本,我将使用扩展字段和在扩展图中选择的简单字段作为机会。LSSelectLSSoLine

(1)在dac扩展中,创建一个未绑定字段(MyAvailability是示例字段):

[PXTable(typeof(CROpportunityProducts.cROpportunityID), typeof(CROpportunityProducts.cROpportunityProductID), IsOptional = true)]
[Serializable]
public class CROpportunityProductsMyExtension : PXCacheExtension<CROpportunityProducts>
{
    #region MyAvailability
    public abstract class myAvailability : PX.Data.IBqlField
    {
    }
    protected string _MyAvailability;
    [PXString(IsUnicode = true)]
    [PXUIField(DisplayName = "Product Availability", Enabled = false)]
    public virtual string MyAvailability
    {
        get
        {
            return this._MyAvailability;
        }
        set
        {
            this._MyAvailability = value;
        }
    }
    #endregion
}
Run Code Online (Sandbox Code Playgroud)

(2)在机会产品选项卡上,通过设置属性将新字段连接为网格状态值StatusField。需要修改页面以添加此值,添加后的外观应类似于此(需要在项目中进行屏幕自定义->操作以编辑ASPX并找到ProductsGrid以粘贴到StatusField和值中)

<px:PXGrid ID="ProductsGrid" SkinID="Details" runat="server" Width="100%" 
Height="500px" DataSourceID="ds" ActionsPosition="Top" BorderWidth="0px" 
SyncPosition="true" StatusField="MyAvailability">
Run Code Online (Sandbox Code Playgroud)

(3)现在在图扩展中填充字段:

编辑:的使用Current<>并不总是在UI中包含正确的当前突出显示的行。已Required<>根据切换到,PXFieldSelectingEventArgs.Row并且产品标签中的多行结果正确。

public class CROpportunityMaintMyExtension : PXGraphExtension<OpportunityMaint>
{
    public virtual void CROpportunityProducts_MyAvailability_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
    {
        var row = (CROpportunityProducts) e.Row;
        if (row == null)
        {
            e.ReturnValue = string.Empty;
            return;
        }

        INLocationStatus locationStatus = PXSelectGroupBy<INLocationStatus,
            Where<INLocationStatus.inventoryID, Equal<Required<CROpportunityProducts.inventoryID>>,
                And2<Where<INLocationStatus.subItemID, Equal<Required<CROpportunityProducts.subItemID>>,
                        Or<Not<FeatureInstalled<PX.Objects.CS.FeaturesSet.subItem>>>>,
                    And<Where<INLocationStatus.siteID, Equal<Required<CROpportunityProducts.siteID>>,
                        Or<Required<CROpportunityProducts.siteID>, IsNull>>>>>,
            Aggregate<Sum<INLocationStatus.qtyOnHand, Sum<INLocationStatus.qtyAvail>>>
        >.Select(sender.Graph, row.InventoryID, row.SubItemID, row.SiteID, row.SiteID);

        // Need to convert to transaction UOM... (this is always base units)

        decimal? qtyOnHand = locationStatus?.QtyOnHand;
        decimal? qtyAvail = locationStatus?.QtyAvail;

        e.ReturnValue = $"Qty On hand = {qtyOnHand.GetValueOrDefault()} ; Qty Avail = {qtyAvail.GetValueOrDefault()}";
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明