BOM是ERP的核心,ES能否成为ERP级系统取决于这个核心是否能顺利展开并实现MRP运算。
本文以常见的物料BOM做为示例,演示ES下的无级BOM实现技术。
父件
与所有子件
的配比关系。MRP运算通过数据库来实现更高效,例如存储过程,自定义函数,视图等。在ES中,我们可以使用BOM视图
来完成这一目的。
首先,定义BOM模板,存放bom数据(三个关键字段分别是父件,子件,数量)
我们在其他一些ES案例中经常见到采用路径法
的BOM,采用路径法需要记录每种产品每阶物料的路径信息,三阶
以后的物料路径一般存在很多重复,使用无级BOM技术可以有效避免这些冗余重复数据。
在ES中实现BOM分解和MRP运算并不难,示例库(群共享)演示了一种简易方案,在大型应用中更多的是采用存储过程提交和分解数据,在ES中也实现,但涉及到VBA,在此不再赘述。
村长点评:在nxcells中可以直接在提数中递归BOM,并传入本表待分解的品号,是比存储过程更优的方案。
两年前,笔者为一个由400多个ES模板构建的ERP系统专门设计了一套导航模板。该套系统案例在官方展示后引起很大震动。
近期,笔者给月饼库也打造了一套简单实用的系统导航。
在这一篇中,将展示其中的关键技术。
–ES导航-待办事宜–
–ES导航-流程图–
图片名改
为模板名称
即可调用相应模板,十分巧妙。如果你对示例图中那些小标签非常感兴趣,可以安装一款叫OfficeTab的插件,这款插件只有几兆大小,可以让你的word,excel等office组件都拥有标签功能,能够像网页一样进行操作,十分方便。
最重要的是,它能让ES导航更加方便快捷。
对于ES系统而言,导航模板并不是必须的,但导航模板设计得当,完全可以取代古板的工作台。
最后,仍然是那句话:思想有多远,我们就能走多远
。
在上一弹的“ES月饼库”中,我们采用了视图汇总的方法计算库存。在数据库中,这些视图会跟随单据一起更新,随着单据数据量的增加,视图的计算量也不断增大。
笔者曾经打开一个ES表单时等待了8秒,该模板没有任何表间公式、 EXCEL公式或VBA,但其数据量积累了40万行。由此可见,无论是实体表或是视图等虚拟表,当数据量庞大时,查询的压力是难以想象的。ES系统的设计,最终要从数据库的角度出发,寻找一个性能与功能的平衡。
本次我们带来了“月饼库”的升级版
,并讨论数据库切割的解决方案,其中涉及数据库范式
,索引
等内容。
数据库切割分为数据库级和数据表级,数据表级又分纵切与横切,实际上就是:
把大的数据库分割成多个较小的数据库,把大的数据表分割成多个较小的数据表
。
所谓纵切,就是将数据表“竖向”分割,将一部分字段转移到另一个数据表中。
例如:在月饼库中,仓库信息就可以分成多个小表,从而去除NULL
值。
–仓库信息–
–纵切分割–
注:数据库纵切主要是用来控制冗余数据,很多时候,纵切后的查询会变成多表关联查询,反而会增加查询压力和设计难度。
与以往不同,本次献上一份有料的中秋“ES月饼”:一个仅500K的ES数据库备份包。
消化这块“ES月饼”不但能掌握UD表
、视图汇总
等设计方法,还能获得一套完整的多仓库+批次管理
的ES仓储系统设计方案。
这个“月饼库”中实际上只包含4个模板,尽管如此,却足以颠覆
许多朋友以往的经验和观念。
进入“月饼库”我们能看到三个分类:单据,基础和查询。
单据中包含入库单
和出库单
,基础中包含仓库信息
和物料表
,一共四个模板。
–物料表–
–仓库信息–
–入库单–
编码
,批号
,数量
和备注
。注:关于数据库范式,请自行查阅相关资料以了解。
描述
,单位
等信息可以通过物料表查得,单据上就不需要保存这些字段。为了和用户交互,我们在数据明细表(D表)上叠加一个UI明细表(U表),这个U表不创建数据库表。这种设计方法就是UD表
。注:关于叠加方法请参考第五弹移花接木
视图汇总
。create view v_ZKC
as
select B2.描述,B1.数量,B2.单位,B2.物料编码,B2.物料分类
from (
select物料编码,sum(数量) as 数量
from ( select 物料编码,数量
from 入库单 A1,入库单_D A2 where A1.excelserverrcid=A2.excelserverrcid
union all
select 物料编码,-数量
from 出库单 A3,出库单_D A4 where A3.excelserverrcid=A4.excelserverrcid
) N
group by 物料编码
) B1
right join 物料表 B2 on B1.物料编码=B2.物料编码
进出明细
视图,批次库存
视图,在此不再赘述。“月饼库”是一个较完整的生态,也是所有系统的一个缩影,例如:BOM
、CRM
、HRM
、MRP
等。
本文着重介绍其中的两种设计方法:UD表
和视图汇总
。使用UD表可以使数据库设计符合范式,减少冗余;而使用视图汇总除了避免表间公式偶尔失灵的尴尬,还能有效减小数据库体积。
关于“月饼库”中的其他技巧细节,需要读者慢慢体会。
任何软件都会有这样那样的bug,ES也不另外。有些可爱的bug,就像早期EXCEL的格式刷bug一样,我们可以反过来利用它们为我们服务,实现一些很棒的功能。。
本文将针对ES的字段定义的小bug,实现一些可能抓破头也难以实现的需求。
如何做到呢?有些朋友会写一条提数公式,在保存前执行,清空库存数
。这确实是不错的办法,但是,库存数
这个字段在数据库中仍然是存在的,只是没有数据。
那么库存数
这个字段在数据库不存在可以吗?答案是肯定的
。
首先,我们要在右侧扩展一下“库存”、“物料编号”和“批次”字段,将其定义为“明细表2”,(注意:原模板已定义主表和明细表1)
在定义第4步选择“以后再创建”,即不创建数据库表。
管理数据表
中将“明细表2”的“批次”和“编号”字段区域改为明细表1的区域
,保存。这样就完成了字段的叠加共用
(这是移花接木
精髓所在^_^,直接在已有字段上定义会报错)
由于明细表2的部分字段叠加在明细表1上,所以使用数据规范和定义表间公式就会比较讲究。
我们要在明细表2
(确切的说,是上层
的表)的编号上使用列表规范
这样一旦用户选择了物料,由于字段叠加的关系,明细表1也能获得“编号”和“批号”数据,这样我们就可以用表间公式把其他信息如“描述”,“单位”等填入明细1。
要注意的是:这个提数公式的筛选条件要设明细表2(确切的说,是
上层的表),而填充匹配时时选择明细表1
。
填入公式
非常不解,如果字段是数值型,我们试图用表间公式的填入公式去填充=_price*_amount
这样的公式时,系统会报错。文本型
就可以使用“填入公式”了,保存定义好的表间公式后,再把文本型改为数值型
,这样就能保存数值,并可参与其他运算。部分版本(例如v12.0.100+)封锁了这个良性的叠加bug,我们可以通过修改名称定义来实现叠加,具体做法是打开名称管理器,找到需要改的字段名称,修改区域后,再点管理数据表
保存即可。
本文介绍了两个关于ES的小bug:一个是字段叠加
,一个是字段切换
。
希望可以抛砖引玉,启发读者拓展思维,实现更多巧妙的应用。