【问题标题】:How to display product availability in Opportunity Products Grid footer?如何在机会产品网格页脚中显示产品可用性?
【发布时间】:2017-12-14 23:37:06
【问题描述】:

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

如何在机会产品网格中做同样的事情? 更重要的是,你如何强制它显示在页脚 而不是一个简单的网格列?有这样的属性吗?

感谢您的回复。

【问题讨论】:

  • 机会产品网格?这个网格在哪里?哪个条目?
  • 组织 > 客户管理 > 工作区 > 输入 > 机会(单击现有/开始新以打开页面 CR304000)> 产品选项卡

标签: acumatica


【解决方案1】:

如果我们与销售订单进行比较,销售订单行在Availabilty_FieldSelecting 期间从 LSSOLine 获取其值。页面上的接线通过StatusField="Availability" 在选项卡上。我们可以通过添加一个未绑定的扩展字段然后在字段中选择填充值来做类似的事情。另一种方法是实现一个LSCROpportunityProducts 类,该类继承LSSelect,类似于LSSoLine(更好的首选解决方案)。为了保持简单并专注于让字段显示文本,我将使用一个扩展字段和一个在扩展图表中选择的简单字段来寻找机会。

(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
}

(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">

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

编辑Current&lt;&gt; 的使用并不总是在 UI 中包含正确的当前突出显示的行。根据PXFieldSelectingEventArgs.Row切换到Required&lt;&gt;,结果对于产品标签中的多行都是正确的。

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()}";
    }
}

结果:

【讨论】:

  • 感谢您的详细示例 Brendan。我在 _FieldSelecting 事件中复制了您的代码。现在它在网格页脚中显示了一些东西。但是,如果产品不止一种。值不变。您认为 locationStatus 选择中可能存在某些内容?
  • 是的,在 FieldSelecting 的 BQL 中使用 Current 似乎并不总是正确的。我将更新答案,因为它适用于多行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2020-01-25
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多