进销存系统的流水修改,会造成很多数据的重新计算,有人知道这块一般是怎么搞的么?

2016-11-06 19:29:13 +08:00
 refresh
通常为了减少计算成本,会按月将数据报表统计出来保存,但这时候如果遇到历史记录要调整,很多数据就需要重新计算。

且不说这个需求是否合理,如果这个是强需求,请问大家有什么好的解决方案没?
2871 次点击
所在节点    问与答
19 条回复
tomczhen
2016-11-06 21:25:32 +08:00
做单冲减,不要直接修改,以免数据统计结果不符合用户预期发生撕逼。另外,性能这种事情就直接事先告知,书面留底,后面出现性能问题再来加收费用或要求升级硬件。
refresh
2016-11-06 21:31:28 +08:00
@tomczhen 做单冲减是一个好办法,但这样会有很多奇怪的流水了,比如用户可能修改了分类,也可能修改了数量或者金额
Felldeadbird
2016-11-06 21:31:45 +08:00
@tomczhen 非常认同!数据尽量别修改,另外做单子去抵消!!因为我公司就是这么干了,结果数据经常异常!
refresh
2016-11-06 21:32:38 +08:00
@tomczhen 还有一种情况是用户删除了流水,这个也用做单冲减么?
refresh
2016-11-06 21:33:17 +08:00
@Felldeadbird 有没有删除流水的情况?怎么处理。
mhycy
2016-11-06 21:34:06 +08:00
日志式开发(参考 GIT 那种代码管理形式,与之类似)
所有数据都有多个副本,只有一个最新的副本是有效副本
再数据月表统计的时候,所有副本的快照均要写入到月表中(其实就是个 ID )
月表一旦生成无法修改

如果有旧数据需要调整,那么这是另一个分支
vibbow
2016-11-06 21:35:13 +08:00
红字反冲
refresh
2016-11-06 21:39:56 +08:00
@tomczhen
@Felldeadbird

一般有几种情况:

1. 用户马上修改 /删除了流水,这种情况最多
2. 较长一段时间后,比如说一个月,用户因为某些特殊原因要删除 /修改流水,冲单的时间应与要修改流水的时间保持一致,这样才能保证报表是正确的。

但用户所看到流水就会有两条记录,但实际用户可能是修改了这个流水或删除流水,普通用户可能会迷惑。
refresh
2016-11-06 21:40:31 +08:00
@mhycy 月表生成后,数据也可能会要修改的
mhycy
2016-11-06 21:43:55 +08:00
@refresh
你没理解我说的

流水账的月表是一个数据路径下来统计的
如果月表生成,那么必定需要留存现有的流水账的各项操作的 id (建表合理的话可以做到)

如果在月表生成后有新的修改
这时候所做的就是在原有事件的基础上加上一个修订事件标记这个时间点做了啥
重新生成月表以新操作为准

这是事件日志式的建库方式
能妥善处理各项临时加入的需求,最终月表只要调用一份最新的数据输出即可。
即便有所修改也是重新导出的事。
tomczhen
2016-11-06 21:49:29 +08:00
@refresh
修改历史数据需要做单。这样不需要修改每月的结存数据,报表统计时,按最近的结存点作为起点,然后把单据参与计算统计结果,实际上这样做也能解决运算量的问题。

修改流水必须要做限制,不能允许修改已经结存的日期之前的流水,如果允许这样操作了,必然会造成客户不同部门之间的数据差异——比如财务已经统计过 10 月份的数据,仓库又去修改了 10 月份的流水,从制度上来说,既然财务已经认可了结存数据,再想修改,必须能让财务知晓。(也有设计成必须删除掉前面一次结存记录才能修改的,这样不需要多做一个专门修改历史数据的模块。)

设计业务逻辑的时候请时刻记住,软件是没法管理到实物的,只能管理数据。所有的数据一旦有确认操作,之后的修改最后是有流水供查询,否则撕逼不可避免。
tomczhen
2016-11-06 21:52:40 +08:00
@mhycy 简单说是:记录差异,合并数据。基准加上差异数据,就能取得任一一次修改的结果。用他能理解的方式就是,把月结数据看成一个基准,修改数据看成“差异”,这样以月结作为点,配合差异,就能取到想要的结果了。
mhycy
2016-11-06 21:57:11 +08:00
@tomczhen
这是最容易处理的情况了
然而似乎他并不想这么做
tomczhen
2016-11-06 22:10:19 +08:00
@mhycy @mhycy 说到底是没理解真实的需求。进销存来说,软件上只要你计算方法没有问题,根本就不存在所谓的“不正确”,只有“数据与实物不符”。

这个背后的问题就比较多了,可能是使用者输入数据有问题,也有可能是实物出现了问题。然而,不管是哪种情况,都不是靠软件能解决的。从录入者的角度看,只会说是“数据错误”——因为不是数据错了,就是他有错了。从管理者角度看,出现“数据与实物不符”是要查明原因才行的,否则还不如直接手工得了。

假设管理者并不在意这一块的问题,那么直接允许修改数据看起来似乎是个很简单的方法,但实际会破坏数据的严密性,会造成真正的数据错误。

个人认为允许修改,但必须有修改记录才是正确的解决方案。至于,其他各种有关统计时间的问题,其实都是能解决的——难度问题罢了。不过,进销存说到底最终也就是顶多有个性能问题,反正数据库编程嘛,不考虑性能,实现出来还是没有什么难度的。:doge:
mhycy
2016-11-06 22:16:03 +08:00
@tomczhen
于是乎还是绕回我提出来的方案
日志式存储,报表记录对应的流水号

这能兼顾修改与回溯的需求(留有操作记录也可以让查账有个后路)
Felldeadbird
2016-11-06 22:16:37 +08:00
对于删除和修改,如果设计时能够确保后续影响,那么可以随意修改。公司之前用的是金蝶,有审核和反审核的,多久的单子都可以操作,不过由于我没管理过,后来公司自己开发进销存。
我的做法是,单子提交了,出错要修改就在对应单子下单开对应的删减增加追加单子和理由。若单子有后续的跟单,那么也要手动开一次。否则整个流程的数据就不一致了…当然,这个是我公司的流程,本身没有进销存的开发人员参与,都只能靠自己摸索开发
tomczhen
2016-11-06 22:24:31 +08:00
@Felldeadbird 貌似金蝶是按年转结的,转结之后第二年是以上年的下存作为期初,如果要改,只能改上一年的结存数据,但是并不会影响次年的期初。没有转结的话,基本上就可以看成多久的单都能改了。不过反审核之后重新审核,审核时间必然会变,应该会影响到统计。

其实财务账和货品进销存还是有区别的,财务一般是借贷记账法,但是货品进销存没貌似没看到有这样做的。
nfroot
2016-11-07 01:00:43 +08:00
关注一下,也有这个困扰
refresh
2016-11-07 21:43:55 +08:00
@tomczhen
@Felldeadbird
@mhycy

感谢诸位的讨论与回复,解答了我很多疑惑。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/318524

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX