BAQ 简介
BAQ(Business Activity Query)是 Epicor ERP 中最常用的数据查询工具。它提供了一个可视化的查询设计器,无需编写 SQL 即可从 ERP 数据库中提取和分析数据。BAQ 的查询结果可以用于:
- 仪表板(Dashboard)数据源
- 报表的数据基础
- 快速追踪(Quick Search)条件筛选
- 其他 BAQ 的子查询(Sub Query)
- BPM 中的数据条件判断
BAQ 设计器核心概念
1. 顶层查询(Top-Level Query)
每个 BAQ 至少有一个顶层查询,包含以下元素:
- 表(Tables):定义数据来源,支持 Erp 表和自定义表
- 字段(Calculated Fields):可从表字段中选取,也可创建计算字段
- 条件(Criteria):筛选数据行的过滤条件
- 排序(Sorting):结果排序方式
2. 子查询(Sub Query)
子查询可以理解为一个独立的查询结果集,它本身不直接输出字段,而是作为父查询中某一行的聚合数据。典型用法是处理一对多关系,例如在订单头查询中嵌入订单行明细的小计。
3. 计算字段(Calculated Fields)
BAQ 支持丰富的内置函数来创建计算字段:
-- 字符串函数
SUBSTRING(Part.PartNum, 1, 3)
UPPER(Customer.Name)
-- 数学函数
ROUND(OrderDtl.LineAmt * (1 - OrderDtl.DiscountPercent / 100), 2)
-- 日期函数
DATEDIFF(day, OrderHd.OrderDate, OrderHd.RequestDate)
-- 条件表达式
CASE WHEN OrderHd.DocUnitPrice > 10000 THEN '高值' ELSE '普通' END
实战:未交货订单分析查询
需求:查询所有未完全交货的销售订单,包含订单号、客户名、订单日期、总金额、已交金额、未交金额。
表关系设计
OrderHed (主表)
├── 内连接 Customer (客户信息)
├── 内连接 OrderDtl (订单行)
│ └── 子查询: 已交数量聚合
└── 子查询: 订单金额汇总
关键计算字段
-- 订单总金额
SUM(OrderDtl.OrderQty * OrderDtl.DocUnitPrice)
-- 已交金额
SUM(OrderDtl.OurJobShippedQty * OrderDtl.DocUnitPrice)
-- 未交金额
SUM(OrderDtl.OrderQty * OrderDtl.DocUnitPrice)
- SUM(OrderDtl.OurJobShippedQty * OrderDtl.DocUnitPrice)
-- 交货完成率
ROUND(SUM(OrderDtl.OurJobShippedQty) * 100.0
/ NULLIF(SUM(OrderDtl.OrderQty), 0), 1)
BAQ 中使用子查询聚合数据时,注意 Group By 设置。如果父查询选了非聚合字段,这些字段都必须出现在 Group By 列表中,否则会报错。
性能优化建议
- 限制返回行数:在 Criteria 中设置合理的日期范围和状态筛选,避免全表扫描
- 避免过度使用子查询:每增加一个子查询都会产生一次额外的数据库查询,3层以上嵌套建议改用直接 SQL
- 善用索引字段:条件筛选尽量使用有索引的字段(如 Company、OrderNum、PartNum)
- 定期检查慢查询:使用 SQL Server Profiler 或 Epicor 的查询日志监控 BAQ 执行耗时
- 考虑使用 Updatable BAQ:如果查询结果需要编辑,使用可更新 BAQ 代替单独的维护界面
通过 REST API 调用 BAQ
Epicor REST API 支持直接执行 BAQ 并返回 JSON 格式的结果:
GET https://{server}/{instance}/api/v1/odata/{company}/BaqSvc/{BAQ_ID}
Authorization: Bearer {access_token}
// 示例:执行"未交货订单分析"BAQ
GET /api/v1/odata/EPIC06/BaqSvc/OpenOrderAnalysis
?$filter=OpenAmt gt 50000
&$orderby=OpenAmt desc
&$top=50
这为前端应用(如自定义仪表板、小程序集成)提供了灵活的数据获取方式。
总结
BAQ 是 Epicor ERP 中效率最高的数据查询手段。掌握 BAQ 设计器的使用、计算字段编写、子查询设计以及性能优化技巧,可以显著提升数据分析和报表开发的效率。后续文章中会介绍 BAQ 与 Dashboard 的联动使用方法。