在開發(fā)ERP程序和其它一些企業(yè)程序的時候,經(jīng)常需要用到工廠掛歷,臺歷。工廠掛歷臺歷就是描述企業(yè)作息時間的一組程序或者數(shù)據(jù)。企業(yè)往往要根據(jù)掛歷臺歷來決定任務的性質(zhì)或作業(yè),而且這個掛歷臺歷是工廠實際使用的掛歷臺歷,不是簡單的雙休掛歷臺歷,需要能夠根據(jù)工廠的實際情況進行方便的調(diào)整。例如,當我們在下達生產(chǎn)訂單的時候,就要注意,不要將訂單下達到公司的休息日,如果碰到休息日要能夠自動順延。在計算訂單的加工時間的時候,需要系統(tǒng)自動將休息日挖去,只算工作日。如果因為特殊需要,需要將某個休息日確定為工作日時,系統(tǒng)要能夠很方便的調(diào)整。
在有些ERP中,只有一個工廠掛歷臺歷,即所有的分廠或車間等使用同一個掛歷臺歷。有的時候,可能不同的分廠或車間需要不同的掛歷臺歷,可能是因為有的分廠這段時間比較忙,需要加班,另一些分廠可能這段時間任務比較少,需要多放一些假。還有,我們在進行生產(chǎn)排產(chǎn)的時候,可能一個設(shè)備就需要一個掛歷臺歷,可能某些設(shè)備需要三班制運作,有些設(shè)備需要兩班制作業(yè),還有些設(shè)備一天上一個班就行了,有時候來了特別急的任務,一些設(shè)備需要臨時加班。因此我們不僅需要掛歷臺歷,可能還需要多個掛歷臺歷,而且掛歷臺歷的數(shù)量可能還比較多,甚至需要能夠動態(tài)添加,因為企業(yè)隨時都可能購進新的設(shè)備。
掛歷臺歷的設(shè)計方法很多,微軟的Project軟件中掛歷臺歷設(shè)計就是一種典型的設(shè)計方法,大家將Project用Access另存以后可能看到其掛歷臺歷的設(shè)計方法。
但Project掛歷臺歷的設(shè)計方法好像并不夠好,主要是當數(shù)據(jù)庫數(shù)據(jù)量比較大以后,系統(tǒng)的運行速度就變慢很多。更主要的是Project的掛歷臺歷設(shè)計方法不能通過SQL語句進行高效的查詢和計算,比較適宜于流程型的語言的使用,使用SQL語言查詢和計算效率不高。
我的設(shè)計方法是純粹使用SQL的表進行掛歷臺歷設(shè)計。在SQL數(shù)據(jù)庫中建立一個表,只需要四個字段,第一個是掛歷臺歷日期,datetime類型,將從某個開始日期到某個結(jié)束日期的所有日期按次序記錄在表中。例如從2008年1月1日到2008年12月31日,那么這個表就有365條記錄,如果考慮程序需要使用50年,那么表中應該有約18250條記錄。 第二個字段是工作日數(shù)量,int類型。從掛歷臺歷的起始日期開始,有一個工作日數(shù)字自動加一,休息日數(shù)字加零。 第三個字段是表示該記錄所表示的日期是休息日還是工作日,bit類型,也可以是int類型或tinyint類型,可以用1表示工作日,用0表示休息日。
第四個字段是對應工作日日期,datetime類型。如果今天是工作日,則該字段的日期等于第一個字段的日期;如果今天是休息日,則該日期就是該日期之前最近的工作日的日期。
這樣在下達訂單時,凡是碰到日期的數(shù)據(jù),一律用數(shù)據(jù)庫中的第四個字段代替,這樣計算就變成了查表。碰到計算兩個日期之間的工作日個數(shù)時,只要用兩個日期之間的第二個字段減一下就可以了,碰到跨年度這樣的復雜計算和靈活工作日的計算也變得很簡單了,一個簡單的減法運算就OK了。
這種方法不僅使日期的計算變得簡單,同時日期的設(shè)置修改也很容易和高效。修改掛歷臺歷首先修改第三個字段,就是將第三個字段的零改成1,1改成0.然后修改第二個字段,將休息日改成工作日時,就是將從修改日起的所有工作日數(shù)量自動加1;將工作日改成休息日,就是將從修改日起的所有工作日數(shù)量字段自動減1 。最后修改第四個字段,將休息日改成工作日時,令該字段等于第一個字段的日期,否則該字段改成最近的上一個工作日日期。
如果需要多個掛歷臺歷時,例如企業(yè)可能需要多個分廠,并且需要設(shè)置成不同的掛歷臺歷時,可以再在這個掛歷臺歷表上加一個分廠ID字段就行了,查詢的時候在增加一個條件就可以了。