Acumatica:是否可以以及如何自定义 AR521000 屏幕中的网格?
Acumatica : is it possible and how customize the grid in AR521000 screen?
首先,对不起我的英语!!!
我需要在屏幕 AR521000 中自定义网格 (DunningLetterList)。
在此网格中,我们有 BAccountid。在数据库中,每个 BAccountId(客户)默认选中一个(且只有一个)销售人员(CustomerMaint 中“销售人员”选项卡中的“默认”复选框)。
我需要在 DunningLetterList 中为出现在列表中的每个客户添加此默认销售员的姓名。
这可能吗,知道这是一个进程屏幕?如果可能的话,我该怎么做?
提前致谢!!
恐怕没有不影响性能的简单解决方案。那是因为网格中的行没有像往常一样插入缓存中,而是在数据视图委托中生成并添加 cache.Hold(row);
因此,我找到的唯一解决方案是在 RowSelected 上添加销售人员的姓名。
(!) 请注意,Acumatica 自定义最佳实践不推荐这样做(尽管您可能会在各处发现这种选择)。只是想让你知道,SQL 生成的查询是 SELECT TOP (1).
业务逻辑的定制:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using PX.Data;
using PX.Objects.CM;
using PX.Objects.CS;
using PX.Objects.GL;
using PX.SM;
using static PX.Objects.Common.Extensions.CollectionExtensions;
using PX.Objects;
using PX.Objects.AR;
using ARDunningLetterList = PX.Objects.AR.ARDunningLetterProcess.ARDunningLetterList;
namespace PX.Objects.AR
{
public class ARDunningLetterListSP : PXCacheExtension<ARDunningLetterList>
{
#region SalesPerson
public abstract class salesPerson : PX.Data.BQL.BqlString.Field<salesPerson> { }
[PXString(60)]
[PXUIField(DisplayName = "Sales Person")]
public virtual string SalesPerson { get; set; }
#endregion
}
public class ARDunningLetterProcess_Extension : PXGraphExtension<ARDunningLetterProcess>
{
public virtual void ARDunningLetterList_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
ARDunningLetterList row = e.Row as ARDunningLetterList ;
if (row == null) return;
SalesPerson sp = PXSelectJoin<SalesPerson,
InnerJoin<CustSalesPeople, On<SalesPerson.salesPersonID, Equal<CustSalesPeople.salesPersonID>>>,
Where<CustSalesPeople.bAccountID, Equal<Required<CustSalesPeople.bAccountID>>, And<CustSalesPeople.isDefault, Equal<True>>>>.SelectSingleBound(this.Base, null, row.BAccountID);
var rowExt = row.GetExtension<ARDunningLetterListSP>();
rowExt.SalesPerson = sp?.Descr;
}
}
}
然后在网格中添加自定义字段。
注意:我也尝试过其他解决方案(例如覆盖数据视图(添加连接表)、委托或使用属性来计算值,但我没有运气)。
我知道这并不容易!!
感谢您的回答和研究!!
完美运行!!
您知道为什么我无法过滤或排序此列吗?我添加了“AllowFilter”和“AllowSort”属性,但它不起作用。
首先,对不起我的英语!!!
我需要在屏幕 AR521000 中自定义网格 (DunningLetterList)。
在此网格中,我们有 BAccountid。在数据库中,每个 BAccountId(客户)默认选中一个(且只有一个)销售人员(CustomerMaint 中“销售人员”选项卡中的“默认”复选框)。
我需要在 DunningLetterList 中为出现在列表中的每个客户添加此默认销售员的姓名。
这可能吗,知道这是一个进程屏幕?如果可能的话,我该怎么做?
提前致谢!!
恐怕没有不影响性能的简单解决方案。那是因为网格中的行没有像往常一样插入缓存中,而是在数据视图委托中生成并添加 cache.Hold(row);
因此,我找到的唯一解决方案是在 RowSelected 上添加销售人员的姓名。 (!) 请注意,Acumatica 自定义最佳实践不推荐这样做(尽管您可能会在各处发现这种选择)。只是想让你知道,SQL 生成的查询是 SELECT TOP (1).
业务逻辑的定制:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using PX.Data;
using PX.Objects.CM;
using PX.Objects.CS;
using PX.Objects.GL;
using PX.SM;
using static PX.Objects.Common.Extensions.CollectionExtensions;
using PX.Objects;
using PX.Objects.AR;
using ARDunningLetterList = PX.Objects.AR.ARDunningLetterProcess.ARDunningLetterList;
namespace PX.Objects.AR
{
public class ARDunningLetterListSP : PXCacheExtension<ARDunningLetterList>
{
#region SalesPerson
public abstract class salesPerson : PX.Data.BQL.BqlString.Field<salesPerson> { }
[PXString(60)]
[PXUIField(DisplayName = "Sales Person")]
public virtual string SalesPerson { get; set; }
#endregion
}
public class ARDunningLetterProcess_Extension : PXGraphExtension<ARDunningLetterProcess>
{
public virtual void ARDunningLetterList_RowSelected(PXCache sender, PXRowSelectedEventArgs e)
{
ARDunningLetterList row = e.Row as ARDunningLetterList ;
if (row == null) return;
SalesPerson sp = PXSelectJoin<SalesPerson,
InnerJoin<CustSalesPeople, On<SalesPerson.salesPersonID, Equal<CustSalesPeople.salesPersonID>>>,
Where<CustSalesPeople.bAccountID, Equal<Required<CustSalesPeople.bAccountID>>, And<CustSalesPeople.isDefault, Equal<True>>>>.SelectSingleBound(this.Base, null, row.BAccountID);
var rowExt = row.GetExtension<ARDunningLetterListSP>();
rowExt.SalesPerson = sp?.Descr;
}
}
}
然后在网格中添加自定义字段。
注意:我也尝试过其他解决方案(例如覆盖数据视图(添加连接表)、委托或使用属性来计算值,但我没有运气)。
我知道这并不容易!! 感谢您的回答和研究!!
完美运行!!
您知道为什么我无法过滤或排序此列吗?我添加了“AllowFilter”和“AllowSort”属性,但它不起作用。