用友T3常见问题
用友t3填制凭证提示:运行时错误3021 BOF或EOF中有一个是“真”如何出处理?
问题现象:T3填制凭证报错:运行时错误‘3021’:BOF 或 EOF 中有一个是 “真”,或者当前的记录已被删除,所需的操作要求一个当前的记录

📌 根本原因
客户档案 customer 表的 ccuspperson(专营业务员) 字段里存了职员编码,但这个编码在职员档案 person 表不存在;供应商报错同理对应 vendor 表 cvpperson 字段。
填制凭证选客户 / 供应商辅助核算,程序去读取业务员档案,找不到记录,游标到 EOF,抛出 3021。
⚠️ 前置必做(非常重要)
系统管理 admin 登录,先完整备份账套
退出所有 T3 客户端、关闭填制凭证界面
在 SQL 查询分析器 / SSMS 中,选中对应账套年度库执行语句
方案 1:查询哪些客户是异常数据(先核查)
-- 查询客户:业务员编码在职员档案不存在
select * from customer where ccuspperson not in (select cpersoncode from person) and ccuspperson is not null
-- 查询供应商:业务员编码在职员档案不存在
select * from vendor where cvpperson not in (select cpersoncode from person) and cvpperson is not null
方案 2:一键清空所有客户专营业务员(最常用,你文档里的方案)
update customer set ccuspperson = null
供应商一并处理(如果供应商往来也报错)
update vendor set cvpperson = null
方案 3:只修复查到的异常客户(精准修复,推荐)
-- 示例:只修复编码 scyaq0001 的客户
update customer set ccuspperson=null where ccuscode='scyaq0001'
方案 4:前台不写 SQL 的简易办法(适合不会数据库操作)
打开【客户档案】→ 找到报错的客户 →【其他】页签 → 专营业务员清空,保存;供应商档案操作一致。
方案 5:排查重复档案(你文档第二条)
-- 检查客户档案重复ccuscode
select ccuscode,count(*) from customer group by ccuscode having count(*)>1
-- 检查供应商cvencode重复
select cvencode,count(*) from vendor group by cvencode having count(*)>1
重复记录要注意:有业务数据的不能直接删,优先并单、停用,不要直接删表数据,容易把凭证、应收关联数据搞坏。
🧪 执行完之后验证
重新执行上面的核查 SQL,结果为空代表清理完成
进 T3 填制凭证,选择客户辅助核算测试
测试正常后,建议再做一次账套备份
📎 补充少见排查点(上面处理完还报错再看)
计算机名称带
-、空格、中文,修改为纯英文 + 数字,重启服务器账套年度表
ua_period、ua_account_sub缺行记录(较少见)客户端和服务器 T3 版本补丁不一致,服务器打对应补丁