Epicor BAQ(业务活动查询)从入门到实践

← 返回首页

BAQ 简介

BAQ(Business Activity Query)是 Epicor ERP 中最常用的数据查询工具。它提供了一个可视化的查询设计器,无需编写 SQL 即可从 ERP 数据库中提取和分析数据。BAQ 的查询结果可以用于:

BAQ 设计器核心概念

1. 顶层查询(Top-Level Query)

每个 BAQ 至少有一个顶层查询,包含以下元素:

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 列表中,否则会报错。

性能优化建议

通过 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 的联动使用方法。