ESAP达摩院 思想有多远,我们就能走多远

ESAP高级教程|深入系统架构

2019-03-06
     

本文源自村长多年的ERP架构经验!

模板式架构

在正式谈系统架构思想之前,我们先回顾一下自己的第一套ES类系统设计是什么样的?

ES官方教程第一篇是订单,所以大部分玩家第一个模板可能是销售订单,定义了销售订单_主表销售订单_明细

然后呢?可能是销售出库单,定义了销售出库单_主表销售出库单_明细

好了,接下来大概率是采购订单,定义了采购订单_主表采购订单_明细

不出意外的话,后面跟着采购入库单,定义了采购入库单_主表采购入库单_明细

深入一点的还会有生产订单,定义了生产订单_主表生产订单_明细

与之匹配的是生产入库单,定义了生产入库单_主表生产入库单_明细

以及生产领料单,定义了生产领料单_主表生产领料单_明细

好了,一个进销存系统主体模板基本完成。

这是典型的先模板,再开表的架构模式。

架构问题

举例一个经典问题是库存计算,通常为了回避回写带来的不确定性,中小系统可以采用视图计算库存,年结来切割数据。

视图代码示例如下:

select 品号,库存=sum()-sum() from (
	select 品号,=数量,=0 from 采购入库单_明细
	union all
	select 品号,=数量,=0 from 生产入库单_明细
	union all
	select 品号,=0,=数量 from 销售出库单_明细
	union all
	select 品号,=0,=数量 from 生产领料单_明细
) io group by 品号

这种架构最大的问题就是一旦增加了模板,或模板增加了字段,或增加了统计维度,就要改视图代码。

例如公司又新开发了注塑车间和包装车间的相关个性单据,可能代码要改成下面这样:

select 品号,库存=sum()-sum() from (
	select 品号,=数量,=0 from 采购入库单_明细
	union all
	select 品号,=数量,=0 from 生产入库单_明细
	union all
	select 品号,=数量,=0 from 注塑入库单_明细
	union all
	select 品号,=数量,=0 from 包装入库单_明细
	union all
	select 品号,=0,=数量 from 销售出库单_明细
	union all
	select 品号,=0,=数量 from 生产领料单_明细
) io group by 品号

又例如公司开始对批次有管理要求,我们不但要把所有收发单据模板改一遍,加上批号字段,还要改sql:

select 品号,批号,库存=sum()-sum() from (
	select 品号,批号,=数量,=0 from 采购入库单_明细
	union all
	select 品号,批号,=数量,=0 from 生产入库单_明细
	union all
	select 品号,批号,=数量,=0 from 注塑入库单_明细
	union all
	select 品号,批号,=数量,=0 from 包装入库单_明细
	union all
	select 品号,批号,=0,=数量 from 销售出库单_明细
	union all
	select 品号,批号,=0,=数量 from 生产领料单_明细
) io group by 品号,批号

不但如此,我们还要修改相关列表规范,增加字段,修改相关引用模板,增加填充字段。任何一个新需求,都几乎要把整个系统全部翻修一遍。

如果有一天公司做大了,收购了一堆公司,那简直要改得筋疲力尽,两眼发黑…

数据库式架构

如果我们换一种思路,从数据库角度出发去开发模板,即先开表,再模板模式,一切会变得不同。

先开表,把可能需要的字段都预先定义好,保证未来数据表本身变动最少。

例如设计收发表,把需要的和可能需要的字段都塞进去。

然后定义:收发主表收发明细

接下来,只要是出入库单类模板,都映射到这两个表,根据需要取舍字段,不一定要全部一一映射。

这样,无论我们怎么增加新的相类似模板,视图代码永远是:

select 品号,批次,库存=sum()-sum() from 收发明细 group by 品号,批次

事实上,全球著名的SAP也是把订单都视为订单对象,所有销售,采购,生产等订单都继承自这个对象。

因此,我们可以把订单表也做后台统一,唯一的区别就是类型=销售/采购/生产

这样做的好处是,只需要一个视图就可以完成所有订单收发查询了。

深挖映射价值

很明显,映射在提数和回写方面都能节省大量设计维护工作量。

映射的本质是多模板共用一套数据表,形成多头蛇效果,无论通过哪个模板填报都能把数据存到一起。

反过来,映射也可以把数据库已有的数据以不同的方式展示给用户,也就是SAP中的用户视图,所谓用户视图并不是SQL视图,而是根据权限等要求,系统对不同的用户展示不同的数据。

例如,商品表中通常含有单价,通常这些敏感信息我们不希望仓管看见,但仓管又必须能查询其他商品信息。

EXCEL类平台要解决权限不同,用户视图不同一般有三种方案:

1.使用模板本身的字段权限设置,不同用户隐藏不同的字段。缺点是:图片附件不受约束。

2.另外建一个纯查询模板,提数显示需要的信息。缺点是:工作台没法用。

3.使用映射模板,这是在JU/NX中才可用的方案,ES不行,ES的映射模板在工作台不能相互显示数据。

第三种方案具体的操作方法选择原商品表,右键-复制新增,修改新增的模板名称,将数据表映射到原商品表,删除不要的单价,附件等字段,设置权限仅仓管可见,原模板设置仓管不可见。

这种方案使仓管可以在工作台看到商品表,但又完全没有其他不相干的字段,本身也不需要设置提数公式,是最简洁有效的方案。

无单价模板效果示例:

小贴士:一般的,使用映射表后,建立列表等规范时,选择原始模板表,可以避免数据规范因业务变动删模板失效。

小结

本文旨在拓展映射技术的应用思维,本文涉及的数据库备份可在Juable/Nxcells达摩院中下载。

最后,村长祝愿大家在新的一年里工作顺利,心想事成,爱生活,爱宝贝^_^。

2019-03-06


近似文章