在 IBM Lotus Approach 中計算淨工作日

genusBIT發表於2008-09-11

如果想使用 IBM Lotus Approach 跟蹤員工的工作日數,現在可以使用全新的淨工作日功能。該解決方案是採用 LotusScript. 編寫的,因此,可以指定日期範圍以及假期和週末來計算工作日數。

為了正確規劃專案,您需要知道員工或團隊成員的確切工作日數嗎?或許需要跟蹤員工的休息時間。IBM Lotus 1-2-3 中的 @Networkdays 功能可以這樣做,但是直到目前為止,在 IBM Lotus Approach 中還無法使用這一相同的功能。為了在 Lotus Approach 中模擬 @Networkdays 功能,我們使用 LotusScript. 建立了淨工作日功能。這個簡單的解決方案可以在任何 Lotus Approach 9.8 資料庫中實現,採用 IBM Lotus SmartSuite 9.8 的任何受支援的語言版本。

本文介紹 Lotus Approach 中的淨工作日功能的工作原理以及如何在任何新的或者現有的 Lotus Approach 資料庫中實現該解決方案。

什麼是淨工作日及其工作原理

淨工作日功能計算從給定開始日期到給定結束日期的總工作日數。它排除了這兩個日期之間的週末以及所有假期。此功能要求使用者輸入開始日期和結束日期。然後通過扣除使用者定義的週末和假期列表來計算實際的工作日數。

可以使用此功能來計算一年之中或者具體開始和結束日期(如 6 月 1 日到 12 月 31 日)之間的總工作日數。為此,需要兩個資料庫。第一個資料庫支援淨工作日功能,第二個資料庫列出一年或者具體時間段之內的假期。

這兩個資料庫被關聯在一起,執行一個迴圈便可將一個資料庫中的日期與另一個資料庫中的日期相比較。這可以防止任何一天被多次計算。淨工作日功能計算假期和週末的總天數, 然後從總數中將其扣除。所得的結果就是給定開始日期和結束日期之間的總工作日數。

注意: 此解決方案專門用於具有最新修復包的 Lotus SmartSuite 9.8。淨工作日功能可以工作在 Lotus SmartSuite 9.8 支援的所有語言版本上。

關於淨工作日功能的最傑出的方面是可以非常輕鬆地將其新增到現有的 Lotus Approach 資料庫中。在本文的後面部分中,我們介紹如何在新的和現有 Lotus Approach 資料庫中實現該解決方案。

概述:使用者所見

要想了解有關淨工作日功能的工作原理的詳細資訊,下面便是從使用者角度介紹的概述。要計算總工作日數,使用者可以在顯示圖 1 時單擊 NetWorkDays 按鈕。Lotus Approach 資料中包含此按鈕。


圖 1. NetWorkDays 按鈕
NetWorkDays 按鈕

單擊此按鈕之後,一個輸入框提示使用者輸入開始日期(參見圖 2)。使用者輸入開始日期和並單擊 OK 之後,另一個框提示使用者輸入結束日期。


圖 2. Start date 提示
Start date 提示

輸入結束日期並單擊 OK 之後,使用者從圖 3 中所示的列表框中選擇週末。使用者可以不止選擇一天,但是一週之內不能選擇多於兩個週末。


圖 3. Weekend days
Weekend days

使用者完成上面的步驟之後,圖 1 中的 TotalDays 欄位便顯示指定開始日期和結束日期之間的總工作日數,其中扣除了儲存在另一個資料庫中的週末和假期。在本文的後面部分,我們將介紹如何在 Lotus Approach 資料庫中實現此淨工作日功能。目前,下面是其工作原理的幕後預覽。

圖 4 顯示在兩個引用彼此資料的資料庫之間建立的關聯。


圖 4. 關聯
關聯

圖 5 顯示包含假期列表的資料庫。


圖 5. Holiday 資料庫
Holiday 資料庫 

淨工作日程式碼

單擊 NetWorkDays 按鈕之後,指令碼執行三個任務:

  • 開啟用於輸入開始日期的輸入框。
  • 開啟用於輸入結束日期的另一個輸入框。
  • 顯示所有工作日的列表。

指令碼將開始日期和結束日期轉換為所需的日期格式,然後與包含假期列表的資料庫建立連線。

輸入所有資料之後,便開始計算。如果開始日期晚於結束日期,則使用者會收到一條錯誤訊息。如果這兩個日期正確,則執行一個 For 迴圈。對於每個特別的日期,指令碼都要使用函式 Weekday (i) 確定它是哪個工作日。這樣便返回此特別工作日的各自的天數。然後指令碼再次確認它不是使用者選擇的週末之一。如果不是,則指令碼通過從包含假期列表的資料庫中扣除此資料來檢查此特別的日期是否是假期。

如果此特別的日期是假期,則指令碼不會增加總工作日數的計數。如果此日期既不是週末也不是假期,則指令碼會將計數加 1。對於開始日期和結束日期之間的所有日期(包括執行為開始和結束日期的日期)執行此迴圈。此後,指令碼計算這兩個日期之間的總工作日數。

Sub Click (Source As Button, X As Long, Y As Long, Flags As Long)
	Dim tableName As table
	Dim resultSet As ResultSet
	Dim count As Integer
	Dim Counter, j As Integer	
	Dim value As String
	Dim nRow As Integer
	CurrentView.Body.TotalDays.Text = " "
	On Error Resume Next	
	StartDate=(Inputbox$("Start Date (MM/DD/YYYY) ?", , ,300,350))	
	EndDate=(Inputbox$("End Date (MM/DD/YYYY) ?", , ,300,350))
	Dialog1.Show(1)
	Print Weekend(0),Weekend(1) 
	StartDate = Cdat(StartDate)
	EndDate = Cdat(EndDate)
	If Isdate(StartDAte) And Isdate(EndDate) Then		
		Dim wd As Integer, networkdays As Integer
		Set tableName = CurrentDocument.GetTableByName("Holidays")
		Set resultSet = tableName.CreateResultSet()
		nRow = resultSet.NumRows()
		count=1
		j = 1
		If StartDate > EndDate Then
			Messagebox ("The End Date should be greater than Start Date.")
			Exit Sub
		End If
		For i = StartDate To EndDate		
			wd% = Weekday(i)
			j =1
			
			If wd%  <> Weekend(0) And wd% <> Weekend(1) Then
				Call resultSet.FirstRow()
				Do While j <=  nRow
					If i  <> resultSet.GetValue(count) Then
						Counter = 0
						Call resultSet.NextRow()
					Else
						Counter = 1
					End If
					j = j  +1
				Loop
				If Counter  = 0 Then
					networkdays = networkdays + 1
				End If
			End If
		Next
		If networkdays = 0 Then
			Messagebox("Please enter the date in mm/dd/yyyy format.")
		End If
		CurrentView.Body.TotalDays.Text = Cstr(networkdays)	
	Else
		Messagebox("Please enter the date in mm/dd/yyyy format.")
	End If
End Sub

Weekend list 框程式碼

選擇週末之後,使用者在列表框(參見圖 3)中單擊 OK,然後指令碼確定使用者選擇作為週末的天數以及日期。不得多於兩個週末。然後指令碼將此資訊儲存在名為 Weekend (i) 的陣列中,以便以後使用。

Sub Click(Source As Lotuscommandbutton)
	Dim value As Integer
	Dim Total,Counter,Index As Integer
	Weekend(0) = 0
	Weekend(1) = 0
	Total = Dialog1.Weekends.ListCount
	For Counter = 0 To Total-1
		value = Dialog1.Weekends.IsItemSelected(Counter)
		If value = -1 Then
			Weekend(Index) = Counter+1
			Index = Index+1
		End If
	Next
	Dialog1.Close
End Sub


當使用者單擊包含工作日的列表框上的 Cancel 按鈕時,執行以下指令碼。

Sub Click(Source As Lotuscommandbutton)
Dialog1.Close
End Sub

實現淨工作日功能

要在 Lotus Approach 資料庫中使用淨工作日功能,請遵循這些步驟。

注意: 本文假設您瞭解在 Lotus Approach 中建立資料庫的方法。

  1. 在 Lotus Approach 資料庫中,新增以下四個欄位:
    • StartDate
    • EndDate
    • TotalWorkingDays(該欄位用於建立與 holiday 資料庫的關聯。)
    • TotalDays
  2. 如果此資料庫是新資料庫,則建立一個空白表格,並將 TotalDays 欄位拖動到該表格上。在現有資料庫中,建立一個欄位輸入框。
  3. 建立一個名為 NetWorkDays 的按鈕。
  4. 複製單擊該按鈕時要執行的指令碼,並將此指令碼連結到該按鈕。單擊此按鈕時,將執行該指令碼。
  5. 儲存 APR 檔案和資料庫。
  6. 如果需要,建立另一個新的資料庫以儲存整個一年或者特定時間段內的假期資訊。此資料庫必須包含 holidays 欄位。
  7. 儲存此 APR 和 DBF 檔案。
  8. 擁有兩個資料庫之後,關聯 TotalWorkingDays 和 holidays 欄位。

故障排除

如果使用者執行操作時發生以下情況,則淨工作日功能返回錯誤訊息:

  • 輸入的開始日期晚於指定的結束日期
  • 輸入日期的格式不正確
  • 一週之內選擇了多於兩天的週末

語言版本的資訊

目前,所有淨工作日功能顯示的錯誤訊息都採用英語。如果想採用其他語言顯示錯誤訊息,可以翻譯這些訊息。

同樣,列表框中的工作日以及所有輸入框中的文字也都採用英語顯示。如果需要,可以翻譯所有 UI 元素中的文字。還可以更改日期格式以匹配本地設定。

結束語

我們在確定解決方案時面臨兩個挑戰。首先,Lotus Approach 是一個成熟而且穩定的產品。實現新功能(如淨工作日功能)所做的任何重要的程式碼更改都會影響某些現有功能。我們從事了這個具有挑戰性的任務,並分析了實現我們的解決方案的方法。經過大量分析之後,我們決定採用 LotusScript. 實現這個功能。

我們面臨的第二個挑戰涉及日期格式和各種語言版本。Lotus SmartSuite 有 11 種語言版本。研究了所有語言版本的日期格式之後,我們能夠修改該程式碼以接受所有日期格式,從而在所有支援的語言版本中正確計算出淨工作日。

我們希望所有 Lotus Approach 使用者都能發現淨工作日功能非常有用,而且易於使用。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14751907/viewspace-444264/,如需轉載,請註明出處,否則將追究法律責任。

相關文章