谈数据删除设计-以记账凭证为例

【ERP】实践4_填制、审核、签字、删除、冲销凭证以及记账、对账 修改系统时间!!! 理解: 这里涉及到凭证的填制凭证、审核凭证、签字等,由不同人员负责,所以经常需要进行重注册操作! 0. 设置常用凭证 有的操作在基础基础设置中,有的操作在业务工作中。浅显的区分可为:要根据具体业务设置的内容就在业务工作中设置,基础设置中的内容都是和具体业务无关,换句话来说,所有业务都适用的设置。 1. 增加KJCF权限 注:在系统管理里面设置。 2. 指定招行存... 阅读详情

原文地址 https://my.oschina.net/yangyishe/blog/3138204

1 常见删除策略

凡是做业务逻辑系统, 总是离不开对删除逻辑的处理.
本文论述重点是伪删除, 即字段标示状态, 这是在一些中小型系统开发中的单据等较重要数据的主流做法.
但在此之前, 不妨先将常见删除策略列举一下:

  1. 数据库设置级联
    这个我没太懂是怎么回事, 不过网上也说缺点较多, 很少用到, 在此就不考虑了

  2. 触发器控制

-- 本文所写sql默认数据库均为mysql
CREATE TRIGGER `tg_bf_insert_t_product_only` BEFORE INSERT ON `t_product` FOR EACH ROW begin
insert into t_product_only (p_id,only_code) values (new.p_id,concat(new.group_code,',',new.p_code)) ;
end;
CREATE TRIGGER `tg_af_delete_product_only` AFTER DELETE ON `t_product` FOR EACH ROW begin
insert into t_product_deleted  (p_id,group_code,p_code) values (old.p_id,old.group_code,old.p_code);
delete from t_product_only where p_id=old.p_id;
end;

优点是代码业务逻辑简单化, 且可以使用 unique index,
缺点是对于一些级联数据的恢复不好控制, 如主表单和明细表单, 另在表结构变更的时候, 对于触发器的维护也是一件需要注意的事情.

  1. 字段标示状态 / 伪删除 (下文中将统称为伪删除)
    即用状态表示已删除, 如 status=-1 或者 is_del=1,
    之所以说是中小型系统开发的主流做法, 是因为对于重要数据, 为了控制风险, 不会直接将数据删除, 而使用触发器前面的缺点也说了, 维护十分不易.
    中小型系统本来就有逻辑变更频繁, 以及数据量不会太高 (单据数量几百万上千万, 但很少上亿) 的特点, 权衡之下, 伪删除往往成为首选.

2 伪删除不同设计的优劣点

即使是伪删除, 也有几种不同的设计方式, 以下以财务系统中常常使用到的记账凭证为例, 介绍下几种伪删除的设计方案, 及实际中应当如何选择.

以下是现实生活当中的一张记账凭证图片.

由图片可以看出, 传统的记账凭证, 在数据库设计中, 至少需要两种表: 凭证主表和凭证明细表.
凭证主表记录凭证日期, 凭证字 (如记), 凭证数(如图片右上角的 1 号) 等信息,
凭证明细需要记录摘要, 会计科目, 借贷方向 / 借方金额 / 贷方金额 (这三个内容在数据库表中至少需要保存 2 个).
实际凭证设计中, 可能还需要考虑辅助核算等信息, 本文简化处理不考虑这些.

由于凭证比较重要, 多数情况都是原始信息源 (即不是可从其他数据中推导出的冗余), 故选择伪删除是较常见的.

2.1 状态设计字段的选择

如前文所述, 对于伪删除字段的选择, 一般有两种:

  1. 将凭证的常见状态全都放在一个字段中, 包含已保存 status=0, 已审核 status=1, 已删除 status=-1;

  2. 将已删除单独设为一个字段, 如 is_del, 删除状态时为 0, 伪删除状态时为 1.

第一种选择, 好处是状态字段只有一个, 且恰好凭证在已审核状态下是不允许被删除的, where 约束起来比较简单.

-- voucher_month表示凭证月份,记账凭证均是以月为基本周期的
-- voucher_mark表示凭证字+凭证数的一种冗余,和凭证月联合起来用以表示某一公司的一张唯一记账
update fnc_voucher
set status=-1
where company_id=1001
and voucher_month='2019-01'
and voucher_mark='记-1'
and status=0

第二种选择, 好处是将删除状态与正常的审批流程状态区分开, 使得两种逻辑得以解耦, 还有一种好处, 下文中会有提及.

-- is_audited是是否已审核的意思
update fnc_voucher
set is_del=1
where company_id=1001
and voucher_month='2019-01'
and voucher_mark='记-1'
and is_audited=0
and is_del=0

虽然第一种选择的 sql 看起来更简短, 但个人还是建议第二种选择.

2.2 唯一索引的设计协同

设计数据库表格时, 一般建议是每一张数据库表格至少需设置一个唯一索引, 个别情况还需要设计多个唯一索引. 伪删除带来的状态标识字段增加, 可能会给唯一索引的设计带来一些影响.

当凭证不考虑伪删除的时候, 其唯一索引的设计方式如下:

alter table fnc_voucher
add unique key uk_voucher_cmm (company_id,voucher_month,voucher_mark);

当用户允许凭证断号时, 如在'记 - 7'和'记 - 9'之间允许存在一个空的凭证号时, 以上的唯一索引仍能正常发挥作用.
但当用户不允许凭证断号 (至少不允许自动断号, 可以增加手动凭证弥补断号) 时, 上面的唯一索引就不再符合逻辑. 当'记 - 8'凭证已伪删除时, 如果再增加一张同月的'记 - 8'凭证, 无疑会报 duplicate key 错误.

为了消除这种问题, 就需要将删除信息体现在唯一索引中.
这就是我建议将删除状态单独设置为一个字段的另一个原因: 当凭证被删除时, 不将 is_del 设为 1, 而改为 id 值:

update fnc_voucher
set is_del=id
where company_id=1001
and voucher_month='2019-01'
and voucher_mark='记-8'
and is_audited=0
and is_del=0

这样, 唯一索引就可设计为:

alter table fnc_voucher
add unique key uk_voucher_cmmd (company_id,voucher_month,voucher_mark,is_del);

对于均放在一个字段中的设计, 当然也可考虑将删除后的状态值设置为 id 的负值:

update fnc_voucher
set status=-id
where company_id=1001
and voucher_month='2019-01'
and voucher_mark='记-8'
and status=0

只是这样做, 又会更进一步增加删除与正常流程的耦合性, 给以后的设计带来较大的困扰, 是不很建议这样做的. 只有当已经将删除设计为单字段混合状态时, 才考虑使用这种方法.

2.3 对凭证明细的影响

前文所述的重点, 都是在对凭证主表上, 而一旦考虑到凭证明细, 就又回出现新的问题.
查询凭证明细表的时候, 有两种选择:

  1. 根据主表的 id 查询;

select summary,subject_code,debit_amount,credit_amount
from fnc_voucher_detail
where company_id=1001
and voucher_id=12345
-- 此sql理论上可以不在约束条件中加company_id限制,加只是为了格式统一
  1. 根据主表的凭证标识来查询;

select summary,subject_code,debit_amount,credit_amount
from fnc_voucher_detail
where company_id=1001
and voucher_month='2019-01'
and voucher_mark='记-8'

每种都有各自的优势, 就笔者个人而言, 习惯使用第二种: 根据主表的凭证表示查询凭证明细, 但这就产生衍生了一个新的问题:
当一个凭证伪删除时, 且又生成了一个与已删除凭证标识相同的新凭证, 则新凭证就会共享已删除凭证的明细, 导致明细逻辑的错误!

解决这个问题, 就必须要在凭证明细上也增加删除状态标识, 当伪删除凭证时, 同时也对凭证明细进行伪删除处理.

update fnc_voucher_detail
set is_del=id
where company_id=1001
and voucher_month='2019-01'
and voucher_mark='记-8'
and is_del=0;
select summary,subject_code,debit_amount,credit_amount
from fnc_voucher_detail
where company_id=1001
and voucher_month='2019-01'
and voucher_mark='记-8'
and is_del=0;

如果使用根据 id 关联查询, 当然可以规避这种情况, 只是用 id 需要关联查询, 一般会带来一些效率上的差异.

具体使用哪种明细关联方式, 见仁见智吧.

推荐一个公众号

MarkerHub

主分析开源项目,以及导图梳理Java知识点!

用友T3反结账、反记账、反审核与删除凭证操作全解析 在财务软件与ERP系统的日常运维中,数据修正与逆向操作是保障账务准确性的关键技术环节。其核心原理在于通过特定的权限控制和数据状态标记,在不破坏底层数据完整性的前提下,实现业务流程的合规回退。从技术价值看,这类功能并非系统漏洞,而是为应对业务变更、操作失误或审计调整而设计的标准流程,对于维护财务数据链的连续性与审计追踪至关重要。在应用场景上,尤其常见于用友T3等主流财务软件中,用于处理已结账月份的凭证错误修正。本文将聚焦于用友T3中的反结账、反记账、反审核及删除凭证这一套核心逆向操作,深入剖析其操作逻辑、权限 阅读详情

相关推荐

全面的财务凭证管理系统数据库设计指南

本文还有配套的精品资源,点击获取 简介:财务凭证管理系统是企业财务管理的关键软件,其核心是确保数据安全、完整和高效的数据库设计。本简介涵盖了从概念设计、逻辑设计、物理设计到安全性、事务处理、备份与恢复、性能优化和数据集成的数据库设计全过程。系统设计必须考虑实体关系、数据完整约束、存储效率、用户权限、事务ACID属性、数据备份策略、系统性能调优以及与其他业务系统的数据集成。 ...

weixin_42551310的博客 1932

c#建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能

# financial_建筑行业 建筑行业财务流水账系统软件可上传记账凭证财务管理系统签核功能 # 开发背景 软件是给岳阳客户定制开发一款建筑行业流水账财务软件。提供工程签证单、施工日志、人员出勤表等信息记录

qq_29790801的博客 466

记帐凭证格式gridview C#源码

财务记帐凭证格式输入和显示的DataGridView C#示例源代码

删除业务系统中数据的方法。

先建一张简单的只有1个字段的表,把你要保留数据的表登记起来。然后从系统表中选择不在那些被登记起来的表中的表,采用动态 SQL,不断 delete,循环的 delete ,直到每张表的记录数都是0... 最后再把建的那张登记表删除掉,呵呵...

做最不无聊的IT人 492

完整的C#实例源代码系列之:财务凭证管理系统

完整的C#实例源代码系列(内附详细说明文档)之:财务凭证管理系统适合C#和SQL2005入门者练习。

一个简单记账软件

虽然这个源码有点老了,学习一下方法还是可以的。

记账凭证

记账凭证 银行 IT

gooooooooal的专栏 2155

会计凭证制作

会计凭证系统制作,自动生成报表,明细表 求财务表格式EXCEL(现金账、银行帐、记账凭证电子表格、明细账、总账带公式能自动生成报表的)

级联删除相关记录在哪_谈数据删除设计-以记账凭证为例

1 常见删除策略凡是做业务逻辑系统, 总是离不开对删除逻辑的处理.本文论述重点是伪删除, 即字段标示状态, 这是在一些中小型系统开发中的单据等较重要数据的主流做法.但在此之前, 不妨先将常见删除策略列举一下:数据库设置级联这个我没太懂是怎么回事, 不过网上也说缺点较多, 很少用到, 在此就不考虑了触发器控制-- 本文所写sql默认数据库均为mysqlCREATE TRIGGER `tg_bf_in...

weixin_39963287的博客 180

会计凭证控件

可以在c++builder6 delphi6等开发工具上使用的会计凭证开发控件 可以做出完全仿真的会计凭证

VASP+Multiwfn+VMD静电势计算与可视化全流程解析

静电势是表征分子与材料表面电荷分布的关键物理量,它通过求解泊松方程,将电子密度与原子核电荷在空间中的贡献结合起来,直观揭示体系的电子富集与缺失区域。这一性质在理解化学反应活性、分子间相互作用(如氢键、卤键)以及材料表面性质方面具有重要价值。在计算材料科学与量子化学领域,基于第一性原理计算获得高精度电子结构数据后,如何将其转化为可直观分析的静电势图,是连接理论计算与物理解释的关键技术环节。本文聚焦于构建一条高效、可控的端到端工作流,详细解析如何利用VASP进行高精度电子密度计算,通过专业波函数分析软件Mult

weixin_33733810的博客 427

SAP FI 系列 (019) - 会计凭证的冲销和反记账

对做错的会计凭证,SAP 并不提供常规的删除操作,需要通过冲销 (reversal) 的方式来消除数据影响。对会计凭证的冲销,财务有红字冲销和蓝字冲销的概念。假设我们做了一张会计凭证,需要冲销,下图展示了红字冲销和蓝字冲销的效果: 可以看到,红字冲销采用的是对会计科目同方向,用负数记账的方式,这种方式从分类账的角度来看,对发生额和余额都没有影响。比如刚才的例子中:招待费用 1800 在红字冲销后...

王敏的专栏 2万+

角谱迭代与傅里叶变换迭代算法(GS)的原理及其实例演示分析

角谱迭代与傅里叶变换迭代算法(GS)的原理及其实例演示分析 目前,迭代法和强度传输方程(TIE)法是两类典型的非干涉相位检索技术(Phase Retrieval,被称为相位恢复、相位检索、相位反演法、相位复原等)。迭代法中的经典算法是Gerchberg-Saxton(GS),随后,出现了包括错误减少算法(ER)、混合输入输出法(HIO)、梯度搜索算法、角谱迭代算法等改进算法。...

简单光学 2万+

删库不必跑路,谈数据库删除设计

作者:杜哥原文链接:https://my.oschina.net/yangyishe/blog/31382041 常见删除策略凡是做业务逻辑系统, 总是离不开对删除逻辑的处理.本文论述重...

HollisChuang's Blog 1388

信贷审批中的那些坑:从零开始搭建风控策略体系的5个关键步骤

本文深入探讨了信贷审批中的风控策略体系搭建,从数据陷阱识别、规则冲突诊断到反欺诈攻防,提供了5个关键步骤的实战指南。重点解析了如何通过特征工程、决策树优化和模型可解释性技术,构建动态平衡的风控体系,有效降低逾期风险并提升审批效率。

weixin_29253711的博客 411

UNet + Shuffle Attention:一种轻量高效的医学图像分割注意力机制

本文提出了一种轻量高效的医学图像分割方法,将Shuffle Attention模块嵌入UNet的上采样路径中。Shuffle Attention通过通道分组注意力机制增强关键特征,同时保持计算轻量化。该方法在上采样后应用注意力模块,有效融合高层语义与低层细节,计算开销小且易于部署。实验表明,该模型在保持UNet原有优势的基础上,通过注意力机制提升了特征聚焦能力,适用于多种图像分割任务。未来可进一步结合空间注意力或Transformer模块以增强模型性能。

Henry的博客 240

级联删除相关记录在哪_删库不必跑路,谈数据库删除设计

# 常见删除策略凡是做业务逻辑系统, 总是离不开对删除逻辑的处理.本文论述重点是伪删除, 即字段标示状态, 这是在一些中小型系统开发中的单据等较重要数据的主流做法.但在此之前, 不妨先将常见删除策略列举一下:1、数据库设置级联这个我没太懂是怎么回事, 不过网上也说缺点较多, 很少用到, 在此就不考虑了2、触发器控制-- 本文所写sql默认数据库均为mysqlCREATE TRIGGER `tg_b...

weixin_39706367的博客 130

Android 系统低内存lowmemorykiller关于阈值修改 minfreeAbsKbytes优化

在系统rom定制化开发中,在对于运行内存ram 1G和2G的设备中,对于内存使用高峰期时,minfreeAbsKbytes优化很关键 调整合理的minfree,让内存合理的使用很关键,接下来分析相关功能的实现

安卓兼职framework和app工程师的博客 521

用友T3批量导入凭证,日记账生成凭证引入

用友T3导入凭证工具,日记账生成凭证助手,导入凭证助手,效率工具

Excel工作圈的博客 1683

在 SAP S/4HANA Public Cloud 中做产品扩展:从 Key User 到 ABAP Cloud 与 BTP 的三轨实践指南

摘要:SAP S/4HANA Public Cloud 提供三种扩展方式(key user、developer extensibility 和 side-by-side),遵循 clean core 原则确保升级稳定。key user 扩展适合无代码轻量改良,developer extensibility 用于受控 ABAP 开发,side-by-side 则适用于云原生独立应用。文章通过销售订单优先级字段、退货审批微服务和采购校验等案例,说明不同扩展路径的适用场景与实现方法,帮助开发者在三系统景观中合理选

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 293

Vue3 - 详细实现调用浏览器摄像头拍照并生成图片预览,支持将抓拍的图像保存到用户本地或上传到服务器、调取前置摄像头和后置摄像头,开启摄像头并进行拍照,vue实现调用摄像头,电脑或手机调用摄像头拍照

vue3,nuxt3,摄像头,vue3网站打开摄像头拍照,vue3项目调用摄像头实现拍照功能,拍照后怎么保存,照相后上传到后端服务器,开启摄像头黑屏,如何默认后置摄像头,网页开启电脑摄像头并照相,前置拍照,vue3如何调用手机摄像头进行拍摄,拒绝权限后不再弹出了,微信公众号网页,摄像头报错,拍照左右镜像反了,浏览器不兼容怎么办,vue3调用电脑端摄像头实时拍照,解决调用摄像头权限无法弹出,打不开摄像头,Vue3如何调用手机的摄像头,调用本地摄像头实现拍照,浏览器不弹摄像头权限了,如何不使用https运行测试

🏆 前端领域优质创作者 8653

用友T6引入凭证操作教程,日记账批量生成凭证

用友T6快速批量导入凭证操作教程

Excel工作圈的博客 1294

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 史上最全的 Linux Shell 文本处理工具集锦,快收藏!
下一篇: MySQL:数据库优化,看这篇就够了
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值