Visual Basic 6.0 (VB6) 程式語言案例學習 (04. 人事考勤管理系統)
Visual Basic 6.0 (VB6) 程式語言案例學習 (04. 人事考勤管理系統)¶
4.1 問題¶
這也是紙本作業流程想要電腦化的需求,每年度有四次的評鑑,前三次的評鑑是由單位主管執行,而最後一次是由單位主管評分後,交由高層會議整合,訂出最後的評鑑考績。以往的做法就是先依據每一個單位,做出許多Excel表格,然後會整起來,變成一張Excel統計表,保留起來等待到下次評鑑時,同樣的步驟繼續進行,到第四次之後,這三張統計表的成績將作為第四次評鑑的參考,甚至有些個案會參考到更久之前的成績,為求能夠審慎的評鑑。
這項工作困難點在於,人員有新進、離職、留職停薪、…等等因素,並且要收集各單位的檔案,檔案繳交時間點非常零散,整理表格時要依照人員屬性而有不同的評鑑主管,例如:甲老師是國文科召集人,因職務原故評鑑單位為教務處、學務處、總務處、諮商中心、資源中心;乙老師是美育組長,評鑑單位為教務處、總務處、資源中心。總共有三百人左右,每個人員所屬職務不同,評鑑單位也不同。而計分方式,也是依照職務屬性而有不同百分比計算,例如:甲老師是國文科召集人,因此教務處評分佔60%,其餘單位的評分是佔10%;乙老師是美育組長,教務處佔20%,總務處佔10%,資源中心佔70%。而評鑑資料處理並非專人專責,而是由人事室的成員分攤處理,這又增加了複雜度。例如:交接的時候不清楚,有可能之後處理的人員,多了重複的作業。有些時候先紀錄在紙本上,尚未登錄在Excel統計表時,也有可能造成問題。但評鑑工作還是得進行,而且要審慎的計算,因為這會影響到考績。
因此希望能夠電腦化,簡化流程,而且調閱歷史資料要十分容易,並且可以透過筆記型電腦,於會議室投影,讓高層會議整合時可以直接填寫成績。
4.2 需求¶
表格 4‑1 「人事考勤管理系統」系統目的分析表
版本:1.0 | 要做什麼 | 不要做什麼(不要做不代表不會做) |
---|---|---|
能做什麼 | (第一格:必要項目) | (第二格:次要項目) |
所有資料(包含編號)經過修改之後,資料仍然要能夠保留關聯。 | 依據人員職責而有不同的權限。 | |
要能夠匯入各單位主管送來的Excel檔案。 | 提供年報表可列印以年度為單位的成績。 | |
要能夠手動檢視或編輯成績。 | 提供年評鑑可參考每年的成績。 | |
所有成績都要能夠保留,以便做歷史資料查詢。 | 提供分析前幾名優秀人員的資料。 | |
季評鑑介面要簡單,容易操作,容易修改。 | 提供分析最差成績分析的資料。 | |
季報表要依據規則列印,並且提供預覽列印及匯出成為Excel檔。 | ||
資料庫維護必須操作簡單,而且隨時得以備份或者是還原。 | ||
人員管理要能夠新增、刪除、修改,除此之外要能夠匯入照片,還要能夠設定評分的百分比及所屬單位。 | ||
處室管理要能夠新增、刪除、修改,除此之外還要能夠不影響資料關聯。 | ||
要具有密碼變更的功能。 | ||
預留密碼忘記時的處理方法。 | ||
不能做什麼(不能做代表不需要做) | (第三格:不必要項目) | (第四格:不需要項目) |
透過網站機制,讓評鑑工作也可以透過網站編輯。 | 將資料庫上載到SQL SERVER,並建立成網路版的應用程式。 | |
提供個人歷年成績的報表,以及分析能力。 | 將系統加入WorkFlow的觀念,提供每日工作列表,並加入稽核的功能。 | |
建立資料編碼與解碼的功能,避免資料庫遭到竊取之後,資料會外洩。 |
表格 4‑2 「人事考勤管理系統」系統目標分析表
版本: | 重要 | 不重要 |
---|---|---|
優先 | (重) | (急) |
所有資料(包含編號)經過修改之後,資料仍然要能夠保留關聯。 | 資料庫維護必須操作簡單,而且隨時得以備份或者是還原。 | |
要能夠匯入各單位主管送來的Excel檔案。 | 要能夠手動檢視或編輯成績。 | |
所有成績都要能夠保留,以便做歷史資料查詢。 | ||
人員管理要能夠新增、刪除、修改,除此之外要能夠匯入照片,還要能夠設定評分的百分比及所屬單位。 | ||
處室管理要能夠新增、刪除、修改,除此之外還要能夠不影響資料關聯。 | ||
不急迫 | (輕) | (緩) |
季評鑑介面要簡單,容易操作,容易修改。 | 要具有密碼變更的功能。 | |
季報表要依據規則列印,並且提供預覽列印及匯出成為Excel檔。 | 預留密碼忘記時的處理方法。 |
表格 4‑3 「人事考勤管理系統」系統規格表
規格項目 | 規格內容 | 備註 |
---|---|---|
起始介面 | 功能表依照作業流程由左到右循序安排。 | … |
Excel匯入 | 要能夠匯入制定好的Excel檔案。 | … |
手動輸入 | 要能夠檢視歷年成績,能夠編輯成績,並列印報表。 | … |
季評鑑 | 操作介面全部使用點選方式,除了輸入修正成績之外採用數字鍵。 | … |
要能夠檢視歷年成績。 | ||
顯示全年度的成績平均值。 | ||
顯示評語。 | ||
季報表 | 提供預覽列印、匯出Excel檔。 | |
能選擇歷年成績以及以季為單位的顯示。 | … | |
資料庫維護 | 提供備份、測試、還原的功能,並得以在任何時間點執行。 | … |
人員管理 | 得以編輯人員,要能新增、刪除、修改。 | … |
要能夠匯入照片。 | ||
要能夠設定所屬單位以及評分百分比。 | ||
處室管理 | 要能新增、刪除、修改處室資料,並且於修改後仍保持資料的關聯。 | … |
變更密碼 | 要能變更密碼。 | … |
4.3 特色¶
特點在於針對教職員每學期自我評鑑以及長官評鑑,以及可匯入Excel檔案,亦可產生報表。原本評鑑是紙上作業,電腦化之後,各單位只需繳交Excel檔案,就可完成評鑑工作。
可應用於人事考勤管理。
4.4 使用工具¶
語言 | 軟體 |
---|---|
Visual Baisc 6.0 | MS Visual Basic 6.0、MS Access |
4.5 系統架構¶
筆者曾思考要重新修改整個流程,透過網頁的方式以及單機的程式搭配,完成一套全新的評鑑系統。可是對於各個不同背景的單位主管來說,現有的流程是他們所熟悉而且運行已久的,要讓他們切換整個操作模式,可能會遇到問題。因此與人事室研究之後,儘量在終端的部分不要有變動,這樣才有利於推廣上線,筆者也認為系統要能順利推廣,也是在於所有參予者的配合,否則系統將無疾而終,因此系統架構的主要思維,只有在於人事室處理的流程修改,客戶端只有Excel檔的格式略有變動。
首先終端的部分筆者制定標準的欄位格式,因為欄位錯誤系統將無法抓到資料,因此這點是必須加以限制,不能再隨意的輸入,採取的做法一樣是收集各單位主管的Excel檔案,只是現在系統能夠匯入,以便紀錄資料及分析資料。
系統的部分,資料分為手動輸入及Excel匯入,先由Excel匯入資料,而後使用檢視畫面,查看資料是否正確,可以透過手動輸入的方式修改資料,這樣也可以解決有些單位主管僅以電話告知成績時,不用先記在紙本上,就可以直接手動輸入到系統中。
而檢視的部分專為會議而設計,因此操作介面十分簡單易懂,點選人名,點選年度,就可帶出經過系統分析後的成績,甚至歷史成績也可以藉由介面帶出,所有操作皆以點選的方式,唯獨修改成績時,必須輸入數字。
關於資料設定的部分,提供人員基本資料編輯,在這裡可以設定分析的百分比,以及人員相關資料。系統並提供備份機制,可以於任何時間點做整個資料庫的備份。
整個系統以資料處理流程來看,依序分為輸入、評鑑、設定。
而在手動輸入、人員管理及季評鑑的部分,採取自訂控制項的做法,是為了往後方便移植,或者是更版,因為若將來評鑑制度有所變動時,您可採取置換自訂控制項的做法,而無須重新撰寫程式,因為可以確定的是作業流程幾乎不會有變動,會變動的是計算評鑑的公式或方法,使用自訂控制項的設計,足以應付以後的變動。
4.6 程式實作¶
由於本程式必須於高層會議做投影展示,因此程式美觀上我們會有所要求,但又不願意花費太多時間,因此採用最快速的方式,就是透過vbSkinner元件來協助,我們希望能夠讓您了解vbSkinner的便利性,因此介紹這款免費的元件。
注意:此元件已無法安裝至 Windows 10 或之後的版本。因此使用 Windows 10 可以忽略這一段。
4.6.1 vbSkinner元件安裝¶
Step 1:如圖19-1,連線到 http://www.visual-basic.com.ar/。
注意:此網站已經關閉,教材解壓縮後有兩個安裝檔,分別是 skfree.exe、skpro.exe 。通常安裝 skfree.exe 免費版即可。但 Windows 10 以後的版本會安裝失敗。
圖 4‑1 http://www.visual-basic.com.ar/ 網站
Step 2:如圖19-2,點選Download,接著點選Download setup program of vbSkinner Free.。
圖 4‑2 Download setup program of vbSkinner Free.
Step 3:如圖 4-3,下載vbSkinner。
圖 4‑3 下載vbSkinner
Step 4:如圖 4-4,安裝vbSkinner。
圖 4‑4 安裝vbSkinner
Step 5:如圖 4-5,點選Install。
圖 4‑5 Install
4.6.2 引用vbSkinner元件¶
Step 1:如圖 4-6,點選專案,點選設定使用元件。
圖 4‑6 引用元件
Step 2:如圖 4-7,勾選vbSkinner Free 2 for VB6。
圖 4‑7 vbSkinner Free 2 for VB6
Step 3:如圖 4-8,確認出現SmartMenuXP、Skinner。
圖 4‑8 SmartMenuXP、Skinner
4.6.3 系統啟始介面¶
Step 1:如圖19-9,首先我們來看系統啟始介面,必須引用SmartMenuXP、Skinner。如果是 Windows 10 以上版本,可以忽略這一段。關於 SmartMenuXP1 元件的部分。用 Visual Basic 6 內建的選單來做。
圖 4‑9 系統啟始介面
Step 2:接下來我們把程式碼插入介面中,要介紹介面是因為使用SmartMenuXP元件所開發,而使用的方法並非VB6所內建的,因此認為有必要介紹出來。
'設定所有變數必須宣告才能使用 Option Explicit '宣告密碼字串變數 Public strPassword As String '介面初始化事件副程式 Private Sub Form_Initialize() '藉由登錄檔取得使用者密碼 strPassword = GetSetting(App.Title, "USER", "PW", "") '當密碼等於空時 If Len(strPassword) > 0 Then '顯示和隱藏與密碼有關的控制項 Label2.Visible = True Label3.Visible = True Text1.Visible = True Command1.Visible = True Command2.Visible = False '顯示提示訊息 Label3.Caption = "訊息:請輸入密碼" End If '藉由登錄檔取得資料庫的路徑 strDBPath = GetSetting("NSSH_Criticize", "Share", "DBPath", App.Path & "\db1.mdb") End Sub
'設定標籤點選事件副程式 '這一段的用途在於當使用者忘記密碼時,可以透過這個功能,重新設定密碼 Private Sub Label1_Click() '宣告靜態變數 Static countI As Integer '每點選一下累加計數器 countI = countI + 1 '當計數器大於50時 If countI > 50 Then '呼叫顯示管理者的選單 Call LoadMenu("Admin") '計數器歸零 countI = 0 End If End Sub
'登入按鈕點選事件副程式 Private Sub Command1_Click() '當密碼正確時 If Text1.Text = Trim(strPassword) Then '載入管理者選單副程式 Call LoadMenu("Admin") '隱藏登入時用到的控制項 Label2.Visible = False Label3.Visible = False Text1.Visible = False Command1.Visible = False Command2.Visible = False '清除文字 Text1.Tag = "" Text1.Text = "" '反之 Else '繼續顯示登入時用到的控制項 Label2.Visible = True Label3.Visible = True Text1.Visible = True Command1.Visible = True Command2.Visible = False '顯示訊息 Label3.Caption = "訊息:密碼錯誤" End If End Sub
'變更密碼按鈕點選事件副程式 Private Sub Command2_Click() '取得登錄檔的使用者密碼 strPassword = GetSetting(App.Title, "USER", "PW", "") '當文字紀錄為空時 If Text1.Tag = "" Then '當密碼與文字輸入不對時 If Text1.Text <> Trim(strPassword) Then '顯示提示訊息 Label3.Caption = "訊息:請輸入原密碼。" '當密碼與文字輸入正確時 ElseIf Text1.Text = Trim(strPassword) Then '顯示提示訊息請使用者設定新密碼 Label3.Caption = "訊息:請輸入新密碼。" Text1.Tag = "1" Text1.Text = "" End If '當紀錄為1時 ElseIf Text1.Tag = "1" Then '當文字輸入大於零時 If Len(Text1.Text) > 0 Then '顯示提示訊息 Label3.Caption = "訊息:請輸入新密碼。" '將新密碼儲存到登錄檔中 Call SaveSetting(App.Title, "USER", "PW", Trim(Text1.Text)) '顯示提示訊息 Label3.Caption = "訊息:密碼更新成功" '隱藏有關密碼的控制項 Label2.Visible = False Label3.Visible = False Text1.Visible = False Command1.Visible = False Command2.Visible = False '清空文字 Text1.Tag = "" Text1.Text = "" '載入管理者的選單 Call LoadMenu("Admin") '反之 Else '顯示提示訊息 Label3.Caption = "訊息:請輸入新密碼。" End If End If End Sub
'選單載入副程式 '我們在這裡只使用到管理者選單,其餘的部分是預留往後開發時使用 Private Sub LoadMenu(str_Level As String) '輸入的等級做判斷 Select Case Trim(str_Level) '當等級為來賓時 Case "Guest" '呼叫SmartMenuXp1元件 With SmartMenuXP1.MenuItems '清除所有項目 .Clear ' Root > 登入(keyStart)... .Add 0, "keyStart", , "開始 " .Add "keyStart", "keyLogin", , "登入 ", pGetPicture("OpenProjectFromWeb"), vbAltMask, vbKeyL .Add "keyStart", "keyStartS1", smiSeparator .Add "keyStart", "keyExit", , "結束 ", , vbAltMask, vbKeyQ End With '設定字型大小及樣式 SmartMenuXP1.Font.Name = "新細明體" SmartMenuXP1.Font.Size = 11 '當為輸入者時 Case "Importer" '呼叫SmartMenuXp1元件 With SmartMenuXP1.MenuItems '清除所有項目 .Clear ' Root > 登入(keyStart)... .Add 0, "keyStart", , "開始 " .Add "keyStart", "keyLogin", , "登入 ", pGetPicture("OpenProjectFromWeb"), vbAltMask, vbKeyL .Add "keyStart", "keyStartS1", smiSeparator .Add "keyStart", "keyExit", , "結束 ", , vbAltMask, vbKeyQ ' Root > 輸入資料(keyImport)... .Add 0, "keyImport", , "輸入資料 " .Add "keyImport", "keyExcel", , "Excel匯入 ", , vbCtrlMask + vbShiftMask, vbKeyE .Add "keyImport", "keyCustom", , "手動輸入 ", , vbCtrlMask + vbShiftMask, vbKeyM End With '設定字型大小及樣式 SmartMenuXP1.Font.Name = "新細明體" SmartMenuXP1.Font.Size = 11 '當為驗證者時 Case "Examine" '呼叫SmartMenuXp1元件 With SmartMenuXP1.MenuItems '清除所有項目 .Clear ' Root > 登入(keyStart)... .Add 0, "keyStart", , "開始 " .Add "keyStart", "keyLogin", , "登入 ", pGetPicture("OpenProjectFromWeb"), vbAltMask, vbKeyL .Add "keyStart", "keyStartS1", smiSeparator .Add "keyStart", "keyExit", , "結束 ", , vbAltMask, vbKeyQ ' Root > 輸入資料(keyImport)... .Add 0, "keyImport", , "輸入資料 " .Add "keyImport", "keyExcel", , "Excel匯入 ", , vbCtrlMask + vbShiftMask, vbKeyE .Add "keyImport", "keyCustom", , "手動輸入 ", , vbCtrlMask + vbShiftMask, vbKeyM ' Root > 評鑑(Criticize)... .Add 0, "keyCriticize", , "評鑑 " .Add "keyCriticize", "keyCriticizeOne", , "季評鑑 ", , vbAltMask, vbKey1 .Add "keyCriticize", "keyCriticizeTwo", , "年評鑑 ", , vbAltMask, vbKey2 .Add "keyCriticize", "keyImportS2", smiSeparator .Add "keyCriticize", "keyReportOne", , "季報表 ", , vbAltMask, vbKey3 .Add "keyCriticize", "keyReportTwo", , "年報表 ", , vbAltMask, vbKey4 End With '設定字型大小及樣式 SmartMenuXP1.Font.Name = "新細明體" SmartMenuXP1.Font.Size = 11 '當為管理者時 Case "Admin" '呼叫SmartMenuXp1元件 With SmartMenuXP1.MenuItems '清除所有項目 .Clear ' Root > 登入(keyStart)... .Add 0, "keyStart", , "開始 " .Add "keyStart", "keyExit", , "結束 ", , vbAltMask, vbKeyQ ' Root > 輸入資料(keyImport)... .Add 0, "keyImport", , "輸入資料 " .Add "keyImport", "keyExcel", , "Excel匯入 ", , vbCtrlMask + vbShiftMask, vbKeyE .Add "keyImport", "keyCustom", , "手動輸入 ", , vbCtrlMask + vbShiftMask, vbKeyM ' Root > 評鑑(Criticize)... .Add 0, "keyCriticize", , "評鑑 " .Add "keyCriticize", "keyCriticizeOne", , "季評鑑 ", , vbAltMask, vbKey1 .Add "keyCriticize", "keyImportS2", smiSeparator .Add "keyCriticize", "keyReportOne", , "季報表 ", , vbAltMask, vbKey3 ' Root > 管理(Admin)... .Add 0, "keyAdmin", , "設定 " .Add "keyAdmin", "keyDBPath", , "資料庫維護 " .Add "keyAdmin", "keySetupPeople", , "人員管理 " .Add "keyAdmin", "keySetupOffice", , "處室管理 " .Add "keyAdmin", "keySetupPassword", , "變更密碼 " End With '設定字型大小及樣式 SmartMenuXP1.Font.Name = "新細明體" SmartMenuXP1.Font.Size = 11 End Select End Sub
'載入圖形函式 Private Function pGetPicture(sFileName As String) As StdPicture '宣告計數變數 Dim c As Long '巡覽所有的影像物件 For c = 1 To imlIcons.ListImages.Count '依序判斷鍵值 If LCase(imlIcons.ListImages(c).Key) = LCase(sFileName) Then '設定圖形 Set pGetPicture = imlIcons.ListImages(c).ExtractIcon End If Next End Function
'使用SmartMenuXP1選單項目點選事件副程式 Private Sub SmartMenuXP1_Click(ByVal ID As Long) '宣告計數變數 Dim c As Long '使用SmartMenuXP1的選單項目 With SmartMenuXP1.MenuItems '依照鍵值做判斷 Select Case .Key(ID) '手動匯入Excel Case "keyExcel" frmExcel.Show 1 '帳號管理 Case "keySetupAccount" frmSetup_Account.Show 1 '人員管理 Case "keySetupPeople" frmSetup_People.Show 1 '處室管理 Case "keySetupOffice" frmSetup_Office.Show 1 '季評鑑 Case "keyCriticizeOne" frmCriticizeOne.Show 1 '資料庫備份及還原 Case "keyDBPath" frmSetup_DBPath.Show 1 '手動輸入 Case "keyCustom" frmEdit.Show 1 '季評鑑報表 Case "keyReportOne" frmReportOne.Show 1 '設定新密碼 Case "keySetupPassword" '使用SmartMenuXP1的選單項目 With SmartMenuXP1.MenuItems '清除項目 .Clear End With '顯示或隱藏控制項 Label2.Visible = True Label3.Visible = True Text1.Visible = True Command1.Visible = False Command2.Visible = True '提示訊息 Label3.Caption = "訊息:請輸入原密碼。" '離開結束程式 Case "keyExit" '結束程式 End End Select End With End Sub
4.6.4 匯入Excel¶
Step 1:如圖 4-10,首先我們來看匯入Excel介面,我們設計親切的畫面,並且明確註明步驟流程,增加程式的親和力。
圖 4‑10 匯入Excel介面
Step 2:請將以下程式碼插入介面中。
'設定所有變數必須宣告才能使用 Option Explicit '宣告EXCEL的物件類別 Dim objExcel As clsExcel '宣告常數,這是用來開啟目錄視窗用的 Private Const BIF_RETURNONLYFSDIRS = 1 Private Const BIF_DONTGOBELOWDOMAIN = 2 Private Const MAX_PATH = 260 '開啟目錄視窗的API Private Declare Function SHBrowseForFolder Lib "shell32" _ (lpbi As BrowseInfo) As Long '取得路徑的API Private Declare Function SHGetPathFromIDList Lib "shell32" _ (ByVal pidList As Long, ByVal lpBuffer As String) As Long '複製字串的API Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" _ (ByVal lpString1 As String, ByVal lpString2 As String) As Long '目錄視窗API的資料結構 Private Type BrowseInfo hWndOwner As Long pIDLRoot As Long pszDisplayName As Long lpszTitle As Long ulFlags As Long lpfnCallback As Long lParam As Long iImage As Long End Type '目錄視窗型態的列舉型別 Private Enum BrowseForFolderFlags ReturnFileSystemFoldersOnly = &H1 DontGoBelowDomain = &H2 IncludeStatusText = &H4 BrowseForComputer = &H1000 BrowseForPrinter = &H2000 BrowseIncludeFiles = &H4000 IncludeTextBox = &H10 ReturnFileSystemAncestors = &H8 End Enum '目錄視窗的目錄列舉型別 Private Enum Folders Desktop = &H0 Internet = &H1 Programs = &H2 ControlsFolder = &H3 Printers = &H4 Personal = &H5 Favorites = &H6 StartUp = &H7 Recent = &H8 SendTo = &H9 RecycleBin = &HA StartMenu = &HB DesktopDirectory = &H10 Drives = &H11 Network = &H12 Nethood = &H13 Fonts = &H14 Templates = &H15 Common_StartMenu = &H16 Common_Programs = &H17 Common_StartUp = &H18 Common_DesktopDirectory = &H19 ApplicationData = &H1A PrintHood = &H1B AltStartUp = &H1D Common_AltStartUp = &H1E Common_Favorites = &H1F InternetCache = &H20 Cookies = &H21 History = &H22 End Enum '宣告存放資料的陣列 Dim Grade(20, 2) As String
'Excel匯入的初始化事件副程式 Private Sub Form_Load() '宣告計數變數 Dim lngI As Long '設定圖像 Set Image1(0).Picture = ImageList1.ListImages(1).Picture Set Image1(1).Picture = ImageList1.ListImages(2).Picture Set Image1(2).Picture = ImageList1.ListImages(3).Picture Set Image1(3).Picture = ImageList1.ListImages(4).Picture Set Image1(4).Picture = ImageList1.ListImages(5).Picture '設定評鑑選項 For lngI = 0 To 100 Combo2.AddItem Trim(Str(2000 + lngI)), lngI Next lngI '設定選擇年為系統年 Combo2.Text = Year(Date) '設定評鑑選項 Combo1.AddItem "第一次評鑑", 0 Combo1.AddItem "第二次評鑑", 1 Combo1.AddItem "第三次評鑑", 2 Combo1.AddItem "全學年評鑑", 3 '載入處室名稱 Dim objCnn_B As ADODB.Connection Dim objRst_B As ADODB.Recordset Set objCnn_B = New ADODB.Connection Set objRst_B = New ADODB.Recordset objCnn_B.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strDBPath & ";" & _ "Persist Security Info=False" objRst_B.Open "select * from [處室名稱] Order By [OID] ASC", _ objCnn_B, adOpenStatic, adLockPessimistic Combo3.Clear lngI = 0 Do Until objRst_B.EOF Combo3.AddItem Trim(objRst_B("ONAME") & "") Grade(lngI, 0) = Trim(objRst_B("AID") & "") Grade(lngI, 1) = Trim(objRst_B("ONAME") & "") lngI = lngI + 1 objRst_B.MoveNext Loop objRst_B.Close objCnn_B.Close Set objRst_B = Nothing Set objCnn_B = Nothing End Sub
'開啟目錄按鈕點選事件副程式 Private Sub Command1_Click() '使用方式已經於11.7節中介紹過了,因此在這裡不再贅述 Dim lpIDList As Long Dim sBuffer As String Dim szTitle As String Dim tBrowseInfo As BrowseInfo szTitle = "請選擇資料夾或檔案" With tBrowseInfo .hWndOwner = Me.hWnd .lpszTitle = lstrcat(szTitle, "") .ulFlags = BrowseIncludeFiles Or IncludeTextBox .pIDLRoot = Folders.Desktop End With lpIDList = SHBrowseForFolder(tBrowseInfo) If (lpIDList) Then sBuffer = Space(MAX_PATH) SHGetPathFromIDList lpIDList, sBuffer sBuffer = Left(sBuffer, InStr(sBuffer, vbNullChar) - 1) Text1.Text = sBuffer Call SaveSetting("NSSH_人事室", "自評系統", "Excel檔案轉換路徑", sBuffer) End If End Sub
'開始轉換按鈕點選事件副程式 Private Sub Command2_Click() '判斷是否有檔名 If Len(Trim(Text1.Text & "")) <= 0 Then labExcel_Message.Caption = "匯入檔案不正確。" Exit Sub End If '判斷是否有選擇處室 If Len(Trim(Combo3.Text & "")) <= 0 Then labExcel_Message.Caption = "處室不正確。" Exit Sub End If '判斷是否有選擇評鑑名稱 If Len(Trim(Combo1.Text & "")) <= 0 Then labExcel_Message.Caption = "評鑑名稱不正確。" Exit Sub End If '檢查路徑是否正確 Dim objFso As FileSystemObject Set objFso = New FileSystemObject Text1.Text = Trim(Text1.Text & "") If objFso.FileExists(Trim(Text1.Text) & "") = False Then labExcel_Message.Caption = "檔案不存在。" Exit Sub End If Set objFso = Nothing '開始轉換 Dim strRet As String labExcel_Message.ForeColor = vbBlack labExcel_Message.Caption = "開始轉換。" DoEvents '建立Excel物件 Set objExcel = New clsExcel '透過Excel物件轉換資料 strRet = objExcel.ExportExcelSheetToAccess("評鑑名單", _ Text1.Text, _ "TestTable", _ App.Path & "\db2.mdb") '釋放記憶體空間 Set objExcel = Nothing '若轉換失敗 If strRet <> "資料表轉換成功。" Then '顯示失敗訊息 labExcel_Message.ForeColor = vbRed labExcel_Message.Caption = strRet '跳離副程式 Exit Sub End If '顯示成功訊息 labExcel_Message.ForeColor = vbBlack labExcel_Message.Caption = strRet '宣告處室字串變數 Dim str_Grade As String '宣告計數變數 Dim lngI As Long '巡覽所有資料 For lngI = 0 To UBound(Grade) '當找到該處室 If Grade(lngI, 1) = Trim(Combo3.Text & "") Then '設定處室名稱 str_Grade = Grade(lngI, 0) '跳離迴圈 Exit For End If Next lngI '判斷是否有處室名稱 If Len(str_Grade) <= 0 Then labExcel_Message.ForeColor = vbRed labExcel_Message.Caption = "Excel檔案格式有誤。" Exit Sub End If '轉入暫存檔中 '宣告要轉換資料時所需的物件 Dim strCnn As String Dim strSQL As String Dim objCnn As ADODB.Connection Dim objCnn_Temp As ADODB.Connection Dim objRst_Temp As ADODB.Recordset Dim objRst_Grade As ADODB.Recordset Dim objRst_User As ADODB.Recordset '建立要轉換資料時所需的物件 Set objCnn = New ADODB.Connection Set objCnn_Temp = New ADODB.Connection Set objRst_Temp = New ADODB.Recordset Set objRst_Grade = New ADODB.Recordset Set objRst_User = New ADODB.Recordset '設定連結的資料庫與資料錄 strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & strDBPath & ";" & _ "Persist Security Info=False" objCnn.Open strCnn strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & App.Path & "\db2.mdb;" & _ "Persist Security Info=False" objCnn_Temp.Open strCnn strSQL = "Select * From [資料表2] " objRst_User.Open strSQL, objCnn, adOpenStatic, adLockOptimistic strSQL = "Select * From [評鑑資料] " objRst_Grade.Open strSQL, objCnn, adOpenStatic, adLockOptimistic strSQL = "Select * From [TestTable] " objRst_Temp.Open strSQL, objCnn_Temp, adOpenStatic, adLockOptimistic '巡覽所有暫存資料錄 Do Until objRst_Temp.EOF = True '以下程式的目的是用來轉換之前Excel匯入到暫存資料後,再由暫存資料匯入到正確的資料表中 If Len(objRst_Temp.Fields(3).Value) > 0 And Len(objRst_Temp.Fields(4).Value) > 0 Then objRst_User.Filter = "[UNAME] Like '" & Trim(objRst_Temp.Fields(3).Value) & "%'" If objRst_User.EOF = False Then objRst_Grade.Filter = "[UID_AID] Like '" & Trim(objRst_User!AID & "") & "' AND " & _ "[C_Year] Like '" & Trim(Combo2.Text & "") & "' AND " & _ "[C_Number] Like '" & Trim(Combo1.ListIndex + 1 & "") & "' AND " & _ "[C_Grade] Like '" & Trim(str_Grade & "") & "'" If objRst_Grade.EOF = True Then objRst_Grade.AddNew objRst_Grade!UID_AID = Trim(objRst_User!AID & "") objRst_Grade!C_YEAR = Trim(Combo2.Text & "") objRst_Grade!C_Number = Trim(Combo1.ListIndex + 1 & "") objRst_Grade!C_Grade = Trim(str_Grade & "") objRst_Grade!C_Score = Trim(objRst_Temp.Fields(4).Value & "") objRst_Grade!C_Description = Trim(objRst_Temp.Fields(5).Value & "") objRst_Grade.Update ElseIf objRst_Grade.EOF = False Then objRst_Grade!UID_AID = Trim(objRst_User!AID & "") objRst_Grade!C_YEAR = Trim(Combo2.Text & "") objRst_Grade!C_Number = Trim(Combo1.ListIndex + 1 & "") objRst_Grade!C_Grade = Trim(str_Grade & "") objRst_Grade!C_Score = Trim(objRst_Temp.Fields(4).Value & "") objRst_Grade!C_Description = Trim(objRst_Temp.Fields(5).Value & "") objRst_Grade.Update End If End If End If objRst_Temp.MoveNext Loop '關閉所有資料錄及資料庫 objRst_Temp.Close objRst_Grade.Close objRst_User.Close objCnn_Temp.Close objCnn.Close '釋放記憶體空間 Set objRst_User = Nothing Set objRst_Grade = Nothing Set objRst_Temp = Nothing Set objCnn_Temp = Nothing Set objCnn = Nothing End Sub
4.6.5 Excel匯入物件類別¶
Step 1:我們來看Excel匯入物件類別內的程式如何設計。請參考以下程式碼。
'設定所有變數必須宣告才能使用 Option Explicit '將 Excel Sheet 轉換至 Access Public Function ExportExcelSheetToAccess(sSheetName As String, _ sExcelPath As String, _ sAccessTable As String, _ sAccessDBPath As String) As String '設定預設值 ExportExcelSheetToAccess = "" '檢查參數 If Len(sSheetName) <= 0 Or _ Len(sExcelPath) <= 0 Or _ Len(sAccessTable) <= 0 Or _ Len(sAccessDBPath) <= 0 Then ExportExcelSheetToAccess = "Error:參數錯誤。" Exit Function End If '先刪除舊檔案 Dim valRet As Variant '宣告檔案處理物件 Dim objFso As FileSystemObject '建立檔案處理物件 Set objFso = New FileSystemObject '錯誤處理 On Error Resume Next '刪除舊的檔案,避免轉檔時檔案無法複寫 objFso.DeleteFile sAccessDBPath, True '判斷是否有錯誤的事件 If Err.Number <> 0 Then ExportExcelSheetToAccess = "Error:刪除檔案時錯誤。" End If '複製暫存的資料庫 objFso.CopyFile App.Path & "\db3.mdb", sAccessDBPath, True If Err.Number <> 0 Then ExportExcelSheetToAccess = "Error:複製檔案時錯誤。" End If '釋放檔案處理物件 Set objFso = Nothing '宣告DAO物件 Dim db As Database Dim rs As Recordset '開啟Excel檔案 Set db = OpenDatabase(sExcelPath, True, False, "Excel 5.0") '判斷錯誤事件 If Err.Number <> 0 Then Debug.Print Err.Number End If '呼叫執行轉檔方法 Call db.Execute("Select * into [;database=" & sAccessDBPath & "]." & _ sAccessTable & " FROM [" & sSheetName & "$]") '判斷錯誤事件 If Err.Number = 0 Then ExportExcelSheetToAccess = "資料表轉換成功。" ElseIf Err.Number <> 0 Then ExportExcelSheetToAccess = "資料表轉換失敗。" End If End Function
4.6.6 系統作業流程¶
登入的密碼預設為1。
Step 1:首先收集到單位主管送來的評分檔,格式如圖 4-11。
圖 4‑11總務處評分檔(Excel範例)
Step 2:如圖 4-12,啟動教職員評鑑系統,預設密碼為空,倘若您忘記密碼,可以在教職員評鑑的文字標籤上,點選滑鼠五十次,這樣也可以登入。
圖 4‑12 教職員評鑑系統啟始畫面
Step 3:如圖 4-13,點選輸入資料、Excel匯入。請注意一點,當要匯入檔案時,該Excel檔案不可以開啟,以免被鎖定而造成無法匯入。
圖 4‑13 Excel檔案匯入
Step 4:如圖 4-14,點選輸入資料、手動輸入。檢視資料是否正確。
圖 4‑14 手動輸入畫面
Step 5:點選評鑑、季評鑑,在這裡是提供高層會議開會時討論,因此畫面及操作都經過特別設計,簡單易懂。如圖 4-15。
圖 4‑15 季評鑑
Step 6:點選評鑑、季報表,在這裡可以列印提供紙本文件存檔的報表資料,並可匯出Excel。如圖 4-16。
圖 4‑16 季報表
Step 7:點選設定、資料庫維護,這裡可以備份、測試、還原資料庫。如圖 4-17。
圖 4‑17 資料庫維護
Step 8:點選設定、人員管理,這裡可以新增、刪除、修改基本資料,並且可匯入人員照片電子檔,還可設定評分單位的百分比。如圖 4-18。
圖 4‑18 人員管理
Step 9:如圖 4-19,處室管理可以新增、刪除、修改處室資料。
圖 4‑19 處室管理
Step 10:如圖 4-20,點選設定、變更密碼,這裡可以重新設定密碼。
圖 4‑20 變更密碼
4.7 修改重點¶
由啟始介面的程式碼中,權限的部分可以看出原本的構想,是依照不同角色而設計的功能權限,但作業並非分工,而是每個人都擁有所有權線的方式作業,所以還是採用開放的模式。如果您的單位評鑑工作職責分明,那就可以採用筆者預先寫好的程式碼,這樣導入系統會比較快速。
筆者有預留帳號管理的功能,這是未來需要設計成網路版的程式,所預先規劃的,但由於人事室認為這些資料十分重要,且不能外洩,放在網路上對於資安部分有所疑慮,因此作罷。但筆者認為只要有編解碼的協助,就可以避免一般的資料竊取,而且此系統只運行於內網,若是網路版本的話,也只是提供資料輸入的功能而已,無法讀取資料,也就是說供單位主管評分的介面,並提醒主管何時要繳交評分資料,等等相關訊息,資安的部分問題並不太大。所以如果您有心要設計成網路版本的話,可以將資料庫建立在SQL SERVER上,再設計適當的權限,只允許終端用戶輸入資料,並不能讀取資料,而人事室的權限依照職務屬性開放不同功能,於會議之前可以用合適的權限,讓高層先過目成績資料,會議正式開始時只需討論有問題的個案即可,這樣就可以避免攏長的會議浪費時間。
4.8 結論¶
筆者認為系統能夠順利推展,與參予者的支持度息息相關,所幸人事室對此系統是大力配合與支持,因此得以推展順利。並且在系統建置的過程中,提供相當多的資料以及資源,協助筆者做系統分析及設計,而非單純的只提供需求,剩下的問題交給設計師去解決,這是一般人的思維方式,而人事室的同仁卻不同於一般人的思維,把這件事情看成是重要的,並且願意花時間參予整各系統的開發過程,因而系統才能拉近需求與設計之間的距離。
許多軟體工程的開發模式,都是必須需求者與設計者之間保持互動,透過不斷的回饋,例如:螺旋式、極致法…等等方式,都是如此運行。這樣才能作出符合使用者需求的軟體。因此客戶端的配合也是相當重要的一件事情。
版權聲明¶
Lai Tai-Yu (賴岱佑)