扩展Generic Inquiry显示记录数及通过PXGenericInqGrph高效获数咨询
如何在Acumatica Generic Inquiry中高效获取并显示记录总数?
绝对可以!不管是要在Generic Inquiry界面上直接显示记录总数,还是通过代码用PXGenericInqGrph高效获取这个数字,都有性能友好的解决方案——核心就是让数据库来做计数,而不是把所有记录拉到应用层再统计,这完全符合你的性能要求。下面分两种场景详细说明:
一、扩展Generic Inquiry界面显示记录总数
方法1:在GI设计器中添加聚合计数字段(最简便)
打开你的Generic Inquiry设计器,在「结果字段」区域添加一个新字段:
- 选择聚合函数为
COUNT,目标字段可以选任意非空字段(比如表的主键) - 把这个字段的「总计」属性设为
True
这样GI在运行时会直接向数据库发送带COUNT(*)的查询,只返回总数,不会拉取所有记录。如果想让总数在界面更显眼(比如网格上方),可以定制GI的ASPX页面:添加一个标签和只读数字控件,绑定到这个计数字段,就能直观展示了。
方法2:定制GI页面逻辑(更灵活)
如果需要更个性化的显示(比如结合筛选条件动态更新总数),可以创建一个继承PXGenericInqGrph的定制图,在RowSelected事件里执行数据库层面的COUNT查询,再把结果赋值给界面控件——注意绝对不要遍历所有记录来计数,始终让数据库完成统计工作。
二、用PXGenericInqGrph高效获取GI的记录数
如果是在代码中需要获取GI的记录数,绝对不要用Select().Count()(这会拉取所有记录到应用层),而是直接构建聚合查询让数据库计算:
示例代码1:复用GI的查询条件做计数
// 创建GI的图实例并加载指定查询 var giGraph = PXGraph.CreateInstance<PXGenericInqGrph>(); giGraph.InqName = "Your_GI_Name"; giGraph.LoadInquiry(); // 获取GI的主视图查询 var primaryQuery = giGraph.Views[giGraph.PrimaryViewName] as PXSelectBase; if (primaryQuery == null) return 0; // 构建聚合计数查询,复用GI的筛选条件 var countSelect = new PXSelectAggregate< Aggregate<Count<YourDAC.PKField>>, Where<YourDAC.PKField, IsNotNull>>(); // 注:这里可以直接复用GI原始查询中的Where条件,确保计数和GI的筛选逻辑一致 // 执行查询获取总数 var countResult = countSelect.Select(giGraph).FirstOrDefault(); int totalRecords = countResult != null ? (int)countResult[0] : 0;
示例代码2:直接生成COUNT SQL(更高效)
如果想更直接,可以提取GI的基础查询,包装成COUNT子查询:
var giGraph = PXGraph.CreateInstance<PXGenericInqGrph>(); giGraph.InqName = "Your_GI_Name"; giGraph.LoadInquiry(); // 获取GI的原始SQL查询 var baseQuery = giGraph.GetSelectQuery(); // 构建COUNT查询,让数据库直接统计子查询结果的数量 var countSql = $"SELECT COUNT(*) FROM ({baseQuery}) AS SubQuery"; // 执行SQL获取结果 using (var cmd = new PXCommand(giGraph, countSql)) { var scalarResult = cmd.ExecuteScalar(); int totalRecords = scalarResult != DBNull.Value ? Convert.ToInt32(scalarResult) : 0; }
关键性能提示
不管用哪种方法,核心都是让数据库执行COUNT操作,避免将所有记录加载到应用内存中再计数——这能极大减少数据库传输和应用层的资源消耗,完全满足你的性能要求。
内容的提问来源于stack exchange,提问作者Joseph Caruana
相关产品推荐
相关产品推荐

