【问题标题】:How to check time range while adding a new record in a table?在表中添加新记录时如何检查时间范围?
【发布时间】:2021-04-05 20:02:38
【问题描述】:

我有一个名为“Reservations”的 Access 表和一个名为“Reservations Form”的 Access 表单。

预订桌

Employee_Name Service_Name Service Hours Start_DateTime End_DateTime
John Head Massage 2 hours 31-Dec-20 3:00:00 PM 31-Dec-20 5:00:00 PM
Bob Foot Massage 1 hour 31-Dec-20 3:00:00 PM 31-Dec-20 4:00:00 PM

表单结构

Employee_Name : (Input Field)
Service_Name : (Input Field)
Service_Hours : (Input Field)
Start_DateTime : (Input Date Time Field)
End_DateTime : (Input Date Time Field)

表格中的样本数据

Employee_Name : John
Service_Name : Head Massage
Service_Hours : 2 Hours
Start_DateTime : 31-Dec-20 4:00:00 PM
End_DateTime : 31-Dec-20 5:00:00 PM

我们不能接受同一员工在同一天同一时间的两次预订。
从 20 年 12 月 31 日下午 3:00:00 到 12 月 20 日 31 日下午 5:00:00 为约翰预订。
在此期间不接受其他预订。

如果通过预订表格提交了新的预订,我们需要检查日期和时间以及员工姓名。
约翰已在 20 年 12 月 31 日下午 3:00:00 至 12 月 20 日 5:00:00 下午预订。
他无法进行新预订(从 31-Dec-20 下午 4:00:00 到 31-Dec-20 5:00:00 PM)。

VBA 代码

Private Sub Command11_Click()
    Dim strWhere                 As String
    Dim dtRequeestStartDate      As Date
    Dim dtRequestEndDate         As Date
    
    dtRequestStartDate = Me![Text1].Value
    dtRequestEndDate = Me![Text2].Value
        
    If (DCount("Employee_Name", "Reservations", "Employee_Name=""" & [Employee_Name].Value & """ AND #" & Format(dtRequestStartDate, "dd/mm/yyyy hh:mm:ss AM/PM") & "# <= EndDate" & " and #" & Format(dtRequestEndDate, "dd/mm/yyyy hh:mm:ss AM/PM") & "#  >= StartDate") <> 0) Then
      MsgBox "Can't book a reservation."
    End If

我收到一个错误

作为查询参数输入的表达式产生了这个错误:'EndDate'

【问题讨论】:

  • 完整的错误信息是什么?它出现在哪一行?您是否检查过所有数据类型都符合预期?
  • 我想用员工姓名检查日期和时间。如果我添加此代码(strWhere = strWhere & " And dtEmployee_Name = 'John'"),那么它将给出此行的错误(If (DCount("*", "Reservations", strWhere) 0) Then) .
  • 是的,先生。那是错误
  • 我编辑了问题中的代码。请检查并帮助我。
  • 您似乎没有EndDate 字段。 (StartDate 都不是,但解析器在第一个错误处停止。)我建议首先组装一个语法上可行的查询,例如Dim s As String : s = "Employee_Name", "Reservations", ... ,并在此处设置断点以检查 s 是否完美。您甚至可以在即时窗口中发出该命令以查看它是否有效。

标签: vba ms-access


【解决方案1】:

条件中使用的日期字段的字段名称与表中显示的字段名称不同。

可能希望首先验证请求的日期是未来日期,而不是上个月或去年的拼写错误。可以使用文本框的ValidationRule属性:&gt;=Now()

现在,开始日期和结束日期都必须在请求被拒绝的范围内。可能应该检查开始或结束日期是否在已保留的范围之间。换句话说,检查重叠范围。

AND (#" & Format(dtRequestStartDate, "dd/mm/yyyy hh:mm:ss AM/PM") & "# BETWEEN Start_DateTime AND End_DateTime OR #" & _
Format(dtRequestEndDate, "dd/mm/yyyy hh:mm:ss AM/PM") & "# BETWEEN Start_DateTime AND End_DateTime)"

【讨论】:

    【解决方案2】:

    好的,开始看起来不错了。

    你拥有的“strWhere”的想法(我看到你没有使用它)只是为了帮助编写代码(我想在需要填充墙的房间里节省一些时间)。

    你怎么吃大象? 答:一次一口。

    因此,这里的想法是将其分解成越来越小的部分 - 小到可以在公园里散步。

    因此,我们首先需要(并且想要)设置日期/范围测试/标准。

    所以,这应该可以解决问题:

    Dim strWhere                 As String
    Dim dtRequeestStartDate      As Date
    Dim dtRequestEndDate         As Date
    
    dtRequestStartDate = Me![Text1].Value
    dtRequestEndDate = Me![Text2].Value
    
    ftime = "mm/dd/yyyy HH:MM"
    
    
    strWhere = "#" & Format(dtRequestStartDate, ftime) & "# <= End_DateTime" & _
        " and #" & Format(dtRequestEndDate, ftime) & "#  >= Start_DateTime"
    

    所以,这会处理我们的日期范围。但我们还需要在上面添加人员。

    所以,我们只需将其添加到上面。

    strWhere = strWhere & " AND "Employee_Name = '" & [Employee_Name].Value & "'"
    

    那么,看看为什么我们有 strWhere。我们不必这样做,但现在我们可以将其分解,并在 where 子句中添加一个甚至 5 个以上的条件。 那么,既然我们有了日期范围和工作人员的 strWhere 呢?

    然后我们可以使用 dcount()

    dcount() 是

    dcount("some field name", "some table name", "some where clause")
    

    这就是 dcount() 的语法。事实上,dlookup() 和 dcount() 大体相同。唯一真正的区别是 lookup() 返回一个值,而 dcount() 返回一个计数。

    在这种情况下,我们只关心请求的计数是 1 还是 20 或其他(任何大于 0 的都是冲突)。

    那么,现在我们将条件加载到 where 子句中了吗?

    然后我们可以像这样使用 dcount():

    If DCount("*", "Reservations", strWhere) > 0 then
      MsgBox "Can't book a reservation."
    
    End If
    

    因此您可以看到为什么建议将条件加载到 strWhere 中。它只是允许更轻松地阅读代码。请注意,我使用“*”作为 dcount() 中的第一个值。您可以输入“id”或您想要的任何列 - 但我们真的不在乎,因为我们只是在计算行数 - 我们只关心我们的结果是否 > 0。

    所以,总而言之,我们有很多这样的代码:

    Dim strWhere                 As String
    Dim dtRequeestStartDate      As Date
    Dim dtRequestEndDate         As Date
    Dim ftime                    As String
    
    ftime = "mm/dd/yyyy HH:MM"
    
    dtRequestStartDate = Me![Text1].Value
    dtRequestEndDate = Me![Text2].Value
    
    ' date range critera
    strWhere = "#" & Format(dtRequestStartDate, ftime) & "# <= End_DateTime" & _
        " and #" & Format(dtRequestEndDate, ftime) & "#  >= Start_DateTime"
    
    ' employee criteria
    strWhere = strWhere & " AND Employee_Name = '" & [Employee_Name].Value & "'"
    
    ' doctors exam room criteria
    ' ok - we don't' have  any!!!, but we can add many more criteria.
    
    ' now data pull - check for existing - 
    
    If DCount("*", "Reservations", strWhere) > 0 then
        MsgBox "Can't book a reservation."
    else
       ' ok to book - call routines to add this record to reservations
    End If
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-01
      • 2017-10-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多