2010-09-20 63 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