我有一个访问表单 - 我们称之为“添加人工”(Access 2007),将数据保存到表中。
该表有两列,特别称为“开始日期”和“结束日期”(此表存储任务)
还有另一个名为FiscalYears的表,其中包括财政年度的开始和结束日期,其结构如下
FyID FYear 开始日期 结束日期
示例数据:
FYId FYear StartDate EndDate
-----------------------------
1 2010 10/1/2009 9/30/2010
2 2011 10/1/2010 9/30/2011
因此,如果某人进入跨越两个会计年度的人工,我需要输入两个人工条目。这是一个例子
如果用户选择人工开始日期= 6/30/2009 截止日期为2010年10月2日,它跨越两个财政年度
所以在我的人工表中我应该输入两件事
LaborID StartDate EndDate
-----------------------------
1 6/30/2009 9/30/2010
2 10/1/2010 10/2/2010
基本上我需要在保存记录之前进行检查并添加两条记录,如果它们跨越财政年度,现在我只是盲目地在表单上保存记录(内置),但我想我需要添加一些VBA。我几乎没有使用Access,所以这可能很简单(希望如此)。我正在考虑而不是只调用Save Record的事件,我需要它来添加自定义VBA。
答案 0 :(得分: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 :(得分: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#)