用友U8数据库核心表结构与业务关联解析(附常用查询SQL)

用友U8是典型的SQL Server数据库架构,理解其表结构是实施顾问和二次开发者的基本功。本文从实战出发,梳理财务、供应链、生产制造三大模块的核心表及关联关系,配合可直接使用的SQL查询示例。


背景说明

用友U8采用SQL Server数据库,数据存储在 UFDATA_年份_账套号 命名的数据库中(如 UFDATA_2026_001)。

每个模块对应一组表,表名通常有固定前缀:

  • GL → 总账模块

  • AR → 应收模块

  • AP → 应付模块

  • IA → 存货核算

  • ST → 库存模块

  • PU → 采购模块

  • SA → 销售模块

  • PP → 生产模块

  • FA → 固定资产

  • BD → 基础档案(公共表)

免责声明:以下表结构基于U8 V16.x实测,不同版本可能有字段差异。涉及数据修改前请务必备份并在测试库验证。


一、基础档案表(最常用)

基础档案贯穿所有业务模块,先搞懂这些公共表。

1.1 组织架构

复制代码
- 部门档案(bd_department)
SELECT *
FROM bd_department
WHERE bclosed = 0  -- 未停用

-- 职员档案(hr_person)
SELECT *
FROM hr_person
WHERE bdimission = 0  -- 在职
字段 含义
cDepCode 部门编码
cDepName 部门名称
bclosed 是否停用
cDepGrade 部门级次

1.2 客户和供应商

复制代码
-- 客户档案(bd_cubasdoc)
SELECT cCusCode, cCusName, cCusAbbName, cCusManager
FROM bd_cubasdoc
WHERE bCusState = 1  -- 客户启用状态

-- 供应商档案(bd_supbasdoc)
SELECT cSupCode, cSupName, cSupAbbName, cSupGrade
FROM bd_supbasdoc
WHERE bSupState = 1  -- 供应商启用状态

注意:bd_cubasdoc 是客户基础档案主表,详细信息在 bd_cubasdoc_extradef(自定义项)。

1.3 存货(商品/物料)

复制代码
-- 存货档案主表(bas_part)
SELECT a.cInvCode, a.cInvName, a.cInvStd, a.cInvCCode,
       b.cInvCName  -- 存货分类名称
FROM bas_part a
LEFT JOIN bas_inventoryclass b ON a.cInvCCode = b.cInvCCode
WHERE a.bPartState = 1  -- 启用状态
  AND a.cInvCode <> 'CM'  -- 排除"母件"

-- 查询某存货分类下的所有物料
SELECT cInvCode, cInvName, cInvStd, iInvSCost
FROM bas_part
WHERE cInvCCode = '01'  -- 原材料分类
  AND bPartState = 1
ORDER BY cInvCode

二、财务模块核心表

2.1 会计科目表(GL_accode)

复制代码
-- 查询所有末级科目
SELECT cclass AS 科目大类,
       ccode AS 科目编码,
       cname AS 科目名称,
       cbook_type AS 账簿类型
FROM gl_accvouch
WHERE igrade = (SELECT MAX(igrade) FROM gl_accvouch WHERE cclass = gl_accvouch.cclass)
ORDER BY ccode

-- 查询有辅助核算的科目
SELECT ccode, cname, bperson, bdept, bitem, bcus, bsup, bproject
FROM gl_accvouch
WHERE igrade = 3  -- 三级科目
  AND (bperson = 1 OR bdept = 1 OR bcus = 1 OR bsup = 1)

2.2 凭证主表(GL_accvouch)

这是U8最核心的表,所有凭证数据都存在这里。

复制代码
-- 查询指定期间的凭证
SELECT cbill, dbill_date, csign, ino_id AS 凭证号,
       ccode AS 科目编码, cname AS 科目名称,
       md AS 借方金额, mc AS 贷方金额,
       cxth AS 摘要行号, cdigest AS 摘要
FROM gl_accvouch
WHERE iyear = 2026
  AND imonth = 5
  AND ino_id > 0
ORDER BY dbill_date, ino_id, cxth
字段 含义
cbill 制单人
dbill_date 凭证日期
csign 凭证字(记/转)
ino_id 凭证号
ccode 科目编码
md 借方金额
mc 贷方金额
cdigest 摘要
bdiffirst 是否借贷方向不平
iperiod 期间号

2.3 凭证借贷平衡检查

复制代码
-- 查找借贷不平的凭证(最常用的审计SQL)
SELECT dbill_date, ino_id, cbill,
       SUM(md) AS 借方合计,
       SUM(mc) AS 贷方合计,
       SUM(md) - SUM(mc) AS 差异
FROM gl_accvouch
WHERE iyear = 2026 AND imonth = 5
GROUP BY dbill_date, ino_id, cbill
HAVING ABS(SUM(md) - SUM(mc)) > 0.001
ORDER BY dbill_date, ino_id

2.4 应收账款查询(AR_receivable / AR_apbilldetail)

复制代码
-- 查询客户应收账款余额(AR_receivable)
SELECT b.cCusCode, b.cCusName,
       SUM(ISNULL(iAmount,0)) AS 应收金额,
       SUM(ISNULL(iReceiveAmount,0)) AS 已收金额,
       SUM(ISNULL(iAmount,0)) - SUM(ISNULL(iReceiveAmount,0)) AS 余额
FROM ar_receivable a
LEFT JOIN bd_cubasdoc b ON a.ccuscode = b.ccuscode
WHERE a.dclosed = 0  -- 未关闭
GROUP BY b.cCusCode, b.cCusName
HAVING SUM(ISNULL(iAmount,0)) - SUM(ISNULL(iReceiveAmount,0)) > 0
ORDER BY 余额 DESC

三、供应链核心表

3.1 销售模块(SA系列)

复制代码
-- 销售订单主表(SA_SaleOrder)
SELECT a.cSOCode AS 订单号,
       b.cCusName AS 客户名称,
       a.dDate AS 订单日期,
       a.cVerifier AS 审核人,
       a.cSCloser AS 关闭人,
       a.cState AS 订单状态
FROM SA_SaleOrder a
LEFT JOIN bd_cubasdoc b ON a.cCusCode = b.cCusCode
WHERE a.dDate >= '2026-01-01' AND a.dDate <= '2026-12-31'

-- 销售订单明细(SA_SaleOrderB)
SELECT a.cSOCode,
       b.cInvCode AS 存货编码,
       b.cInvName AS 存货名称,
       b.iquantity AS 订单数量,
       b.irowno AS 行号
FROM SA_SaleOrder a
JOIN SA_SaleOrderB b ON a.id = b.id
WHERE a.dDate >= '2026-05-01'

3.2 销售出库单(ST_SaleOut)

复制代码
-- 查询某月销售出库汇总(按存货)
SELECT b.cInvCode AS 存货编码,
       b.cInvName AS 存货名称,
       SUM(b.iquantity) AS 出库数量,
       SUM(ISNULL(b.iCessAmount,0)) AS 含税金额
FROM ST_SaleOut a
JOIN ST_SaleOutB b ON a.id = b.id
WHERE a.dDate >= '2026-05-01'
  AND a.dDate < '2026-06-01'
  AND a.cVouchState = 1  -- 已审核
GROUP BY b.cInvCode, b.cInvName
ORDER BY SUM(ISNULL(b.iCessAmount,0)) DESC

3.3 采购模块(PU系列)

复制代码
-- 采购订单明细
SELECT a.cPOCode AS 采购订单号,
       b.cInvCode AS 存货编码,
       b.cInvName AS 存货名称,
       b.iquantity AS 订单数量,
       b.iarrqty AS 到货数量,
       b.iQAQuantity AS 质检数量
FROM PU_ArrivalVouch a
JOIN PU_ArrivalVouchB b ON a.id = b.id
WHERE a.dDate >= '2026-01-01'
ORDER BY a.dDate DESC

-- 采购入库汇总(对接存货核算)
SELECT b.cWhCode AS 仓库编码,
       b.cInvCode AS 存货编码,
       SUM(b.iquotedpricequantity) AS 入库数量,
       SUM(b.iCessAmount) AS 含税金额
FROM PU_ArrivalVouch a
JOIN PU_ArrivalVouchB b ON a.id = b.id
WHERE a.dDate >= '2026-05-01'
  AND a.cVouchState = 1
GROUP BY b.cWhCode, b.cInvCode

3.4 库存台账(ST_InvMoreSum / ST_Inventory)

复制代码
-- 当前库存查询(按仓库+存货)
SELECT a.cWhCode AS 仓库编码,
       b.cWhName AS 仓库名称,
       a.cInvCode AS 存货编码,
       c.cInvName AS 存货名称,
       a.iquantity AS 库存数量,
       a.iTaxCost AS 库存单价,
       a.iTaxAmount AS 库存金额
FROM ST_Inventory a
JOIN bd_warehouse b ON a.cWhCode = b.cWhCode
JOIN bas_part c ON a.cInvCode = c.cInvCode
WHERE a.iquantity <> 0
ORDER BY a.cWhCode, a.cInvCode

四、生产制造核心表

4.1 BOM表(物料清单)

复制代码
-- 查询某产品的BOM结构(PP_BOM)
SELECT a.cInvCode AS 父件编码,
       a.cInvName AS 父件名称,
       b.cInvCode AS 子件编码,
       b.cInvName AS 子件名称,
       b.Quantity AS 用量,
       b.SCrap AS 损耗率,
       b.id AS BOM版本ID
FROM bas_part a
JOIN (
    SELECT p.id AS bom_id,
           p.cInvCode AS cInvCode,
           p.cInvName AS cInvName,
           b.cInvCode, b.cInvName,
           b.Quantity, b.SCrap
    FROM PP_BOM p
    JOIN PP_BOMDetail b ON p.id = b.id
    WHERE p.bFX = 0  -- 非反向
      AND p.bSet = 1  -- 有效版本
) b ON a.cInvCode = b.cInvCode
WHERE a.cInvCode = 'FG-001'  -- 替换为实际产品编码

4.2 生产订单(PP_ProductOrder)

复制代码
-- 查询在产生产订单
SELECT a.cMoCode AS 生产订单号,
       b.cInvName AS 产品名称,
       a.dDate AS 下单日期,
       a.dStartDate AS 开工日期,
       a.dDueDate AS 完工日期,
       a.iquantity AS 订单数量,
       a.QualifiedInQuantity AS 合格入库数量,
       CASE a.Status
         WHEN 1 THEN '计划'
         WHEN 2 THEN '锁定'
         WHEN 3 THEN '下达'
         WHEN 5 THEN '完工'
         ELSE '其他'
       END AS 订单状态
FROM PP_ProductOrder a
JOIN bas_part b ON a.cInvCode = b.cInvCode
WHERE a.Status NOT IN (5, 9)  -- 排除完工和关闭
ORDER BY a.dDueDate

4.3 MRP运算结果(MRP_MRPPlan)

复制代码
-- 查询MRP运算后的采购建议
SELECT a.cPTCode AS 计划订单号,
       b.cInvCode AS 物料编码,
       b.cInvName AS 物料名称,
       b.Quantity AS 建议数量,
       b.dDemandDate AS 需求日期,
       CASE b.cMrpType
         WHEN 'P' THEN '采购'
         WHEN 'M' THEN '生产'
         WHEN 'T' THEN '请购'
       END AS 建议类型
FROM MRP_MRPPlan a
JOIN MRP_MRPPlanDetail b ON a.id = b.id
WHERE b.cMrpType = 'P'  -- 仅采购建议
  AND b.Quantity > 0
ORDER BY b.dDemandDate

五、常用业务查询实战

5.1 销售-出库-开票-收款全流程追踪

复制代码
-- 追踪某客户某月的完整销售闭环
SELECT sa.cSOCode AS 订单号,
       sa.dDate AS 接单日期,
       st.cCode AS 出库单号,
       st.dDate AS 出库日期,
       st.iquantity AS 出库数量,
       ia.cVouchID AS 发票号,
       ia.dVouchDate AS 开票日期,
       ia.iCessAmount AS 发票金额
FROM SA_SaleOrder sa
JOIN ST_SaleOut st ON sa.cSOCode = st.cSOCode
JOIN IA_SalesInvoice ia ON st.cCode = ia.cCode
WHERE sa.cCusCode = 'CUS001'  -- 替换为实际客户编码
  AND YEAR(sa.dDate) = 2026 AND MONTH(sa.dDate) = 5
ORDER BY sa.dDate

5.2 库存呆滞料分析

复制代码
-- 90天以上无出入库的存货(呆滞料)
SELECT cInvCode AS 存货编码,
       cInvName AS 存货名称,
       iquantity AS 当前库存,
       iTaxCost AS 单价,
       iTaxAmount AS 库存金额
FROM ST_Inventory
WHERE cInvCode NOT IN (
    -- 过去90天内有出入库记录的存货
    SELECT DISTINCT cInvCode
    FROM ST_InvMove
    WHERE dDate >= DATEADD(day, -90, GETDATE())
)
  AND iquantity > 0
ORDER BY iTaxAmount DESC

5.3 某销售员业绩统计

复制代码
-- 按销售员统计某月销售情况
SELECT a.cCusCode AS 客户编码,
       b.cCusName AS 客户名称,
       SUM(st.iquantity) AS 销售数量,
       SUM(st.iCessAmount) AS 销售金额,
       COUNT(DISTINCT st.cCode) AS 出库单数
FROM ST_SaleOut st
JOIN bd_cubasdoc b ON st.cCusCode = b.cCusCode
JOIN hr_person p ON st.cPersonCode = p.cPsn_Num
WHERE st.dDate >= '2026-05-01'
  AND st.dDate < '2026-06-01'
  AND p.cPsn_Name = '张三'  -- 替换为实际销售员姓名
GROUP BY a.cCusCode, b.cCusName
ORDER BY SUM(st.iCessAmount) DESC

六、二次开发注意事项

6.1 常用字段类型说明

字段特征 含义
i 开头(如 iquantity, iAmount) 数量/金额字段,通常decimal类型
c 开头(如 cInvCode, cCusName) 字符型字段
d 开头(如 dDate, dDueDate) 日期型字段
b 开头(如 bclosed, bPartState) 布尔型字段(1=是/0=否)
id 结尾 主键ID

6.2 跨年查询注意

U8每个年度的数据可能在不同的数据库中:

复制代码
-- 跨年查询需要切换数据库
USE UFDATA_2025_001;  -- 2025年账套
SELECT COUNT(*) AS 凭证数 FROM gl_accvouch WHERE iyear = 2025;

USE UFDATA_2026_001;  -- 2026年账套
SELECT COUNT(*) AS 凭证数 FROM gl_accvouch WHERE iyear = 2026;

6.3 禁止直接修改的数据

以下表/字段严禁直接用UPDATE/DELETE修改:

  • gl_accvouch 中的已记账凭证(需反记账)

  • ia_* 存货核算相关表(需通过业务单据走核算流程)

  • 凭证号、期间号等关联校验字段


总结

用友U8的数据库表结构虽然看起来复杂,但有以下规律:

  1. 表名前缀 = 模块缩写(SA销售、PU采购、ST库存、GL总账、AR应收、AP应付)

  2. 主表_B = 明细表(如 SA_SaleOrder + SA_SaleOrderB)

  3. 基础档案在 BD_开头的公共表中,业务数据引用其编码

  4. 凭证表 GL_accvouch 是核心,几乎所有财务报表的数据都从这里出

掌握这些规律,配合上面的SQL示例,日常工作足够用了。


成都云策数链科技有限公司 | 用友四川授权服务中心 | 专注企业数字化转型

相关推荐
BullSmall4 小时前
模板库与抽取实例:企业数据同步最佳实践
数据库
徒手猫4 小时前
MySQL 窗口函数完全指南
数据库·mysql
betazhou5 小时前
电科金仓数据库V9 MySQL兼容版本搭建一主一从体验
数据库·mysql·oracle·主从·高可用·kingbase·v9 mysql兼容版本
python在学ing5 小时前
Django框架学习笔记:从零基础到项目实战
数据库·python·django·sqlite
duoduo_sing5 小时前
数据库备份终极方案:从脚本手动到自动化热备+异地同步实战
运维·数据库·自动化·用友
Lao A(zhou liang)的菜园5 小时前
Oracle 增量检查点 & FAST_START_MTTR_TARGET 核心总结
数据库·oracle
wbs_scy6 小时前
MySQL 多表连接查询实战:内连接 + 外连接
数据库·mysql
cfm_29146 小时前
MySQL8.0 核心新特性详解(架构/性能/SQL/索引/安全全覆盖)
sql·安全·架构
largecode6 小时前
座机号码认证如何操作?申请热线实名名片,树立统一官方客服形象
linux·sql·华为·c#·.net·wpf·harmonyos