Ms access 保存前请检查Microsoft Access表单值

Ms access 保存前请检查Microsoft Access表单值,ms-access,ms-access-2007,vba,Ms Access,Ms Access 2007,Vba,我有一个访问表单——我们称之为“添加人工”(Access 2007),它将数据保存到表中 该表有两列,分别称为“开始日期”和“结束日期”(此表存储任务) 还有另一个名为FiscalYears的表,其中包括财政年度的开始和结束日期,其结构如下 费伊德 FYear 起始日期 结束日期 示例数据: FYId FYear StartDate EndDate ----------------------------- 1 2010 10/1/2009 9/30/2010 2 2011

我有一个访问表单——我们称之为“添加人工”(Access 2007),它将数据保存到表中

该表有两列,分别称为“开始日期”和“结束日期”(此表存储任务)

还有另一个名为FiscalYears的表,其中包括财政年度的开始和结束日期,其结构如下

费伊德 FYear 起始日期 结束日期

示例数据:

FYId FYear StartDate EndDate
-----------------------------
 1   2010   10/1/2009 9/30/2010
 2   2011   10/1/2010 9/30/2011
因此,在我的“添加劳动”表格中,如果有人输入跨越两个会计年度的劳动,我需要输入两个劳动条目。这里有一个例子

如果用户选择人工开始日期=2009年6月30日 截止日期为2010年2月10日,它跨越两个财政年度

所以在我的劳动表中,我应该输入两件事

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

基本上,我需要在保存记录之前做一个检查,如果记录跨越会计年度,我需要添加两个记录,现在我只是盲目地在表单上保存记录(内置),但我想我需要添加一些VBA。我几乎从未使用过Access,所以这可能很简单(希望如此)。我想,我需要它来添加自定义VBA,而不是只调用Save Record的事件

假设您有一个用于添加日期的未绑定表单,您可以说:

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

假设您有一个用于添加日期的未绑定表单,您可以说:

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

你为什么需要一张桌子?如果组织的会计年度总是从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日,结束日期=2010年10月2日”跨越了两年。但是,此表达式返回2(3年):


你为什么需要一张桌子?如果组织的会计年度总是从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日,结束日期=2010年10月2日”跨越了两年。但是,此表达式返回2(3年):


我可以按照描述的方式来做,因为您可能希望将一部分费用分配给第一个财年,另一部分分配给第二个财年。当然,这可以在SQL中完成,但是使用表中的记录要容易得多。在我看来,他所做的更多的是一个“分配”表,也就是说,花一段时间劳动并创建记录,将成本分配分解到相关会计年度。这对于会计来说是非常重要的。@David我想知道我们是否在谈论两件不同的事情。我想说的一点是,他可以将一段劳动时间分割成单独的财政年度记录,而无需使用财政年度表。我可以看到这样做的方式,因为您可能希望将一部分费用分配给第一个财政年度,另一部分分配给第二个财政年度。当然,这可以在SQL中完成,但是使用表中的记录要容易得多。在我看来,他所做的更多的是一个“分配”表,也就是说,花一段时间劳动并创建记录,将成本分配分解到相关会计年度。这对于会计来说是非常重要的。@David我想知道我们是否在谈论两件不同的事情。我想说的一点是,他可以将一段时间的分娩分成单独的FY记录,而无需使用财政表。