在Acumatica中,可以通过使用GroupBy和Aggregate函数来将BqlField值按组进行计数。以下是一个示例代码:
using PX.Data;
using System;
namespace PX.Objects.AP
{
public class APDocumentEnq_Extension : PXGraphExtension
{
public PXFilter CountByVendor;
public PXAction countByVendor;
[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Count by Vendor")]
protected virtual void CountByVendorProc()
{
CountByVendorResult result = PXSelectGroupBy>,
Where>>>
.Select(Base)
.FirstOrDefault();
CountByVendor.Cache.Clear();
CountByVendor.Cache.Insert(result);
}
[Serializable]
public class CountByVendorResult : IBqlTable
{
#region DocType
public abstract class docType : PX.Data.IBqlField
{
}
protected String _DocType;
[PXDBString(3, IsFixed = true, IsKey = true)]
[PXUIField(DisplayName = "Document Type")]
public virtual String DocType
{
get
{
return this._DocType;
}
set
{
this._DocType = value;
}
}
#endregion
#region DocCount
public abstract class docCount : PX.Data.IBqlField
{
}
protected Int32? _DocCount;
[PXDBInt]
[PXUIField(DisplayName = "Document Count")]
public virtual Int32? DocCount
{
get
{
return this._DocCount;
}
set
{
this._DocCount = value;
}
}
#endregion
}
}
}
在这个示例中,我们创建了一个自定义的图形扩展类APDocumentEnq_Extension,并在其中添加了一个用于计算按供应商计数的按钮和相关的处理方法。
在计数处理方法CountByVendorProc中,我们使用PXSelectGroupBy语句从APInvoice表中选择文档类型(docType)字段并进行计数。该查询使用了Where子句来限制供应商ID等于当前文档筛选器中的供应商ID。
然后,我们将结果插入到CountByVendor结果集中,并将其显示在屏幕上。
请注意,CountByVendorResult类是一个表示计数结果的嵌套类。它包含了文档类型(docType)和文档计数(docCount)两个字段。这些字段需要被定义为公共的,以便在查询中访问。
要在屏幕上显示计数结果,您需要在页面上添加一个相关的过滤器字段,并将其与CountByVendor结果集关联起来。您还需要在页面上添加一个按钮,并将其与CountByVendorProc方法关联起来。
请注意,在CountByVendorProc方法和CountByVendorResult类中,我们使用了PXDBString和PXDBInt属性来定义字段的数据库类型。这些属性在数据库中创建相应的存储字段,并确保数据正确地存储和检索。
希望这个示例能够帮助您在Acumatica项目中按组获取计数。