工厂日历设计

在开发ERP程序和其它一些企业程序的时候,经常需要用到工厂日历。工厂日历就是描述企业作息时间的一组程序或者数据。企业往往要根据日历来决定任务的性质或作业,而且这个日历是工厂实际使用的日历,不是简单的双休日历,需要能够根据工厂的实际情况进行方便的调整。例如,当我们在下达生产订单的时候,就要注意,不要将订单下达到公司的休息日,如果碰到休息日要能够自动顺延。在计算订单的加工时间的时候,需要系统自动将休息日挖去,只算工作日。如果因为特殊需要,需要将某个休息日确定为工作日时,系统要能够很方便的调整。
 
在有些ERP中,只有一个工厂日历,即所有的分厂或车间等使用同一个日历。有的时候,可能不同的分厂或车间需要不同的日历,可能是因为有的分厂这段时间比较忙,需要加班,另一些分厂可能这段时间任务比较少,需要多放一些假。还有,我们在进行生产排产的时候,可能一个设备就需要一个日历,可能某些设备需要三班制运作,有些设备需要两班制作业,还有些设备一天上一个班就行了,有时候来了特别急的任务,一些设备需要临时加班。因此我们不仅需要日历,可能还需要多个日历,而且日历的数量可能还比较多,甚至需要能够动态添加,因为企业随时都可能购进新的设备。
 
日历的设计方法很多,微软的Project软件中日历设计就是一种典型的设计方法,大家将Project用Access另存以后可能看到其日历的设计方法。
 
但Project日历的设计方法好像并不够好,主要是当数据库数据量比较大以后,系统的运行速度就变慢很多。更主要的是Project的日历设计方法不能通过SQL语句进行高效的查询和计算,比较适宜于流程型的语言的使用,使用SQL语言查询和计算效率不高。
 
我的设计方法是纯粹使用SQL的表进行日历设计。在SQL数据库中建立一个表,只需要四个字段,第一个是日历日期,datetime类型,将从某个开始日期到某个结束日期的所有日期按次序记录在表中。例如从2008年1月1日到2008年12月31日,那么这个表就有365条记录,如果考虑程序需要使用50年,那么表中应该有约18250条记录。
第二个字段是工作日数量,int类型。从日历的起始日期开始,有一个工作日数字自动加一,休息日数字加零。
第三个字段是表示该记录所表示的日期是休息日还是工作日,bit类型,也可以是int类型或tinyint类型,可以用1表示工作日,用0表示休息日。
第四个字段是对应工作日日期,datetime类型。如果今天是工作日,则该字段的日期等于第一个字段的日期;如果今天是休息日,则该日期就是该日期之前最近的工作日的日期。
 
这样在下达订单时,凡是碰到日期的数据,一律用数据库中的第四个字段代替,这样计算就变成了查表。碰到计算两个日期之间的工作日个数时,只要用两个日期之间的第二个字段减一下就可以了,碰到跨年度这样的复杂计算和灵活工作日的计算也变得很简单了,一个简单的减法运算就OK了。
 
这种方法不仅使日期的计算变得简单,同时日期的设置修改也很容易和高效。修改日历首先修改第三个字段,就是将第三个字段的零改成1,1改成0.然后修改第二个字段,将休息日改成工作日时,就是将从修改日起的所有工作日数量自动加1;将工作日改成休息日,就是将从修改日起的所有工作日数量字段自动减1 。最后修改第四个字段,将休息日改成工作日时,令该字段等于第一个字段的日期,否则该字段改成最近的上一个工作日日期。
 
如果需要多个日历时,例如企业可能需要多个分厂,并且需要设置成不同的日历时,可以再在这个日历表上加一个分厂ID字段就行了,查询的时候在增加一个条件就可以了。当然有几个分厂就需要增加几倍的数据。在一般情况下,50万条左右的记录对数据查询速度的影响不明显,完全可以做在一张表上。
 
如果需要的日历数量特别多,且日历时间范围特别大的时候,可以分到几个表上,在查询的时候用我上一篇文章中讲到的动态表名查询的方法也可以解决,这就是一种空间换时间的方法。这种方法占据了比较大的磁盘空间,但却换来了查询速度快的优点。对于对查询速度要求不高,查询复杂度不高的程序,可能用Project的方法能够节省更多的磁盘空间。但在目前大多数情况下是速度要求高,随着磁盘单位字节容量价格的下降,这种方法可能更有价值。
 
对于像生产排产这样系统需要的日历,不仅日历的数量特别多,而且需要精确到分钟。但原理是相同的,完全可以采取和上面相同的方法去设计设备日历,将表名设计成设备编号,利用动态查表的方法进行数据查询。还可以将设备进行分类,用设备标号或类型号作为表名,在表内部再增加表示具体设备的字段。对于精确到小时的日历,存放一年的数据有8760条记录,对于精确到分钟的日历,存放一年的日历有52560条记录,因此作为需要精确到分钟的设备排产日历,日历日期范围不宜太大,但可以经常备份更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值