服务热线:010-84986180 专注用友全系产品 · 实施 / 运维 / 二次开发 / 数据迁移
首页 / yong-yout3tian-zhi-ping-zheng-ti-shi-yun-xing-shi-cuo-wu3021-bof-huoeof-zhong-you-yi-ge-shi-zhen-ru-he-chu-chu-li / 用友t3填制凭证提示:运行时错误3021 BOF或EOF中有一个是“真”如何出处理?
资讯

用友t3填制凭证提示:运行时错误3021 BOF或EOF中有一个是“真”如何出处理?

阅读 13

问题现象:T3填制凭证报错:运行时错误‘3021’:BOF 或 EOF 中有一个是 “真”,或者当前的记录已被删除,所需的操作要求一个当前的记录

be197193d42c61713e7a.png

📌 根本原因

客户档案 customer 表的 ccuspperson(专营业务员) 字段里存了职员编码,但这个编码在职员档案 person 表不存在;供应商报错同理对应 vendor 表 cvpperson 字段。

填制凭证选客户 / 供应商辅助核算,程序去读取业务员档案,找不到记录,游标到 EOF,抛出 3021。

⚠️ 前置必做(非常重要)

  1. 系统管理 admin 登录,先完整备份账套

  2. 退出所有 T3 客户端、关闭填制凭证界面

  3. 在 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

重复记录要注意:有业务数据的不能直接删,优先并单、停用,不要直接删表数据,容易把凭证、应收关联数据搞坏。


🧪 执行完之后验证

  1. 重新执行上面的核查 SQL,结果为空代表清理完成

  2. 进 T3 填制凭证,选择客户辅助核算测试

  3. 测试正常后,建议再做一次账套备份

📎 补充少见排查点(上面处理完还报错再看)

  1. 计算机名称带 -、空格、中文,修改为纯英文 + 数字,重启服务器

  2. 账套年度表 ua_period、ua_account_sub 缺行记录(较少见)

  3. 客户端和服务器 T3 版本补丁不一致,服务器打对应补丁