Visual Basic 6.0 (VB6) 程式語言案例學習 (02. 加班薪資管理系統)
Visual Basic 6.0 (VB6) 程式語言案例學習 (02. 加班薪資管理系統)¶
2.1 問題¶
某會計室因為採用紙本的方式統計加班薪資的工作,每個月都相當的麻煩,必須請工讀生或是助理來協助統計這堆成山的加班申請單,而且有時還會因為人為的因素,造成統計錯誤。例如填單者的字太潦草、登記者看錯數字、單據未經主管審核、…、等等。一連串的問題,造成工作的繁雜。因此才想出使用電腦來協助解決問題,希望能夠由電腦自動統計出加班的時數,藉以解決問題。
2.2 需求¶
表格 2‑1 「加班薪資管理系統」系統目的分析表
| 版本:1.0 | 要做什麼 | 不要做什麼(不要做不代表不會做) |
|---|---|---|
| 能做什麼 | (第一格:必要項目) | (第二格:次要項目) |
| 輸入單據時,只要輸入編號就可以帶出人員的相關資料。 | 資料庫要加密。 | |
| 新增加班時數的時候要能判斷是否與之前的時數有重疊。 | 所有功能都要能顯示提示操作,以便於初學者使用。 | |
| 要有權限管理,不同權限的角色只能看到所屬的功能。 | ||
| 操作介面最好一致,以便讓管理者熟悉。 | ||
| 可以批次作業,節省時間。 | ||
| 經過稽核後的單據就不可以再去修改。 | ||
| 不能做什麼(不能做代表不需要做) | (第三格:不必要項目) | (第四格:不需要項目) |
| 要能夠匯出報表,統計誰的加班時數及金額最多。 | 將人員管理資料庫與校務系統結合。 |
表格 2‑2 「加班薪資管理系統」系統目標分析表
| 版本: | 重要 | 不重要 |
|---|---|---|
| 優先 | (重) | (急) |
| 輸入單據時,只要輸入編號就可以帶出人員的相關資料。 | 要有權限管理,不同權限的角色只能看到所屬的功能。 | |
| 新增加班時數的時候要能判斷是否與之前的時數有重疊。 | ||
| 經過稽核後的單據就不可以再去修改。 | ||
| 不急迫 | (輕) | (緩) |
| 操作介面最好一致,以便讓管理者熟悉。 | 可以批次作業,節省時間。 |
表格 2‑3 「加班薪資管理系統」系統規格表
| 規格項目 | 規格內容 | 備註 |
|---|---|---|
| 登入介面 | 依據使用者不同而分為管理者、稽核者、輸入者三種權限功能。 | … |
| 加班單 | 能夠判別錯誤的時間登錄,只允許正確的資料進入系統。 | … |
| 稽核單 | 能夠批次稽核及取消加班單據。 | … |
| 統計單 | 提供三種計算薪資的方法,可以依照不同屬性的員工,量身訂作加班薪資計算法。 | … |
| 職員管理 | 可以新增、刪除、修改職員資料。 | … |
2.3 特色¶
特點就是透過數學運算,讓原本複雜的計算公式,變得簡單又有效率,管理職員六百多人的加班薪資計算。
可應用於公司行號開發計算複雜薪資的程式。
2.4 使用工具¶
| 語言 | 軟體 |
|---|---|
| Visual Basic 6.0 | MS Visual Basic 6.0、MS Access |
2.5 系統架構¶
筆者藉由訪談了解使用該系統的人員角色,分為管理者、稽核者、輸入者。所謂管理者可以使用系統全部功能,相當於會計主任的等級;稽核者就是會計本身,資料進入並不代表一定通過核發薪資的條件,因此必須經過會計依據條件審核;輸入者權限最小,可以由工讀生或者是助理來協助輸入,並不牽涉到任何薪資發放的部分。
由此看來這系統是依據角色的不同而規劃的,由於是會計系統又牽涉到金錢,因此設計時就必須包含權限。而筆者預估未來有可能還會增加功能,因此設計上採用使用者自訂控制項的方式,並且每個自訂控制項之間並無關連,控制項只針對資料庫做處理分析,因此再使用率相當高,得以隨時置換不同的控制項,來滿足使用者的需求。
透過簡單的數學運算可以節省許多邏輯判斷的程式碼,而且又有效率。
2.6 程式實作¶
2.6.1 加班薪資管理系統之介面設計¶
Step 1:因為本程式是以角色來看,因此先介紹介面程式的部分,讓讀者能夠先清楚介面及角色的概觀。請參考如圖2-1的介面安排。
圖 2‑1 加班薪資管理系統之使用者介面
Step 2:請將以下程式碼加入介面中。
'設定所有變數必須宣告才能使用
Option Explicit
'登入介面程式初始化事件副程式
Private Sub Form_Initialize()
'設定有功能的功能鈕隱藏,尚未登入前是不能使用
Toolbar1.Buttons(1).Visible = False
Toolbar1.Buttons(2).Visible = False
Toolbar1.Buttons(3).Visible = False
Toolbar1.Buttons(4).Visible = False
'設定方框背景圖型的位置、大小
Shape2.Left = 0
Shape2.Top = Toolbar1.Height + Screen.TwipsPerPixelY
Shape2.Width = frmMM.Width - Screen.TwipsPerPixelX * 8
'設定加班時間表自製控制項的位置、大小
UserControl21.Visible = False
UserControl21.Top = Toolbar1.Top + Toolbar1.Height
UserControl21.Left = 0
UserControl21.Height = frmMM.Height - Toolbar1.Height
UserControl21.Width = frmMM.Width
'設定加班時間稽核表自製控制項的位置、大小
UserControl31.Visible = False
UserControl31.Top = Toolbar1.Top + Toolbar1.Height
UserControl31.Left = 0
UserControl31.Height = frmMM.Height - Toolbar1.Height
UserControl31.Width = frmMM.Width
'設定加班時間統計表自製控制項的位置、大小
UserControl41.Visible = False
UserControl41.Top = Toolbar1.Top + Toolbar1.Height
UserControl41.Left = 0
UserControl41.Height = frmMM.Height - Toolbar1.Height
UserControl41.Width = frmMM.Width
'設定職員資料管理自製控制項的位置、大小
UserControl51.Visible = False
UserControl51.Top = Toolbar1.Top + Toolbar1.Height
UserControl51.Left = 0
UserControl51.Height = frmMM.Height - Toolbar1.Height
UserControl51.Width = frmMM.Width
End Sub
'登入按鍵被點選事件副程式
Private Sub Command1_Click()
'假設管理者登入判斷,帳號:管理者、密碼:ADMIN
If Text1.Text = "管理者" And Text2.Text = "ADMIN" Then
'設定管理者可使用的功能
Toolbar1.Buttons(1).Visible = True
Toolbar1.Buttons(2).Visible = True
Toolbar1.Buttons(3).Visible = True
Toolbar1.Buttons(4).Visible = True
'隱藏初始登入介面控制項
Shape1.Visible = False
Shape2.Visible = False
Text1.Visible = False
Text2.Visible = False
Label1.Visible = False
Label2.Visible = False
Command1.Visible = False
Command2.Visible = False
'假設稽核者登入判斷,帳號:稽核者、密碼:CHECK
ElseIf Text1.Text = "稽核者" And Text2.Text = "CHECK" Then
'設定稽核者可使用的功能
Toolbar1.Buttons(2).Visible = True
Toolbar1.Buttons(3).Visible = True
'隱藏初始登入介面控制項
Shape1.Visible = False
Shape2.Visible = False
Text1.Visible = False
Text2.Visible = False
Label1.Visible = False
Label2.Visible = False
Command1.Visible = False
Command2.Visible = False
'假設輸入者登入判斷,帳號:稽核者、密碼:CHECK
ElseIf Text1.Text = "輸入者" And Text2.Text = "ACC" Then
'設定輸入者可使用的功能
Toolbar1.Buttons(1).Visible = True
'隱藏初始登入介面控制項
Shape1.Visible = False
Shape2.Visible = False
Text1.Visible = False
Text2.Visible = False
Label1.Visible = False
Label2.Visible = False
Command1.Visible = False
Command2.Visible = False
End If
End Sub
'宣告清除按鈕事件副程式
Private Sub Command2_Click()
'清除帳號及密碼文字框
Text1.Text = ""
Text2.Text = ""
End Sub
'宣告功能列按鈕被點選事件副程式
Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)
'先隱藏所有自訂控制項
UserControl21.Visible = False
UserControl31.Visible = False
UserControl41.Visible = False
UserControl51.Visible = False
'依據按鈕鍵判斷該顯示的自動控制項
Select Case Button.Key
'設定加班時間表自製控制項的位置、大小
Case "IK2"
UserControl21.Reload
UserControl21.Top = Toolbar1.Top + Toolbar1.Height
UserControl21.Left = 0
UserControl21.Height = frmMM.Height - Toolbar1.Height
UserControl21.Width = frmMM.Width - (Screen.TwipsPerPixelX * 8)
UserControl21.Visible = True
'設定加班時間稽核表自製控制項的位置、大小
Case "IK3"
UserControl31.Reload
UserControl31.Top = Toolbar1.Top + Toolbar1.Height
UserControl31.Left = 0
UserControl31.Height = frmMM.Height - Toolbar1.Height
UserControl31.Width = frmMM.Width - (Screen.TwipsPerPixelX * 8)
UserControl31.Visible = True
'設定加班時間統計表自製控制項的位置、大小
Case "IK4"
UserControl41.Reload
UserControl41.Top = Toolbar1.Top + Toolbar1.Height
UserControl41.Left = 0
UserControl41.Height = frmMM.Height - Toolbar1.Height
UserControl41.Width = frmMM.Width - (Screen.TwipsPerPixelX * 8)
UserControl41.Visible = True
'設定職員資料管理自製控制項的位置、大小
Case "IK5"
UserControl51.Top = Toolbar1.Top + Toolbar1.Height
UserControl51.Left = 0
UserControl51.Height = frmMM.Height - Toolbar1.Height
UserControl51.Width = frmMM.Width - (Screen.TwipsPerPixelX * 8)
UserControl51.Visible = True
'結束程式
Case "IK6"
End
End Select
End Sub
2.6.2 加班時間表之控制項設計¶
Step 1:這是加班單填入的控制項,為求資料進入正確,我們在這裡用數學計算的方式,驗證資料是否符合條件,讓正確的資料進入。避免GIGO(垃圾進,垃圾出)的情形。請參考如圖2-2的版面配置。
圖 2‑2 加班時間表之控制項設計
Step 2:請加以下程式碼加入使用者自訂控制項中。
'設定所有變數必須宣告才能使用
Option Explicit
'宣告ADO資料庫連結物件
Dim objCnn As ADODB.Connection
'宣告ADO資料錄物件
Dim objRst As ADODB.Recordset
'宣告清單項目物件
Dim objItem As ListItem
'使用者自訂控制項初始化事件副程式
Private Sub UserControl_Initialize()
'建立ADO資料庫連結物件
Set objCnn = New ADODB.Connection
'透過連結字串開啟資料庫的連結
objCnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'建立ADO資料錄物件
Set objRst = New ADODB.Recordset
'增加年度下拉式選單項目,您也可以使用迴圈的方式增加項目
Combo1.AddItem "93", 0
Combo1.AddItem "94", 1
Combo1.AddItem "95", 2
Combo1.AddItem "96", 3
Combo1.AddItem "97", 4
Combo1.AddItem "98", 5
Combo1.AddItem "99", 6
Combo1.ListIndex = 0
'增加月份下拉式選單項目,您也可以使用迴圈的方式增加項目
Combo2.AddItem "01", 0
Combo2.AddItem "02", 1
Combo2.AddItem "03", 2
Combo2.AddItem "04", 3
Combo2.AddItem "05", 4
Combo2.AddItem "06", 5
Combo2.AddItem "07", 6
Combo2.AddItem "08", 7
Combo2.AddItem "09", 8
Combo2.AddItem "10", 9
Combo2.AddItem "11", 10
Combo2.AddItem "12", 11
Combo2.ListIndex = Val(Month(Date)) - 1
'設定日期及時間控制項的數值,調用系統日期
DTPicker1.Value = Date
DTPicker2.Value = Date
DTPicker3.Value = Time
DTPicker4.Value = Time
'設定背景圖型的大小及位置
Shape2.Left = 0
Shape2.Width = UserControl.Width
End Sub
'當年度下拉式選單點選之後事件副程式
Private Sub Combo1_Click()
'載入職員姓名自訂副程式
Call loadName
End Sub
'當月份下拉式選單點選之後事件副程式
Private Sub Combo2_Click()
'載入職員姓名自訂副程式
Call loadName
End Sub
'新增按鈕點選事件副程式
Private Sub Command1_Click()
'宣告所需要用到的字串變數
Dim strRecord_A, strRecord_B, strRecord_C, strRecord_D, strRecord_E, _
strRecord_F, strRecord_G, strRecord_H, strRecord_I, strRecord_J, _
strRecord_K, strRecord_L As String
'判斷人員編號是否有輸入
If Len(Text1.Text) <= 0 Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未輸入人員編號。"
Exit Sub
End If
'判斷人員姓名是否有帶出
If Len(Text4.Text) <= 0 Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未帶出正確的人員姓名,請輸入正確的人員編號。"
Exit Sub
End If
'判斷加班事由是否有輸入
If Len(Text3.Text) <= 0 Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未輸入加班事由。"
Exit Sub
End If
'判斷是否有輸入加班小時金額
If Len(Text2.Text) <= 0 Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未輸入每小時金額。"
Exit Sub
End If
'要加入日期時間的輸入判斷,開始日期不可以大於結束日期
Dim dtmStart As Date
Dim dtmEnd As Date
'設定起始日期時間及結束日期時間
dtmStart = CDate(DTPicker1.Value) & TimeValue(DTPicker3.Value)
dtmEnd = CDate(DTPicker2.Value) & TimeValue(DTPicker4.Value)
'判斷起始日期時間是否大於結束日期時間
If dtmStart >= dtmEnd Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:輸入的日期時間不正確。"
Exit Sub
End If
'判斷日期時間是否有重疊
Dim lngI As Long
Dim str_DontAdd As String
'清除通過旗標
str_DontAdd = ""
'初始化計數器
lngI = 0
'巡覽所有加班項目
For lngI = 1 To ListView1.ListItems.Count
'設定顏色
ListView1.ListItems(lngI).ListSubItems(2).ForeColor = vbBlack
'宣告必須使用的變數
Dim lng_DateTimeRange_Record As Long
Dim lng_DateTimeRange_New As Long
Dim lng_DateTimeRange_Max As Long
Dim dtmStart_Record As Date
Dim dtmEnd_Record As Date
Dim dtmStart_New As Date
Dim dtmEnd_New As Date
Dim dtmStart_Max As Date
Dim dtmEnd_Max As Date
'設定該列加班項目的起始日期時間與結束日期時間
dtmStart_Record = CDate(ListView1.ListItems(lngI).SubItems(4)) & TimeValue(ListView1.ListItems(lngI).SubItems(5))
dtmEnd_Record = CDate(ListView1.ListItems(lngI).SubItems(6)) & TimeValue(ListView1.ListItems(lngI).SubItems(7))
'計算加班日期時間範圍
lng_DateTimeRange_Record = Val(FormatInterval(dtmStart_Record, dtmEnd_Record, "M:SS", 1028))
'設定新增的加班起始日期時間與結束日期時間
dtmStart_New = CDate(DTPicker1.Value) & " " & Format(TimeValue(DTPicker3.Value), "HH:MM")
dtmEnd_New = CDate(DTPicker2.Value) & " " & Format(TimeValue(DTPicker4.Value), "HH:MM")
'計算新增的加班日期時間範圍
lng_DateTimeRange_New = Val(FormatInterval(dtmStart_New, dtmEnd_New, "M:SS", 1028))
'設定最大起始日期時間
dtmStart_Max = dtmStart_New
If dtmStart_Record <= dtmStart_New Then
dtmStart_Max = dtmStart_Record
End If
'設定最大結束日期時間
dtmEnd_Max = dtmEnd_New
If dtmEnd_Record >= dtmEnd_New Then
dtmEnd_Max = dtmEnd_Record
End If
'計算最大起始與結束日期時間範圍
lng_DateTimeRange_Max = Val(FormatInterval(dtmStart_Max, dtmEnd_Max, "M:SS", 1028))
'倘若最大時間範圍減去已紀錄的時間範圍並加上新的時間範圍,計算結果若小於等於零時
If lng_DateTimeRange_Max - (lng_DateTimeRange_Record + lng_DateTimeRange_New) <= 0 Then
'設定顏色提醒
ListView1.ListItems(lngI).ListSubItems(2).ForeColor = vbRed
ListView1.Refresh
'顯示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:加班時間有重疊。"
'設定加班項目有誤旗標
str_DontAdd = "Yes"
End If
Next lngI
'倘若新增的加班項目有誤,則跳離副程式
If str_DontAdd = "Yes" Then
Exit Sub
End If
'通過檢查,開始紀錄資料
ListView1.Refresh
'重設訊息
labMessage.ForeColor = vbBlack
labMessage.Caption = "訊息:"
'設定各欄位的紀錄變數
strRecord_A = Trim(Combo1.Text & "")
strRecord_B = Trim(Combo2.Text & "")
strRecord_C = Trim(Text1.Text & "")
strRecord_D = Trim(Text4.Text & "")
strRecord_E = Trim(Text3.Text & "")
strRecord_F = DTPicker1.Value
strRecord_G = DTPicker3.Value
strRecord_I = DTPicker2.Value
strRecord_J = DTPicker4.Value
strRecord_K = Trim(Text2.Text & "")
strRecord_L = Trim(Text5.Text & "")
'宣告新增的項目必須使用到的物件及變數
Dim objCnn_ADD As ADODB.Connection
Dim objRst_Add As ADODB.Recordset
Dim strSQL As String
'建立新增項目必須使用到的資料庫物件
Set objCnn_ADD = New ADODB.Connection
Set objRst_Add = New ADODB.Recordset
'設定連結資料庫的命令文字
strSQL = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb" & ";" & _
"Mode=Read|Write|Share Deny None;" & _
"Persist Security Info=False;"
'開啟資料庫
objCnn_ADD.Open strSQL
'設定SQL的命令文字
strSQL = "Select * From [資料表1]"
'開啟資料錄
objRst_Add.Open strSQL, objCnn_ADD, adOpenStatic, adLockPessimistic
'設定準備新增資料
objRst_Add.AddNew
'設定各欄位的資料
objRst_Add("單號") = Right("0000" & Year(Date), 4) & _
Right("00" & Month(Date), 2) & _
Right("00" & Day(Date), 2) & _
Right("00" & Hour(Time), 2) & _
Right("00" & Minute(Time), 2) & _
Right("00" & Second(Time), 2)
objRst_Add("單據年") = Right("00" & Combo1.Text, 2)
objRst_Add("單據月") = Right("00" & Combo2.Text, 2)
objRst_Add("編號") = Trim(Text1.Text & "")
objRst_Add("姓名") = Trim(Text4.Text & "")
objRst_Add("處室") = Trim(Text5.Text & "")
objRst_Add("每小時金額") = Trim(Text2.Text & "")
objRst_Add("加班事由") = Trim(Text3.Text & "")
objRst_Add("加班開始日期") = Format(CDate(DTPicker1.Value), "yyyy/mm/dd")
objRst_Add("加班開始時間") = Format(TimeValue(DTPicker3.Value), "HH:MM")
objRst_Add("加班結束日期") = Format(CDate(DTPicker2.Value), "yyyy/mm/dd")
objRst_Add("加班結束時間") = Format(TimeValue(DTPicker4.Value), "HH:MM")
'取得新增項目的起始及結束日期時間
dtmStart_New = CDate(DTPicker1.Value) & " " & Format(TimeValue(DTPicker3.Value), "HH:MM")
dtmEnd_New = CDate(DTPicker2.Value) & " " & Format(TimeValue(DTPicker4.Value), "HH:MM")
'宣告計算時間所需要用到的變數
Dim str_HourMinute As String
Dim str_Hour As String
Dim str_Minute As String
Dim intI As Integer
'計算分鐘,起始日期到結束日期的時間差
str_HourMinute = FormatInterval(dtmStart_New, dtmEnd_New, "M:SS", 1028)
'取得小時
str_Hour = Int(Val(str_HourMinute) / 60)
'取得分鐘
str_Minute = Int(Val(str_HourMinute) Mod 60)
'設定新增的資料欄位
objRst_Add("加班共計小時") = str_Hour
objRst_Add("加班共計分鐘") = str_Minute
objRst_Add("填單日期") = Date & Time
'將資料更新
objRst_Add.Update
'關閉資料錄物件
objRst_Add.Close
'關閉資料庫連結物件
objCnn_ADD.Close
'釋放記憶體空間
Set objRst_Add = Nothing
Set objCnn_ADD = Nothing
'重新載入顯示資料
Call loadName
End Sub
'刪除按鈕被點選事件副程式
Private Sub Command2_Click()
'宣告刪除項目所需要的變數
Dim intI As Integer
Dim str_DeleteID As String
'初始化刪除字串
str_DeleteID = ""
'巡覽所有項目
For intI = 1 To ListView1.ListItems.Count
Debug.Print ListView1.ListItems(intI).Text
'當發現有被勾選刪除的項目時
If ListView1.ListItems(intI).Checked = True Then
'計錄刪除項目的代碼
str_DeleteID = str_DeleteID & ListView1.ListItems(intI).Text & ","
End If
Next intI
'當刪除項目代碼不存在時
If Len(str_DeleteID) <= 0 Then
'顯示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:請勾選要刪除的加班紀錄。"
Exit Sub
End If
'詢問是否要刪除
If MsgBox("請問是否確定要刪除呢?", vbYesNo, "訊問") = vbNo Then
Exit Sub
End If
'宣告刪除項目所需要用到的資料庫物件
Dim objCnn_Del As ADODB.Connection
Dim objRst_Del As ADODB.Recordset
'建立刪除項目所需要用到的資料庫物件
Set objCnn_Del = New ADODB.Connection
Set objRst_Del = New ADODB.Recordset
'開啟資料庫
objCnn_Del.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'執行SQL命令,以代碼刪除資料項目
objCnn_Del.Execute "Delete From [資料表1] " & _
"Where [AID] In (" & Left(str_DeleteID, Len(str_DeleteID) - 1) & ")"
'關閉資料庫
objCnn_Del.Close
'釋放記憶體空間
Set objCnn_Del = Nothing
'重新載入資料
Call loadName
End Sub
'修改按鈕點選事件副程式
Private Sub Command3_Click()
'當項目為空時則跳離副程式
If ListView1.ListItems.Count <= 0 Then
Exit Sub
End If
'當選擇項目為空時則跳離副程式
If Len(ListView1.SelectedItem.Text) <= 0 Then
Exit Sub
End If
'當加班紀錄經過稽核後,就顯示不能修改的訊息,並跳離副程式
If Len(ListView1.SelectedItem.SubItems(11)) > 0 Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:經過稽核加班紀錄不可刪除或修改。"
Exit Sub
End If
'宣告要使用到的字串變數
Dim strRecord_A, strRecord_B, strRecord_C, strRecord_D, strRecord_E, _
strRecord_F, strRecord_G, strRecord_H, strRecord_I, strRecord_J, _
strRecord_K, strRecord_L As String
'判斷是否有輸入人員編號
If Len(Text1.Text) <= 0 Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未輸入人員編號。"
Exit Sub
End If
'判斷是否有帶出人員姓名
If Len(Text4.Text) <= 0 Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未帶出正確的人員姓名,請輸入正確的人員編號。"
Exit Sub
End If
'判斷是否有輸入加班事由
If Len(Text3.Text) <= 0 Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未輸入加班事由。"
Exit Sub
End If
'判斷是否有輸入加班小時金額
If Len(Text2.Text) <= 0 Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未輸入每小時金額。"
Exit Sub
End If
'要加入日期時間的輸入判斷,開始日期不可以大於結束日期
Dim dtmStart As Date
Dim dtmEnd As Date
'設定起始日期時間及結束日期時間
dtmStart = CDate(DTPicker1.Value) & TimeValue(DTPicker3.Value)
dtmEnd = CDate(DTPicker2.Value) & TimeValue(DTPicker4.Value)
'判斷起始日期時間是否大於結束日期時間
If dtmStart >= dtmEnd Then
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:輸入的日期時間不正確。"
Exit Sub
End If
'判斷日期時間是否有重疊
Dim lngI As Long
Dim str_DontAdd As String
'清除通過旗標
str_DontAdd = ""
'初始化計數器
lngI = 0
'巡覽所有加班項目
For lngI = 1 To ListView1.ListItems.Count
'設定顏色
ListView1.ListItems(lngI).ListSubItems(2).ForeColor = vbBlack
'略過要修改的項目
If Trim(ListView1.ListItems(lngI).Text & "") <> Trim(ListView1.SelectedItem.Text & "") Then
'宣告必須使用的變數
Dim lng_DateTimeRange_Record As Long
Dim lng_DateTimeRange_New As Long
Dim lng_DateTimeRange_Max As Long
Dim dtmStart_Record As Date
Dim dtmEnd_Record As Date
Dim dtmStart_New As Date
Dim dtmEnd_New As Date
Dim dtmStart_Max As Date
Dim dtmEnd_Max As Date
'設定該列加班項目的起始日期時間與結束日期時間
dtmStart_Record = CDate(ListView1.ListItems(lngI).SubItems(4)) & TimeValue(ListView1.ListItems(lngI).SubItems(5))
dtmEnd_Record = CDate(ListView1.ListItems(lngI).SubItems(6)) & TimeValue(ListView1.ListItems(lngI).SubItems(7))
'計算加班日期時間範圍
lng_DateTimeRange_Record = Val(FormatInterval(dtmStart_Record, dtmEnd_Record, "M:SS", 1028))
'設定新增的加班起始日期時間與結束日期時間
dtmStart_New = CDate(DTPicker1.Value) & " " & Format(TimeValue(DTPicker3.Value), "HH:MM")
dtmEnd_New = CDate(DTPicker2.Value) & " " & Format(TimeValue(DTPicker4.Value), "HH:MM")
'計算新增的加班日期時間範圍
lng_DateTimeRange_New = Val(FormatInterval(dtmStart_New, dtmEnd_New, "M:SS", 1028))
'設定最大起始日期時間
dtmStart_Max = dtmStart_New
If dtmStart_Record <= dtmStart_New Then
dtmStart_Max = dtmStart_Record
End If
'設定最大結束日期時間
dtmEnd_Max = dtmEnd_New
If dtmEnd_Record >= dtmEnd_New Then
dtmEnd_Max = dtmEnd_Record
End If
'計算最大起始與結束日期時間範圍
lng_DateTimeRange_Max = Val(FormatInterval(dtmStart_Max, dtmEnd_Max, "M:SS", 1028))
'倘若最大時間範圍減去已紀錄的時間範圍並加上新的時間範圍,計算結果若小於等於零時
If lng_DateTimeRange_Max - (lng_DateTimeRange_Record + lng_DateTimeRange_New) <= 0 Then
'設定顏色提醒
ListView1.ListItems(lngI).ListSubItems(2).ForeColor = vbRed
ListView1.Refresh
'顯示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:加班時間有重疊。"
'設定加班項目有誤旗標
str_DontAdd = "Yes"
End If
End If
Next lngI
'倘若新增的加班項目有誤,則跳離副程式
If str_DontAdd = "Yes" Then
Exit Sub
End If
'通過檢查,開始紀錄資料
ListView1.Refresh
'重設訊息
labMessage.ForeColor = vbBlack
labMessage.Caption = "訊息:"
'設定各欄位的紀錄變數
strRecord_A = Trim(Combo1.Text & "")
strRecord_B = Trim(Combo2.Text & "")
strRecord_C = Trim(Text1.Text & "")
strRecord_D = Trim(Text4.Text & "")
strRecord_E = Trim(Text3.Text & "")
strRecord_F = DTPicker1.Value
strRecord_G = DTPicker3.Value
strRecord_I = DTPicker2.Value
strRecord_J = DTPicker4.Value
strRecord_K = Trim(Text2.Text & "")
'宣告更新的項目必須使用到的物件及變數
Dim objCnn_ADD As ADODB.Connection
Dim objRst_Add As ADODB.Recordset
Dim strSQL As String
'建立更新項目必須使用到的資料庫物件
Set objCnn_ADD = New ADODB.Connection
Set objRst_Add = New ADODB.Recordset
'設定連結資料庫的命令文字
strSQL = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb" & ";" & _
"Mode=Read|Write|Share Deny None;" & _
"Persist Security Info=False;"
'開啟資料庫
objCnn_ADD.Open strSQL
'設定SQL命令文字
strSQL = "Select * From [資料表1] Where [AID] Like '" & Trim(ListView1.SelectedItem.Text) & "'"
'開啟資料錄
objRst_Add.Open strSQL, objCnn_ADD, adOpenStatic, adLockPessimistic
'找到要備更新的資料項目
If objRst_Add.RecordCount = 1 Then
'假設尚未被稽核
If Len(Trim(objRst_Add("稽核者") & "")) <= 0 Then
'設定各欄位的資料
objRst_Add("單號") = Right("0000" & Year(Date), 4) & _
Right("00" & Month(Date), 2) & _
Right("00" & Day(Date), 2) & _
Right("00" & Hour(Time), 2) & _
Right("00" & Minute(Time), 2) & _
Right("00" & Second(Time), 2)
objRst_Add("單據年") = Right("00" & Combo1.Text, 2)
objRst_Add("單據月") = Right("00" & Combo2.Text, 2)
objRst_Add("編號") = Trim(Text1.Text & "")
objRst_Add("姓名") = Trim(Text4.Text & "")
objRst_Add("處室") = Trim(Text5.Text & "")
objRst_Add("每小時金額") = Trim(Text2.Text & "")
objRst_Add("加班事由") = Trim(Text3.Text & "")
objRst_Add("加班開始日期") = Format(CDate(DTPicker1.Value), "yyyy/mm/dd")
objRst_Add("加班開始時間") = Format(TimeValue(DTPicker3.Value), "HH:MM")
objRst_Add("加班結束日期") = Format(CDate(DTPicker2.Value), "yyyy/mm/dd")
objRst_Add("加班結束時間") = Format(TimeValue(DTPicker4.Value), "HH:MM")
'取得更新項目的起始及結束日期時間
dtmStart_New = CDate(DTPicker1.Value) & " " & Format(TimeValue(DTPicker3.Value), "HH:MM")
dtmEnd_New = CDate(DTPicker2.Value) & " " & Format(TimeValue(DTPicker4.Value), "HH:MM")
'宣告計算時間所需要用到的變數
Dim str_HourMinute As String
Dim str_Hour As String
Dim str_Minute As String
Dim intI As Integer
'計算分鐘,起始日期到結束日期的時間差
str_HourMinute = FormatInterval(dtmStart_New, dtmEnd_New, "M:SS", 1028)
'取得小時
str_Hour = Int(Val(str_HourMinute) / 60)
'取得分鐘
str_Minute = Int(Val(str_HourMinute) Mod 60)
'設定更新的資料欄位
objRst_Add("加班共計小時") = str_Hour
objRst_Add("加班共計分鐘") = str_Minute
objRst_Add("填單日期") = Date & Time
'執行更新
objRst_Add.Update
End If
End If
'關閉資料錄
objRst_Add.Close
'關閉資料庫
objCnn_ADD.Close
'釋放記憶體空間
Set objRst_Add = Nothing
Set objCnn_ADD = Nothing
'重新針對更新項目做資料載入
Call loadName(Trim(ListView1.SelectedItem.Text))
End Sub
'勾選加班資料項目事件副程式
Private Sub ListView1_ItemCheck(ByVal Item As MSComctlLib.ListItem)
'判斷勾選到已經被稽核過的項目
If Len(Item.SubItems(11)) > 0 Then
'設定取消勾選
Item.Checked = False
'顯示提示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:經過稽核加班紀錄不可刪除或修改。"
'跳離副程式
Exit Sub
End If
End Sub
'當加班項目被點選事件副程式
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
'由清單取得各項資料
Text3.Text = Trim(Item.SubItems(1) & "")
DTPicker1.Value = CDate(Item.SubItems(4))
DTPicker2.Value = CDate(Item.SubItems(6))
DTPicker3.Value = CDate(Item.SubItems(5))
DTPicker4.Value = CDate(Item.SubItems(7))
Text2.Text = Trim(Item.SubItems(10) & "")
End Sub
'人員編號按鍵放開事件副程式
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
'重新找尋資料
Call loadName
End Sub
'每小時加班時薪輸入文字框事件副程式
Private Sub Text2_KeyPress(KeyAscii As Integer)
'只允許輸入數字
If KeyAscii < 48 Or KeyAscii > 57 Then
KeyAscii = 0
End If
End Sub
'姓名輸入文字框事件副程式
Private Sub Text4_KeyPress(KeyAscii As Integer)
'不允許任何字元輸入
KeyAscii = 0
End Sub
'重新設定控制項資料副程式
Public Sub Reload()
'設定年度下拉式選單項目
Combo1.AddItem "93", 0
Combo1.AddItem "94", 1
Combo1.AddItem "95", 2
Combo1.AddItem "96", 3
Combo1.AddItem "97", 4
Combo1.AddItem "98", 5
Combo1.AddItem "99", 6
Combo1.ListIndex = 0
'設定月份下拉式選單項目
Combo2.AddItem "01", 0
Combo2.AddItem "02", 1
Combo2.AddItem "03", 2
Combo2.AddItem "04", 3
Combo2.AddItem "05", 4
Combo2.AddItem "06", 5
Combo2.AddItem "07", 6
Combo2.AddItem "08", 7
Combo2.AddItem "09", 8
Combo2.AddItem "10", 9
Combo2.AddItem "11", 10
Combo2.AddItem "12", 11
Combo2.ListIndex = Val(Month(Date)) - 1
'設定日期控制項數值
DTPicker1.Value = Date
DTPicker2.Value = Date
DTPicker3.Value = Time
DTPicker4.Value = Time
'設定背景圖型大小及位置
Shape2.Left = 0
Shape2.Width = UserControl.Width
'清除文字輸入框
Text1.Text = ""
Text4.Text = ""
Text5.Text = ""
'清除訊息
labMessage.Caption = ""
labMM_Hour.Caption = ""
labMM_Minute.Caption = ""
'清空清單
ListView1.ListItems.Clear
End Sub
'載入資料副程式
Private Sub loadName(Optional strListPoint As String)
'開啟資料錄,以人員代號找尋相關資料
objRst.Open "select * from [資料表2] " & _
"where [UID] like '" & Text1.Text & "'", _
objCnn, adOpenStatic, adLockPessimistic
'當有資料時
If objRst.RecordCount > 0 Then
'設定文字框資料
Text4.Text = objRst("UNAME")
Text5.Text = objRst("UGROUP")
'當有資料時
If Len(Text1.Text) > 0 And Len(Text4.Text) > 0 Then
'呼叫函式帶出相關資料
Call A(strListPoint)
End If
反之
Else
'清除文字框及清單
Text4.Text = ""
Text5.Text = ""
ListView1.ListItems.Clear
End If
'關閉資料錄
objRst.Close
End Sub
'加班資料載入副程式
Private Sub A(Optional strListPoint As String)
'宣告資料庫必需的物件
Dim objCnn_A As ADODB.Connection
Dim objRst_A As ADODB.Recordset
'宣告清單項目物件
Dim objItem As ListItem
'宣告總時數長整數變數
Dim lng_TotalHour As Long
'宣告總分鐘長整數變數
Dim lng_TotalMinute As Long
'建立資料庫必須物件
Set objCnn_A = New ADODB.Connection
Set objRst_A = New ADODB.Recordset
'開啟資料庫
objCnn_A.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'開啟資料錄,找尋相關加班單資料
objRst_A.Open "select * from [資料表1] where " & _
"[單據年] like '" & Trim(Combo1.Text & "") & "' And " & _
"[單據月] like '" & Trim(Combo2.Text & "") & "' And " & _
"[編號] like '" & Trim(Text1.Text & "") & "' And " & _
"[姓名] like '" & Trim(Text4.Text & "") & "'", _
objCnn_A, adOpenStatic, adLockPessimistic
'清除清單項目
ListView1.ListItems.Clear
'巡覽所有加班單資料
Do Until objRst_A.EOF
'新增加班單資料項目
Set objItem = ListView1.ListItems.Add(, , Trim(objRst_A("AID") & ""))
objItem.SubItems(1) = Trim(objRst_A("加班事由") & "")
objItem.SubItems(2) = Trim(objRst_A("加班開始日期") & "") & " " & Trim(objRst_A("加班開始時間") & "") & " ~ " & _
Trim(objRst_A("加班結束日期") & "") & " " & Trim(objRst_A("加班結束時間") & "")
objItem.SubItems(3) = Trim(objRst_A("加班共計小時") & "") & "小時" & Trim(objRst_A("加班共計分鐘") & "") & "分鐘"
objItem.SubItems(4) = Trim(objRst_A("加班開始日期") & "")
objItem.SubItems(5) = Trim(objRst_A("加班開始時間") & "")
objItem.SubItems(6) = Trim(objRst_A("加班結束日期") & "")
objItem.SubItems(7) = Trim(objRst_A("加班結束時間") & "")
objItem.SubItems(8) = Trim(objRst_A("加班共計小時") & "")
objItem.SubItems(9) = Trim(objRst_A("加班共計分鐘") & "")
objItem.SubItems(10) = Trim(objRst_A("每小時金額") & "")
objItem.SubItems(11) = Trim(objRst_A("稽核者") & "")
objItem.SubItems(12) = Trim(objRst_A("稽核日期") & "")
'設定顏色
objItem.ListSubItems(2).ForeColor = vbBlack
'計算總時數
lng_TotalHour = lng_TotalHour + Val(Trim(objRst_A("加班共計小時") & ""))
'計算總分鐘
lng_TotalMinute = lng_TotalMinute + Val(Trim(objRst_A("加班共計分鐘") & ""))
'將資料錄移動到下一筆
objRst_A.MoveNext
Loop
'關閉資料錄
objRst_A.Close
'關閉資料庫
objCnn_A.Close
'釋放記憶體空間
Set objRst_A = Nothing
Set objCnn_A = Nothing
'宣告計數變數
Dim lngI As Long
'巡覽所有清單項目
For lngI = 1 To ListView1.ListItems.Count
'當有項目已經被稽核過了
If Len(ListView1.ListItems(lngI).SubItems(11)) > 0 Then
'設定項目顏色
ListView1.ListItems(lngI).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(1).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(2).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(3).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(4).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(5).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(6).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(7).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(8).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(9).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(10).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(11).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(12).ForeColor = vbBlue
End If
Next lngI
'顯示小時
labMM_Hour.Caption = lng_TotalHour + Int(lng_TotalMinute / 60)
'顯示分鐘
labMM_Minute.Caption = Int(lng_TotalMinute Mod 60)
'設定尋找項目
Set objItem = ListView1.FindItem(strListPoint, 0, , 1)
'當找到項目時
If Not (objItem Is Nothing) Then
'設定選擇
objItem.Selected = True
'展開項目
objItem.EnsureVisible
End If
End Sub
'使用者自訂控制項大小調整事件副程式
Private Sub UserControl_Resize()
'重設大小及位置
Shape2.Left = 0
Shape2.Width = UserControl.Width
End Sub
'使用者自訂控制項結束
Private Sub UserControl_Terminate()
'關閉資料庫
objCnn.Close
'釋放記憶體空間
Set objCnn = Nothing
End Sub
2.6.3 加班時間稽核表之控制項設計¶
Step 1:這是加班單稽核的控制項。請參考如圖2-3的版面配置。
圖 2‑3 加班時間稽核單之介面配置
Step 2:請加以下程式碼加入使用者自訂控制項中。
'設定所有變數必須宣告才能使用
Option Explicit
'宣告ADO資料庫連結物件
Dim objCnn As ADODB.Connection
'宣告ADO資料錄物件
Dim objRst As ADODB.Recordset
'宣告清單項目物件
Dim objItem As ListItem
'加班時間表使用者自訂控制項初始化事件副程式
Private Sub UserControl_Initialize()
'設定ADO資料庫連結物件
Set objCnn = New ADODB.Connection
'開啟資料庫
objCnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'設定ADO資料錄物件
Set objRst = New ADODB.Recordset
'設定年度下拉式選單項目,您也可以採用迴圈的方式新增
Combo1.AddItem "93", 0
Combo1.AddItem "94", 1
Combo1.AddItem "95", 2
Combo1.AddItem "96", 3
Combo1.AddItem "97", 4
Combo1.AddItem "98", 5
Combo1.AddItem "99", 6
Combo1.ListIndex = 0
'設定月份下拉式選單項目,您也可以採用迴圈的方式新增
Combo2.AddItem "01", 0
Combo2.AddItem "02", 1
Combo2.AddItem "03", 2
Combo2.AddItem "04", 3
Combo2.AddItem "05", 4
Combo2.AddItem "06", 5
Combo2.AddItem "07", 6
Combo2.AddItem "08", 7
Combo2.AddItem "09", 8
Combo2.AddItem "10", 9
Combo2.AddItem "11", 10
Combo2.AddItem "12", 11
Combo2.ListIndex = Val(Month(Date)) - 1
'設定背景圖型大小及位置
Shape1.Left = 0
Shape1.Width = UserControl.Width
End Sub
'年度下拉式選單點選事件副程式
Private Sub Combo1_Click()
'重新載入資料
Call loadName
End Sub
'月份下拉式選單點選事件副程式
Private Sub Combo2_Click()
'重新載入資料
Call loadName
End Sub
'批次稽核按鈕點選事件副程式
Private Sub Command1_Click()
'宣告計數長整數變數
Dim lngI As Long
'宣告代碼字串變數
Dim str_Add As String
'初始化變數
str_Add = ""
lngI = 0
'巡覽所有清單項目
For lngI = 1 To ListView1.ListItems.Count
'當發現有資料被核取時
If ListView1.ListItems(lngI).Checked = True Then
'將代碼加入字串
str_Add = str_Add & ListView1.ListItems(lngI).Text & ","
End If
Next lngI
'當發現沒有勾選時
If Len(str_Add) <= 0 Then
'顯示提示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:請勾選要稽核的紀錄。"
'跳離副程式
Exit Sub
End If
'宣告ADO資料庫連結物件
Dim objCnn_ADD As ADODB.Connection
'宣告ADO資料錄物件
Dim objRst_Add As ADODB.Recordset
'宣告字串變數
Dim strSQL As String
'建立ADO資料庫連結物件
Set objCnn_ADD = New ADODB.Connection
'建立ADO資料錄物件
Set objRst_Add = New ADODB.Recordset
'設定資料庫連結命令文字
strSQL = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb" & ";" & _
"Mode=Read|Write|Share Deny None;" & _
"Persist Security Info=False;"
'開啟資料庫
objCnn_ADD.Open strSQL
'設定尋找代碼SQL命令文字
strSQL = "Select * From [資料表1] where [AID] in (" & Left(str_Add, Len(str_Add) - 1) & ")"
'開啟資料錄
objRst_Add.Open strSQL, objCnn_ADD, adOpenStatic, adLockPessimistic
'巡覽所有資料錄
Do Until objRst_Add.EOF = True
'設定稽核資料
objRst_Add("稽核者") = "稽核者"
objRst_Add("稽核日期") = Date & Time
'更新稽核資料
objRst_Add.Update
'移動到下一筆資料
objRst_Add.MoveNext
Loop
'關閉資料錄
objRst_Add.Close
'關閉資料庫
objCnn_ADD.Close
'釋放記憶體空間
Set objRst_Add = Nothing
Set objCnn_ADD = Nothing
'重新載入資料
Call loadName
End Sub
'批次取消按鈕點選事件副程式
Private Sub Command2_Click()
'宣告計數整數變數
Dim intI As Integer
'宣告代碼字串變數
Dim str_DeleteID As String
'初始化變數
str_DeleteID = ""
'巡覽所有清單項目
For intI = 1 To ListView1.ListItems.Count
'當發現有項目被選取
If ListView1.ListItems(intI).Checked = True Then
'將項目代碼加入字串
str_DeleteID = str_DeleteID & ListView1.ListItems(intI).Text & ","
End If
Next intI
'當發現沒有勾選
If Len(str_DeleteID) <= 0 Then
'顯示提示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:請勾選要取消稽核的紀錄。"
'跳離副程式
Exit Sub
End If
'詢問是否要清空稽核
If MsgBox("請問是否確定要清空稽核呢?", vbYesNo, "詢問") = vbNo Then
Exit Sub
End If
'宣告ADO資料庫連結物件
Dim objCnn_Del As ADODB.Connection
'宣告ADO資料錄物件
Dim objRst_Del As ADODB.Recordset
'設定ADO資料庫連結物件
Set objCnn_Del = New ADODB.Connection
'設定ADO資料錄物件
Set objRst_Del = New ADODB.Recordset
'開啟資料庫
objCnn_Del.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'更新稽核取消資料
objCnn_Del.Execute "Update [資料表1] " & _
"Set [稽核者] = '' , " & _
"[稽核日期] = '' " & _
"Where [AID] In (" & Left(str_DeleteID, Len(str_DeleteID) - 1) & ")"
'關閉資料庫
objCnn_Del.Close
'釋放記憶體空間
Set objCnn_Del = Nothing
'重新載入資料
Call loadName
End Sub
'人員代碼輸入文字框按鍵放開事件副程式
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
'重新載入資料
Call loadName
End Sub
'人員姓名文字框按鍵事件副程式
Private Sub Text4_KeyPress(KeyAscii As Integer)
'禁止所有按鍵輸入
KeyAscii = 0
End Sub
'資料重新初始化副程式
Public Sub Reload()
'設定年度下拉式選單項目,您也可以採用迴圈的方式新增
Combo1.AddItem "93", 0
Combo1.AddItem "94", 1
Combo1.AddItem "95", 2
Combo1.AddItem "96", 3
Combo1.AddItem "97", 4
Combo1.AddItem "98", 5
Combo1.AddItem "99", 6
Combo1.ListIndex = 0
'設定月份下拉式選單項目,您也可以採用迴圈的方式新增
Combo2.AddItem "01", 0
Combo2.AddItem "02", 1
Combo2.AddItem "03", 2
Combo2.AddItem "04", 3
Combo2.AddItem "05", 4
Combo2.AddItem "06", 5
Combo2.AddItem "07", 6
Combo2.AddItem "08", 7
Combo2.AddItem "09", 8
Combo2.AddItem "10", 9
Combo2.AddItem "11", 10
Combo2.AddItem "12", 11
Combo2.ListIndex = Val(Month(Date)) - 1
'設定背景圖型大小及位置
Shape1.Left = 0
Shape1.Width = UserControl.Width
'清空文字
Text1.Text = ""
Text4.Text = ""
Text5.Text = ""
'清空訊息
labMessage.Caption = ""
'清空清單
ListView1.ListItems.Clear
End Sub
'載入資料副程式
Private Sub loadName()
'開啟資料錄
objRst.Open "select * from [資料表2] " & _
"where [UID] like '" & Text1.Text & "'", _
objCnn, adOpenStatic, adLockPessimistic
'當發現有資料時
If objRst.RecordCount > 0 Then
'設定人員姓名
Text4.Text = objRst("UNAME")
'設定群組名稱
Text5.Text = objRst("UGROUP")
'當有人員姓名與群組名稱時
If Len(Text1.Text) > 0 And Len(Text4.Text) > 0 Then
'呼叫載入加班資料清單副程式
Call A
End If
Else
'清除文字
Text4.Text = ""
Text5.Text = ""
'清除清單
ListView1.ListItems.Clear
End If
關閉資料錄
objRst.Close
End Sub
'載入加班資料清單副程式
Private Sub A()
'宣告ADO資料庫連結物件
Dim objCnn_A As ADODB.Connection
'宣告ADO資料錄物件
Dim objRst_A As ADODB.Recordset
'宣告清單項目物件
Dim objItem As ListItem
'宣告小時計數變數
Dim lng_TotalHour As Long
'宣告分鐘計數變數
Dim lng_TotalMinute As Long
'建立ADO資料庫連結物件
Set objCnn_A = New ADODB.Connection
'建立ADO資料錄物件
Set objRst_A = New ADODB.Recordset
'開啟資料庫
objCnn_A.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'開啟資料錄
objRst_A.Open "select * from [資料表1] where " & _
"[單據年] like '" & Trim(Combo1.Text & "") & "' And " & _
"[單據月] like '" & Trim(Combo2.Text & "") & "' And " & _
"[編號] like '" & Trim(Text1.Text & "") & "' And " & _
"[姓名] like '" & Trim(Text4.Text & "") & "'", _
objCnn_A, adOpenStatic, adLockPessimistic
'清空清單項目
ListView1.ListItems.Clear
'巡覽所有資料錄
Do Until objRst_A.EOF
'設定增加清單項目
Set objItem = ListView1.ListItems.Add(, , Trim(objRst_A("AID") & ""))
objItem.SubItems(1) = Trim(objRst_A("加班事由") & "")
objItem.SubItems(2) = Trim(objRst_A("加班開始日期") & "") & " " & Trim(objRst_A("加班開始時間") & "") & " ~ " & _
Trim(objRst_A("加班結束日期") & "") & " " & Trim(objRst_A("加班結束時間") & "")
objItem.SubItems(3) = Trim(objRst_A("加班共計小時") & "") & "小時" & Trim(objRst_A("加班共計分鐘") & "") & "分鐘"
objItem.SubItems(4) = Trim(objRst_A("加班開始日期") & "")
objItem.SubItems(5) = Trim(objRst_A("加班開始時間") & "")
objItem.SubItems(6) = Trim(objRst_A("加班結束日期") & "")
objItem.SubItems(7) = Trim(objRst_A("加班結束時間") & "")
objItem.SubItems(8) = Trim(objRst_A("加班共計小時") & "")
objItem.SubItems(9) = Trim(objRst_A("加班共計分鐘") & "")
objItem.SubItems(10) = Trim(objRst_A("每小時金額") & "")
objItem.SubItems(11) = Trim(objRst_A("稽核者") & "")
objItem.SubItems(12) = Trim(objRst_A("稽核日期") & "")
'設定顏色
objItem.ListSubItems(2).ForeColor = vbBlack
'統計所有加班小時
lng_TotalHour = lng_TotalHour + Val(Trim(objRst_A("加班共計小時") & ""))
'統計所有加班分鐘
lng_TotalMinute = lng_TotalMinute + Val(Trim(objRst_A("加班共計分鐘") & ""))
'移動資料錄到下一筆
objRst_A.MoveNext
Loop
'關閉資料錄
objRst_A.Close
'關閉資料庫
objCnn_A.Close
'釋放記憶體空間
Set objRst_A = Nothing
Set objCnn_A = Nothing
'宣告計數變數
Dim lngI As Long
'巡覽所有清單項目
For lngI = 1 To ListView1.ListItems.Count
'當發現有資料被稽核過
If Len(ListView1.ListItems(lngI).SubItems(11)) > 0 Then
'設定顏色
ListView1.ListItems(lngI).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(1).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(2).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(3).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(4).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(5).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(6).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(7).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(8).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(9).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(10).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(11).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(12).ForeColor = vbBlue
End If
Next lngI
End Sub
'加班時間稽核單自訂控制項大小改變事件副程式
Private Sub UserControl_Resize()
'重新設定背景圖型大小及位置
Shape1.Left = 0
Shape1.Width = UserControl.Width
End Sub
'加班時間稽核單自訂控制項結束事件副程式
Private Sub UserControl_Terminate()
'關閉資料庫
objCnn.Close
'釋放記憶體空間
Set objCnn = Nothing
End Sub
2.6.4 加班時間統計表之控制項設計¶
Step 1:這是加班單統計的控制項。請參考如圖2-4的版面配置。
圖 2‑4 加班時間統計表之介面配置
Step 2:請加以下程式碼加入使用者自訂控制項中。
'設定所有變數必須宣告才能使用
Option Explicit
'宣告ADO資料庫連結物件
Dim objCnn As ADODB.Connection
'宣告ADO資料錄物件
Dim objRst As ADODB.Recordset
'宣告清單項目物件
Dim objItem As ListItem
'加班時間統計單自訂使用者控制項初始化事件副程式
Private Sub UserControl_Initialize()
'建立資料庫連結物件
Set objCnn = New ADODB.Connection
'開啟資料庫
objCnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'建立資料錄物件
Set objRst = New ADODB.Recordset
'設定起始日數值
DTPicker1.Value = Year(Date) & "/" & Month(Date) & "/1"
'利用IsDate判斷該月份最後一日
If IsDate(Year(Date) & "/" & Month(Date) & "/31") = False Then
DTPicker2.Value = Year(Date) & "/" & Month(Date) & "/30"
If IsDate(Year(Date) & "/" & Month(Date) & "/30") = False Then
DTPicker2.Value = Year(Date) & "/" & Month(Date) & "/29"
If IsDate(Year(Date) & "/" & Month(Date) & "/29") = False Then
DTPicker2.Value = Year(Date) & "/" & Month(Date) & "/28"
End If
End If
Else
DTPicker2.Value = Year(Date) & "/" & Month(Date) & "/31"
End If
'增加處室下拉式選單項目
Combo4.AddItem "不統計", 0
Combo4.ListIndex = 0
'設定背景圖形大小及位置
Shape1.Left = 0
Shape1.Width = UserControl.Width
'呼叫載入處室資料到下拉是清單副程式
Call B
End Sub
'處室下拉是清單點選事件副程式
Private Sub Combo4_Click()
'清除文字框
Text1.Text = ""
Text1.BackColor = &HFFC0C0
Text1.Enabled = False
Text4.Text = ""
'清除訊息
labMM_Money.Caption = ""
labMM_Hour.Caption = ""
labMM_Minute.Caption = ""
labMessage.Caption = ""
'清除清單
ListView1.ListItems.Clear
'當選擇到不統計時
If Trim(Combo4.Text & "") = "不統計" Then
'清除文字框
Text1.Text = ""
Text1.BackColor = &HFFFFFF
Text1.Enabled = True
Text4.Text = ""
'清除訊息
labMM_Money.Caption = ""
labMM_Hour.Caption = ""
labMM_Minute.Caption = ""
labMessage.Caption = ""
'反之
Else
'載入清單資料
Call loadName
End If
End Sub
'開始統計按鈕點選事件副程式
Private Sub Command1_Click()
'當選擇不統計時
If Len(Text1.Text) <= 0 And Combo4.Text = "不統計" Then
'顯示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:請選擇要統計的人或處室。"
'跳離副程式
Exit Sub
End If
'當清單無資料時
If ListView1.ListItems.Count <= 0 Then
'顯示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:無加班紀錄,無法統計。"
'跳離副程式
Exit Sub
End If
'宣告計數變數
Dim lngI As Long
'宣告金額變數
Dim cuy_Money As Currency
'宣告小時變數
Dim lng_Hour As Long
'宣告分鐘變數
Dim lng_Minute As Long
'初始化變數
cuy_Money = 0
lngI = 0
'巡覽所有清單項目
For lngI = 1 To ListView1.ListItems.Count
'當選擇一:超過半小時,計算.(四捨五入)
If Option1.Value = True Then
'累加金額
cuy_Money = cuy_Money + _
(Val(ListView1.ListItems(lngI).SubItems(8)) * Val(ListView1.ListItems(lngI).SubItems(10)))
'當選擇二:不滿一小時,不計.(無條件捨去)
ElseIf Option2.Value = True Then
'累加金額
cuy_Money = cuy_Money + _
(Val(ListView1.ListItems(lngI).SubItems(8)) * Val(ListView1.ListItems(lngI).SubItems(10)))
'當分鐘超過三十
If Val(ListView1.ListItems(lngI).SubItems(9)) >= 30 Then
'累加金額
cuy_Money = cuy_Money + Val(ListView1.ListItems(lngI).SubItems(10))
End If
'當選擇三:計算分薪.(百分比,小數點四捨五入)
ElseIf Option3.Value = True Then
'累加金額
cuy_Money = cuy_Money + _
(Val(ListView1.ListItems(lngI).SubItems(8)) * Val(ListView1.ListItems(lngI).SubItems(10)))
'當分鐘超過三十
If Val(ListView1.ListItems(lngI).SubItems(9)) >= 30 Then
'累加金額
cuy_Money = cuy_Money + _
Round((Val(ListView1.ListItems(lngI).SubItems(9)) / 60) * Val(ListView1.ListItems(lngI).SubItems(10)))
End If
End If
'累計小時
lng_Hour = lng_Hour + Val(ListView1.ListItems(lngI).SubItems(8))
'累計分鐘
lng_Minute = lng_Minute + Val(ListView1.ListItems(lngI).SubItems(9))
Next lngI
'計算小時
lng_Hour = lng_Hour + (lng_Minute \ 60)
'計算分鐘
lng_Minute = lng_Minute Mod 60
'顯示訊息
labMM_Money.Caption = Format(cuy_Money, "#,###")
labMM_Hour.Caption = lng_Hour
labMM_Minute.Caption = lng_Minute
End Sub
'起始日期改變事件副程式
Private Sub DTPicker1_Change()
'清空統計訊息
labMM_Money.Caption = ""
labMM_Hour.Caption = ""
labMM_Minute.Caption = ""
labMessage.Caption = ""
'重新載入資料
Call loadName
End Sub
'結束日期改變事件副程式
Private Sub DTPicker2_Change()
'清空統計訊息
labMM_Money.Caption = ""
labMM_Hour.Caption = ""
labMM_Minute.Caption = ""
labMessage.Caption = ""
'重新載入資料
Call loadName
End Sub
'代碼文字輸入框按鍵放開事件副程式
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
'設定處室選項為不統計
Combo4.ListIndex = 0
'清空統計訊息
labMM_Money.Caption = ""
labMM_Hour.Caption = ""
labMM_Minute.Caption = ""
labMessage.Caption = ""
'重新載入資料
Call loadName
End Sub
'姓名文字輸入事件副程式
Private Sub Text4_KeyPress(KeyAscii As Integer)
'禁止所有字元輸入
KeyAscii = 0
End Sub
'重新載入初始化資料副程式
Public Sub Reload()
'設定起始日期數值
DTPicker1.Value = Year(Date) & "/" & Month(Date) & "/1"
'藉由IsDate函是判斷該月份的最後一日
If IsDate(Year(Date) & "/" & Month(Date) & "/31") = False Then
DTPicker2.Value = Year(Date) & "/" & Month(Date) & "/30"
If IsDate(Year(Date) & "/" & Month(Date) & "/30") = False Then
DTPicker2.Value = Year(Date) & "/" & Month(Date) & "/29"
If IsDate(Year(Date) & "/" & Month(Date) & "/29") = False Then
DTPicker2.Value = Year(Date) & "/" & Month(Date) & "/28"
End If
End If
Else
DTPicker2.Value = Year(Date) & "/" & Month(Date) & "/31"
End If
'新增處室下拉式選單項目
Combo4.AddItem "不統計", 0
Combo4.ListIndex = 0
'設定背景圖型大小及位置
Shape1.Left = 0
Shape1.Width = UserControl.Width
'載入處室資料到下拉是清單副程式
Call B
End Sub
'清單資料載入副程式
Private Sub loadName()
'當選擇為不統計時
If Len(Text1.Text) > 0 And Combo4.Text = "不統計" Then
'建立資料錄物件
Set objRst = New ADODB.Recordset
'開啟資料庫
objRst.Open "select * from [資料表2] " & _
"where [UID] like '" & Text1.Text & "'", _
objCnn, adOpenStatic, adLockPessimistic
'當資料錄有資料時
If objRst.RecordCount > 0 Then
'設定人員姓名
Text4.Text = objRst("UNAME")
'當人員代碼及姓名存在時
If Len(Text1.Text) > 0 And Len(Text4.Text) > 0 Then
'呼叫載入加班資料副程式
Call A
End If
'反之
Else
'清除文字框
Text4.Text = ""
'清除清單項目
ListView1.ListItems.Clear
End If
'關閉資料錄
objRst.Close
'當選擇處室統計時
ElseIf Len(Text1.Text) <= 0 And Len(Text4.Text) <= 0 And Combo4.Text <> "不統計" Then
'呼叫載入加班資料副程式
Call A
End If
End Sub
'載入加班資料副程式
Private Sub A()
'宣告ADO資料庫連結物件
Dim objCnn_A As ADODB.Connection
'宣告ADO資料錄物件
Dim objRst_A As ADODB.Recordset
'宣告清單項目物件
Dim objItem As ListItem
'宣告計數小時變數
Dim lng_TotalHour As Long
'宣告計數分鐘變數
Dim lng_TotalMinute As Long
'建立ADO資料庫連結物件
Set objCnn_A = New ADODB.Connection
'建立ADO資料錄物件
Set objRst_A = New ADODB.Recordset
'開啟資料庫
objCnn_A.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'當選擇為不統計時
If Len(Text1.Text) > 0 And Len(Text4.Text) > 0 And Combo4.Text = "不統計" Then
'開啟資料錄
objRst_A.Open "select * from [資料表1] where " & _
"[單據年] like '" & Trim(Year(DTPicker1.Value) - 1911 & "") & "' And " & _
"[編號] like '" & Trim(Text1.Text & "") & "' And " & _
"[姓名] like '" & Trim(Text4.Text & "") & "' And " & _
"Len([稽核者]) > 0 ", _
objCnn_A, adOpenStatic, adLockPessimistic
'當選擇處室時
ElseIf Len(Text1.Text) <= 0 And Len(Text4.Text) <= 0 And Combo4.Text <> "不統計" Then
'開啟資料錄
objRst_A.Open "select * from [資料表1] where " & _
"[單據年] like '" & Trim(Year(DTPicker1.Value) - 1911 & "") & "' And " & _
"[處室] like '" & Trim(Combo4.Text & "") & "' And " & _
"Len([稽核者]) > 0 ", _
objCnn_A, adOpenStatic, adLockPessimistic
End If
'清除清單項目
ListView1.ListItems.Clear
'巡覽所有資料錄
Do Until objRst_A.EOF
'當資料錄的日期條件符合範圍時
If CDate(objRst_A("加班開始日期")) > DTPicker1.Value - 1 And _
CDate(objRst_A("加班開始日期")) < DTPicker2.Value + 1 Then
'增加清單項目,加班單代碼
Set objItem = ListView1.ListItems.Add(, , Trim(objRst_A("AID") & ""))
'假若選擇為不統計
If Len(Text1.Text) > 0 And Len(Text4.Text) > 0 And Combo4.Text = "不統計" Then
'設定加班事由
objItem.SubItems(1) = Trim(objRst_A("加班事由") & "")
'假若選擇處室
ElseIf Len(Text1.Text) <= 0 And Len(Text4.Text) <= 0 And Combo4.Text <> "不統計" Then
'設定加班人員姓名及加班事由
objItem.SubItems(1) = Trim(objRst_A("姓名") & "") & " " & Trim(objRst_A("加班事由") & "")
End If
'設定加班資料到清單項目中
objItem.SubItems(2) = Trim(objRst_A("加班開始日期") & "") & " " & Trim(objRst_A("加班開始時間") & "") & " ~ " & _
Trim(objRst_A("加班結束日期") & "") & " " & Trim(objRst_A("加班結束時間") & "")
objItem.SubItems(3) = Trim(objRst_A("加班共計小時") & "") & "小時" & Trim(objRst_A("加班共計分鐘") & "") & "分鐘"
objItem.SubItems(4) = Trim(objRst_A("加班開始日期") & "")
objItem.SubItems(5) = Trim(objRst_A("加班開始時間") & "")
objItem.SubItems(6) = Trim(objRst_A("加班結束日期") & "")
objItem.SubItems(7) = Trim(objRst_A("加班結束時間") & "")
objItem.SubItems(8) = Trim(objRst_A("加班共計小時") & "")
objItem.SubItems(9) = Trim(objRst_A("加班共計分鐘") & "")
objItem.SubItems(10) = Trim(objRst_A("每小時金額") & "")
objItem.SubItems(11) = Trim(objRst_A("稽核者") & "")
objItem.SubItems(12) = Trim(objRst_A("稽核日期") & "")
'設定顏色
objItem.ListSubItems(2).ForeColor = vbBlack
'累計加班時數
lng_TotalHour = lng_TotalHour + Val(Trim(objRst_A("加班共計小時") & ""))
'累計加班分鐘
lng_TotalMinute = lng_TotalMinute + Val(Trim(objRst_A("加班共計分鐘") & ""))
End If
'將資料錄移動到下一筆
objRst_A.MoveNext
Loop
'關閉資料錄
objRst_A.Close
'關閉資料庫
objCnn_A.Close
'釋放記憶體空間
Set objRst_A = Nothing
Set objCnn_A = Nothing
'宣告計數變數
Dim lngI As Long
'巡覽所有清單資料
For lngI = 1 To ListView1.ListItems.Count
'當發現有被稽核的資料項目
If Len(ListView1.ListItems(lngI).SubItems(11)) > 0 Then
'設定顏色
ListView1.ListItems(lngI).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(1).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(2).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(3).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(4).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(5).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(6).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(7).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(8).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(9).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(10).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(11).ForeColor = vbBlue
ListView1.ListItems(lngI).ListSubItems(12).ForeColor = vbBlue
End If
Next lngI
End Sub
'載入處室資料到下拉是清單副程式
Private Sub B()
'建立資料錄物件
Set objRst = New ADODB.Recordset
'開啟資料錄
objRst.Open "select DISTINCT [UGROUP] from [資料表2] ", _
objCnn, adOpenStatic, adLockPessimistic
'宣告索引變數
Dim int_Index As Integer
'設定索引初始值
int_Index = 1
'清除處室下拉式選單項目
Combo4.Clear
'增加處室下拉式選單項目
Combo4.AddItem "不統計", 0
Combo4.ListIndex = 0
'巡覽所有資料錄
Do Until objRst.EOF = True
'當發現有處室名稱時
If Len(Trim(objRst("UGROUP") & "")) > 0 Then
'新增處室名稱至下拉式選單中
Combo4.AddItem Trim(objRst("UGROUP") & ""), int_Index
'索引值累加
int_Index = int_Index + 1
End If
'資料錄往下移動一筆
objRst.MoveNext
Loop
'關閉資料錄
objRst.Close
End Sub
'加班時間統計表自訂使用者控制項大小調整事件副程式
Private Sub UserControl_Resize()
'設定背景圖型大小及位置
Shape1.Left = 0
Shape1.Width = UserControl.Width
End Sub
'加班時間統計表自訂使用者控制項結束事件副程式
Private Sub UserControl_Terminate()
'關閉資料庫
objCnn.Close
'釋放記憶體空間
Set objCnn = Nothing
End Sub
2.6.5 職員管理之控制項設計¶
Step 1:這是職員管理的控制項。請參考如圖2-5的版面配置。
圖 2‑5 職員管理之介面配置
Step 2:請加以下程式碼加入使用者自訂控制項中。
'設定所有變數必須宣告才能使用
Option Explicit
'宣告ADO資料庫連結物件
Dim objCnn As ADODB.Connection
'宣告ADO資料錄物件
Dim objRst As ADODB.Recordset
'宣告清單項目物件
Dim objItem As ListItem
'職員管理自訂控制項初始化事件副程式
Private Sub UserControl_Initialize()
'建立ADO資料庫連結物件
Set objCnn = New ADODB.Connection
'開啟資料庫
objCnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'建立ADO資料錄物件
Set objRst = New ADODB.Recordset
'設定背景圖型大小及位置
Shape1.Left = 0
Shape1.Width = UserControl.Width
'設定清單排序功能
ListView1.Sorted = True
ListView1.SortKey = 1
'呼叫載入職員資料副程式
Call A
End Sub
'單筆新增按鈕點選事件副程式
Private Sub Command1_Click()
'宣告要使用的變數
Dim strRecord_A, strRecord_B, strRecord_C As String
'當沒有輸入編號
If Len(Text1.Text) <= 0 Then
'顯示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未輸入編號。"
'跳離副程式
Exit Sub
End If
'當沒有輸入姓名
If Len(Text2.Text) <= 0 Then
'顯示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未輸入姓名。"
'跳離副程式
Exit Sub
End If
'當沒有輸入處室名稱
If Len(Text3.Text) <= 0 Then
'顯示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:尚未輸入處室。"
'跳離副程式
Exit Sub
End If
'取得相關資料
strRecord_A = Trim(Text1.Text & "")
strRecord_B = Trim(Text2.Text & "")
strRecord_C = Trim(Text3.Text & "")
'宣告ADO資料庫連結物件
Dim objCnn_ADD As ADODB.Connection
'宣告ADO資料錄物件
Dim objRst_Add As ADODB.Recordset
'宣告字串變數
Dim strSQL As String
'建立ADO資料庫連結物件
Set objCnn_ADD = New ADODB.Connection
'建立ADO資料錄物件
Set objRst_Add = New ADODB.Recordset
'設定資料庫連結命令文字
strSQL = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb" & ";" & _
"Mode=Read|Write|Share Deny None;" & _
"Persist Security Info=False;"
'開啟資料庫
objCnn_ADD.Open strSQL
'設定資料錄已使用者代碼來搜尋
strSQL = "Select * From [資料表2] Where [UID] Like '" & Trim(Text1.Text & "") & "'"
'開啟資料錄
objRst_Add.Open strSQL, objCnn_ADD, adOpenStatic, adLockPessimistic
'當沒有找到資料
If objRst_Add.RecordCount <= 0 Then
'則準備新增
objRst_Add.AddNew
'設定代碼
objRst_Add("UID") = Trim(Text1.Text & "")
'設定人員姓名
objRst_Add("UNAME") = Trim(Text2.Text & "")
'設定處室名稱
objRst_Add("UGROUP") = Trim(Text3.Text & "")
'當選擇稽核權時
If Check1.Value = 1 Then
'紀錄稽核資料
objRst_Add("UCHECK") = "Yes"
Else
'清除稽核資料
objRst_Add("UCHECK") = ""
End If
'資料更新
objRst_Add.Update
'當發現有資料時
ElseIf objRst_Add.RecordCount > 0 Then
'顯示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:編號重複,無法加入。"
End If
'關閉資料錄
objRst_Add.Close
'關閉資料庫
objCnn_ADD.Close
'釋放記憶體空間
Set objRst_Add = Nothing
Set objCnn_ADD = Nothing
'呼叫載入職員資料副程式
Call A(Trim(Text1.Text & ""))
End Sub
'批次刪除按鈕點選事件副程式
Private Sub Command2_Click()
'宣告計數變數
Dim intI As Integer
'宣告代碼字串變數
Dim str_DeleteID As String
'初始化代碼字串
str_DeleteID = ""
'巡覽所有清單資料項目
For intI = 1 To ListView1.ListItems.Count
'當發現有被勾選時
If ListView1.ListItems(intI).Checked = True Then
'紀錄代碼到字串中
str_DeleteID = str_DeleteID & ListView1.ListItems(intI).Text & ","
End If
Next intI
'當沒有勾選代碼
If Len(str_DeleteID) <= 0 Then
'顯示提示訊息
labMessage.ForeColor = vbRed
labMessage.Caption = "訊息:請勾選要刪除的人員。"
'跳離副程式
Exit Sub
End If
'詢問是否要刪除資料
If MsgBox("請問是否確定要刪除呢?", vbYesNo, "訊問") = vbNo Then
Exit Sub
End If
'宣告ADO資料連結物件
Dim objCnn_Del As ADODB.Connection
'建立ADO資料連結物件
Set objCnn_Del = New ADODB.Connection
'開啟資料庫
objCnn_Del.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'執行刪除命令
objCnn_Del.Execute "Delete From [資料表2] " & _
"Where [AID] In (" & Left(str_DeleteID, Len(str_DeleteID) - 1) & ")"
'關閉資料庫
objCnn_Del.Close
'釋放記憶體空間
Set objCnn_Del = Nothing
'呼叫載入職員資料副程式
Call A
End Sub
'批次修改按鈕被點選事件副程式
Private Sub Command3_Click()
'宣告計數變數
Dim intI As Integer
'宣告代碼字串變數
Dim str_AID As String
'宣告ADO資料庫連結物件
Dim objCnn_ADD As ADODB.Connection
'清空代碼字串
str_AID = ""
'巡覽清單中所有項目
For intI = 1 To ListView1.ListItems.Count
'當有資料項目被勾選
If ListView1.ListItems(intI).Checked = True Then
'字串累計代碼
str_AID = str_AID & ListView1.ListItems(intI).Text & ","
End If
Next intI
'當沒有勾選代碼
If Len(str_AID) <= 0 Then
'宣告字串變數
Dim str_Check As String
'當備核取時
If Check1.Value = 1 Then
'設定核取旗標
str_Check = "Yes"
'反之
ElseIf Check1.Value = 0 Then
'清除核取旗標
str_Check = ""
End If
'建立ADO資料庫連結物件
Set objCnn_ADD = New ADODB.Connection
'開啟資料庫
objCnn_ADD.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'執行資料庫更新
objCnn_ADD.Execute "Update [資料表2] " & _
"Set [UNAME] = '" & Trim(Text2.Text & "") & "' , " & _
"[UGROUP] = '" & Trim(Text3.Text & "") & "', " & _
"[UCHECK] = '" & Trim(str_Check & "") & "' " & _
"Where [AID] Like '" & Trim(ListView1.SelectedItem.Text & "") & "'"
'關閉資料庫
objCnn_ADD.Close
'釋放記憶體空間
Set objCnn_ADD = Nothing
'呼叫載入職員資料副程式
Call A(Trim(ListView1.SelectedItem.Text & ""))
'反之
Else
'詢問是否要整批修改處室名稱
If MsgBox("請問您要整批修改處室名稱嗎?", vbYesNo, "訊問") = vbYes Then
'禁能文字框
Text1.Enabled = False
Text2.Enabled = False
'建立ADO資料庫連結物件
Set objCnn_ADD = New ADODB.Connection
'開啟資料庫
objCnn_ADD.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'執行資料庫更新
objCnn_ADD.Execute "Update [資料表2] " & _
"Set [UGROUP] = '" & Trim(Text3.Text & "") & "' " & _
"Where [AID] In (" & Left(str_AID, Len(str_AID) - 1) & ")"
'關閉資料庫
objCnn_ADD.Close
'釋放記憶體空間
Set objCnn_ADD = Nothing
'呼叫載入職員資料副程式
Call A
'設定文字框
Text1.BackColor = &HFFFFFF
Text2.BackColor = &HFFFFFF
'設定控制項啟用
Text1.Enabled = True
Text2.Enabled = True
Check1.Enabled = True
End If
End If
End Sub
'清單欄位點選事件副程式
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
'設定允許排序
ListView1.Sorted = True
'設定排序的鍵值
ListView1.SortKey = ColumnHeader.Index - 1
End Sub
'清單項目被勾選事件副程式
Private Sub ListView1_ItemCheck(ByVal Item As MSComctlLib.ListItem)
'宣告計數變數
Dim intI As Integer
'宣告代碼字串變數
Dim str_AID As String
'初始化變數
str_AID = ""
'巡覽所有清單項目
For intI = 1 To ListView1.ListItems.Count
'當有資料備核取時
If ListView1.ListItems(intI).Checked = True Then
'累計代碼到字串中
str_AID = str_AID & ListView1.ListItems(intI).Text & ","
End If
Next intI
'設定文字框及啟用控制項
Text1.BackColor = &HFFFFFF
Text2.BackColor = &HFFFFFF
Text1.Enabled = True
Text2.Enabled = True
Check1.Enabled = True
'當代碼存在時
If Len(str_AID) > 0 Then
'設定清除文字框及禁用控制項
Text1.BackColor = &HFFC0FF
Text2.BackColor = &HFFC0FF
Text1.Text = ""
Text2.Text = ""
Text1.Enabled = False
Text2.Enabled = False
Check1.Enabled = False
'反之
Else
'當清單中有資料時
If ListView1.ListItems.Count > 0 Then
'設定清單項目資料到文字框中
Text1.Text = ListView1.SelectedItem.SubItems(1)
Text2.Text = ListView1.SelectedItem.SubItems(2)
Text3.Text = ListView1.SelectedItem.SubItems(3)
'設定核取框動作,依據清單中的資料
If Trim(ListView1.SelectedItem.SubItems(4) & "") = "O" Then
Check1.Value = 1
Else
Check1.Value = 0
End If
End If
End If
End Sub
'清單項目被點選事件副程式
Private Sub ListView1_ItemClick(ByVal Item As MSComctlLib.ListItem)
'設定文字框內容,依據清單項目資料
Text1.Text = ListView1.SelectedItem.SubItems(1)
Text2.Text = ListView1.SelectedItem.SubItems(2)
Text3.Text = ListView1.SelectedItem.SubItems(3)
'設定核取框動作,依據清單中的資料
If Trim(ListView1.SelectedItem.SubItems(4) & "") = "O" Then
Check1.Value = 1
Else
Check1.Value = 0
End If
End Sub
'人員管理自訂控制項調整大小位置事件副程式
Private Sub UserControl_Resize()
'調整背景圖型大小及位置
Shape1.Left = 0
Shape1.Width = UserControl.Width
End Sub
'載入職員資料副程式
Private Sub A(Optional strListPoint As String)
'宣告ADO資料庫連結物件
Dim objCnn_A As ADODB.Connection
'宣告ADO資料錄物件
Dim objRst_A As ADODB.Recordset
'宣告清單項目物件
Dim objItem As ListItem
'建立ADO資料庫連結物件
Set objCnn_A = New ADODB.Connection
'建立ADO資料錄物件
Set objRst_A = New ADODB.Recordset
'開啟資料庫
objCnn_A.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & App.Path & "\db1.mdb;" & _
"Persist Security Info=False"
'開啟資料錄
objRst_A.Open "select * from [資料表2] Order By [UID] DESC", _
objCnn_A, adOpenStatic, adLockPessimistic
'清除清單項目
ListView1.ListItems.Clear
'巡覽所有資料錄
Do Until objRst_A.EOF
'設定新增加班項目代碼
Set objItem = ListView1.ListItems.Add(, , Trim(objRst_A("AID") & ""))
'設定人員編號
objItem.SubItems(1) = Trim(objRst_A("UID") & "")
'設定人員姓名
objItem.SubItems(2) = Trim(objRst_A("UNAME") & "")
'設定處室姓名
objItem.SubItems(3) = Trim(objRst_A("UGROUP") & "")
'設定稽核情形
If Trim(objRst_A("UCHECK") & "") = "Yes" Then
objItem.SubItems(4) = "O"
End If
'設定顏色
objItem.ListSubItems(2).ForeColor = vbBlack
'將資料錄移動到下一筆
objRst_A.MoveNext
Loop
'關閉資料錄
objRst_A.Close
'關閉資料庫
objCnn_A.Close
'設定記憶體空間釋放
Set objRst_A = Nothing
Set objCnn_A = Nothing
'當清單有資料時
If ListView1.ListItems.Count > 0 Then
'設定第一筆資料被選擇
ListView1.ListItems(1).Selected = True
'展開資料
ListView1.ListItems(1).EnsureVisible
'尋找資料
Set objItem = ListView1.FindItem(strListPoint, 0, , lvwPartial)
'當發現有資料時
If Not (objItem Is Nothing) = True Then
'選擇資料
objItem.Selected = True
'展開資料
objItem.EnsureVisible
End If
End If
End Sub
'人員管理自訂控制項結束事件副程式
Private Sub UserControl_Terminate()
'關閉資料庫
objCnn.Close
'釋放記憶體空間
Set objCnn = Nothing
End Sub
2.6.7 加班薪資統計系統展示¶
我們預設管理者帳號:管理者、密碼:ADMIN;稽核者帳號:稽核者、密碼:CHECK;輸入者帳號:輸入者、密碼:ACC。接下來我們將以管理者的權限為各位介紹全部的功能。請參考圖2-6~2-10。
圖 2‑6 管理者登入畫面
圖 2‑7 加班單登錄畫面
圖 2‑8 加班稽核單畫面
圖 2‑9 加班統計單畫面
圖 2‑10 職員管理畫面
2.7 修改重點¶
修改本程式基本上是修改使用者自訂控制項,只要資料庫結構不變,相同的資料庫就可配合各種使用者自訂控制項,製作出不同的程式系統。因此要修改本程式的時候,應該要將焦點放在使用者自訂控制項,而設計的時候千萬不要讓各控制項產生關聯,因為有了關聯之後,你就無法自由的移植控制項,程式會被綁死。
2.8 結論¶
透過顯示與隱藏工具按鈕就可以達到權限功能控制的目的,這是很簡單的寫法。而本程式將介面與控制項分開設計,將有助於未來擴充能力,因為控制項可以隨時移值,並且控制項之間並無關連,所以可以達到單獨移植的能力,而不需修改任何程式碼,這種設計方式就可達到程式碼重複使用的目的。您若覺得本程式的介面不符合您的使用,您大可移除掉介面,重新設計,然後透過移植控制項的方式,就可以完成您的程式了。
有時候透過數學的計算,您可以省去許多邏輯的判斷,就以本程式來說透過簡單的加減法,就可以知道時間日期是否有重疊,倘若您用邏輯判斷的寫法,包準您會寫出長篇大論出來,而功能卻是一樣的,因為筆者已經嘗試過用邏輯的寫法,您大可放心。
2.9 備註¶
本程式有引用Spencer Yang所設計的函數,請讀者參考,該函數可以格式化並計算兩個日期的時間差,相當好用,故在此推薦使用。也感謝Spencer Yang無私的貢獻。
版權聲明¶
Lai Tai-Yu (賴岱佑)