首頁‎ > ‎電子期刊‎ > ‎2005 年 第 12 期‎ > ‎

排課系統解析-物件導向程式設計案例研究(七)


摘要

  • 文章編號:20050904
  • 投稿日期:2005/08/25
  • 作者:董世尊、徐志祥、施志樹、何建良、吳致中、葉志強
  • 備註:


前言

在前期當中,已詳細解說檢查流程寫法作一個完整的說明,本期則是要為分課程序做一個解說。

分課說明

在AllocEvent中,基本的分課資料皆在CEvent(註一)處理,等待檢查流程結束傳Allocevent分配時數,同步更新給 CEvent新增星期與節次,CEvent再傳遞給Who(教師資料)、Where(地點資料)、Whom(班級資料)、What(科目資料)。 AllocEvent的功用:分配給Who、Where、Whom、What更新其時數資料,每項資料都具有關聯性。

首先在分課前必須先執行檢查流程,當「檢查流程」未執行時,則跳出迴圈,或已經分派完成,也跳出迴圈。開始準備任務時,從Period模組 取得WeekDay星期幾、BeginTime開始時間、Duration持續時間、LocID地點ID資料從TestSchedule中取得 WeekFlag單雙週、EventID分課ID、WhatID科目ID資料輸入到Appointment(註二),也就是所謂的課堂資訊置入 Appointment之中,然而後開始依照資料條件開始分配教師、教室、班級(班級資訊),在為班級分配課表,安排星期跟節次。完成後,再清除變數,幫 下一個課堂安排上課時間。

而使用到AllocEvent的有ScheduleEvent分課流程、GetCandidates取得候選人、IsEventExchangable 手動調課用、OpenDb開啟資料庫、AutoSchedule自動排課(計算總時數,然後更新)這幾項。 在AutoSchedule中,

If TestSchedule(evtTest, .WeekDay,

.PeriodNo) = 0 Then

AllocEvent

在prdTest內的上課時間、課堂Period尚未處理的話就執行AllocEvent分配課表從檢查流程中的evtTested取得可 解決方案(參照前期)。在前期期刊所提及的自動排課的流程中, 觀看ManualLock(資料鎖定) 是否鎖定,true則跳到下一筆資料處理,並執行檢查流程(TestSchedule)檢查其資料是否在與其檢查條件有發生衝突,如果並無產生衝突,則執 行AllocEvent。將檢查流程中取得解決方案置入AllocEvent裡。

[編輯] AllocEvent流程說明

在AllocEvent中,先行測試evtTested (參照前期)是否是空值,如果不是,再測試是否已經委派好星期、節次,這邊主要是判斷是否有必要為資料進行分課動作,如果以上有任一條件達成,則跳出此Sub,不需再次花費時間進行無謂的分課動作。

確定好evtTested(參照前期)以測試過檢查流程且並無分配過星期、節次,可開始準備任務,取得排課資訊。我們將從Period、 evtTested取得星期、課堂開始時間、持續時間、地點ID、單雙周、分課ID、地點ID等資料,利用For Each迴圈把資料寫入我們先設的一個變數appNew之中,再來分配教師、教室、班級,首先來講教室,設一變數whoTest繼承了Who屬性,設如果 whoTest不等於空值,確定才進入迴圈內,我們在這利用With來使用who裡面的Appointments(取得新值),使用foreach迴圈裡 頭判斷式加入appMember(繼承Appointment屬性)資料,把排定好的資料作一個更新,下面的分配教室、班級寫法均大同小異,皆用此方式發 佈。

最後階段,取得的值分配到分課表上,把Periods模組的星期、節次資訊丟至evtTested之中,在設定星期與節次中使用Variable模組(見下期期刊)來測試找尋適合的數值。然後清除各變數,等待下一個數值進入以便測試。

註一 CEvent:取得分課屬性(是否手動鎖定、跨中午設定、單雙周設定、優先權、節數長度、節次、星期、班級ID、科目ID、場地ID、分課ID、指定星期與節次的限制條件、課程ID、時間表的ID) ,供給其他class使用。

註二 Appointment:取得分課資料(分課編號、地點ID、'科目ID、星期、持續時間、開始時間、單雙周設定) ,供給其他class使用。


Comments