2010-09-20 59 views
1

我有一個訪問表單 - 讓我們稱之爲「添加人工」(Access 2007),將數據保存到表中。在保存前檢查Microsoft Access表單值

表有特別的兩列被稱爲「開始日期」和「結束日期」(該表存儲任務)

還有一個名爲FiscalYears另一個表,其中包括財年,這是開始和結束日期結構如下

FyID FYear 的StartDate 結束日期

實施例的數據:

FYId FYear StartDate EndDate 
----------------------------- 
1 2010 10/1/2009 9/30/2010 
2 2011 10/1/2010 9/30/2011 

因此,在我的「添加人工表格」中,如果有人輸入跨兩個會計年度的勞動力,我需要輸入兩個人工分錄。下面是一個例子

如果用戶選擇了工黨開始日期= 2009/6/30 和結束日期2010年10月2日,它跨越了兩個財年

所以在我的勞動表,我應該進入兩件事

LaborID StartDate EndDate 
----------------------------- 
1  6/30/2009 9/30/2010 
2  10/1/2010 10/2/2010 

基本上我需要之前,我保存記錄做了檢查,並添加兩個記錄,如果它們跨越財年,現在我只是一味地做保存記錄的形式(內置),但我想我需要添加一些VBA。我幾乎沒有使用過Access,所以這可能很簡單(希望)。我在想,而不是隻調用保存記錄的事件,我需要它來添加自定義VBA。

回答

3

假設您有添加的日期未綁定的形式,你可以說:

Dim rsFY As DAO.Recordset 
Dim rsAL As DAO.Recordset 
Dim db As Database 
Dim sSQL As String 

Set db = CurrentDb 

''Select all years from the fiscal years table  
sSQL = "SELECT FYear, StartDate, EndDate " _ 
    & "FROM FiscalYears WHERE StartDate>=#" & Format(Me.StartDate, "yyyy/mm/dd") _ 
    & "# Or EndDate <=#" & Format(Me.Enddate, "yyyy/mm/dd") _ 
    & "# ORDER BY FYear" 

Set rsFY = db.OpenRecordset(sSQL) 
Set rsAL = db.OpenRecordset("AddLabor") ''table 

''Populate recordset 
rsFY.MoveLast 
rsFY.MoveFirst 

Do While Not rsFY.EOF 

    ''Add records for each year selected 
    rsAL.AddNew 
    If rsFY.AbsolutePosition = 0 Then 
     rsAL!StartDate = Format(Me.StartDate, "yyyy/mm/dd") 
    Else 
     rsAL!StartDate = rsFY!StartDate 
    End If 

    If rsFY.AbsolutePosition + 1 = rsFY.RecordCount Then 
     rsAL!Enddate = Format(Me.Enddate, "yyyy/mm/dd") 
    Else 
     rsAL!Enddate = rsFY!Enddate 
    End If 

    rsAL.Update 

    rsFY.MoveNext 
Loop 

如果代碼是與顯示Addlabor表子窗體主要形式運行,你可以更新子窗體顯示新記錄如下:

Me.Addlabor_subform.Requery 
1

爲什麼你需要一個FiscalYears表?如果貴組織的會計年度始終始於10月1日,並於9月30日結束,則可以使用某項功能來確定給定日期的會計年度。

Public Function Fy(ByVal pDate As Date) As Integer 
    Dim intYear As Integer 
    Dim intReturn As Integer 
    intYear = Year(pDate) 
    If pDate > DateSerial(intYear, 9, 30) Then 
     intReturn = intYear + 1 
    Else 
     intReturn = intYear 
    End If 
    Fy = intReturn 
End Function 

而簡單的函數返回給定年份的開始日期和結束日期。

Public Function FyStart(ByVal pYear As Integer) As Date 
    FyStart = DateSerial(pYear - 1, 10, 1) 
End Function 

Public Function FyEnd(ByVal pYear As Integer) As Date 
    FyEnd = DateSerial(pYear, 9, 30) 
End Function 

然後,您可以決定多少財年被包括在一個給定的日期範圍:

Fy(EndDate) - Fy(StartDate) 

但是,因爲你說:「開始的時間我可能會完全關閉基地= 2009/6/30和結束日期10/2/2010「跨越兩年。然而,這個表達式返回2(3年):

Fy(#10/2/2010#) - Fy(#6/30/2009#) 
+0

我可以看到這樣做它的描述,因爲你可能想分配費用的一部分,第一FY和和部分第二的方式。當然,這可以用SQL來完成,但用表中的記錄更容易。在我看來,他所做的更多的是「分配」表,即花費一段時間的勞動力和創造記錄來打破相關財政年度的成本分配。這對於會計目的而言通常非常重要。 – 2010-09-20 21:19:38

+0

@David我不知道我們是否在談論2種不同的東西。我試圖提出的一點是,他可能可以在不使用FiscalYears表的情況下將勞動時間分成單獨的FY記錄。 – HansUp 2010-09-20 23:20:53