【问题标题】:Check Microsoft Access Form Values before Save保存前检查 Microsoft Access 表单值
【发布时间】:2010-09-20 13:09:57
【问题描述】:

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

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

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

FyID 财政年度 开始日期 结束日期

示例数据:

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

因此,如果有人输入跨越两个会计年度的劳动,我需要在我的添加劳动表中输入两个劳动条目。这是一个例子

如果用户选择分娩开始日期 = 2009 年 6 月 30 日 结束日期 10/2/2010 ,跨越两个财政年度

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

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

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

【问题讨论】:

    标签: ms-access ms-access-2007 vba


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      为什么需要 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 日,结束日期 2010 年 10 月 2 日”跨越两年。但是,此表达式返回 2(3 年):

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

      【讨论】:

      • 我可以看到按照描述的方式进行操作,因为您可能希望将部分费用分配给第一个财政年度,并将部分费用分配给第二个财政年度。当然,这可以在 SQL 中完成,但是使用表中的记录来完成要容易得多。在我看来,他所做的更像是一个“分配”表,即花费一段时间的劳动并创建记录来分解成本到相关财政年度的分配。这对于会计目的通常非常重要。
      • @David 我想知道我们是否在谈论两件不同的事情。我试图说明的一点是,他可能能够在不使用 FiscalYears 表的情况下将一段劳动时间分成单独的 FY 记录。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      相关资源
      最近更新 更多