【发布时间】:2017-12-14 23:37:06
【问题描述】:
【问题讨论】:
-
机会产品网格?这个网格在哪里?哪个条目?
-
组织 > 客户管理 > 工作区 > 输入 > 机会(单击现有/开始新以打开页面 CR304000)> 产品选项卡
标签: acumatica
【问题讨论】:
标签: acumatica
如果我们与销售订单进行比较,销售订单行在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<> 的使用并不总是在 UI 中包含正确的当前突出显示的行。根据PXFieldSelectingEventArgs.Row切换到Required<>,结果对于产品标签中的多行都是正确的。
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()}";
}
}
结果:
【讨论】: