【问题标题】:How to check existing data before inserting new data to the access table?如何在将新数据插入访问表之前检查现有数据?
【发布时间】:2021-04-05 15:21:58
【问题描述】:

我有一个轿车访问数据库。在那个数据库中,我有 3 个表,分别称为“Employees”、“Services”、“Reservations”。

员工表

Employee_Name |   age   |   tel
    John          28      12456325
    Bob           32      56458756

服务表

Service_Name    |     HourlyPrice
head massage            50USD
foot massage            30USD
body massage            70USD

预订表

Reservation_ID  |  Employee_Name | Service_Name | Service_Hours |     Date     |  Start_Time
      1                 John       head massage      2 hours      31/12/2020        14:00
      2                 Bob        foot massage      1 hour       31/12/2020        20:00

这些是我的数据库表。如果客户想进行预订,他/她可以致电沙龙并为他们的空闲时间进行预订。

例如,如果客户希望 John 进行头部按摩,那么他/她可以致电轿车,他/她会告知日期、服务时间和开始时间。然后轿车接待员将预订数据添加到预订表中。

因此系统需要在添加新的预订数据和现有数据之前进行检查。

示例:John 将在 2020 年 12 月 31 日的 14:00 至 16:00 之前有空,因为他有 2 小时的预订时间。因此,系统将阻止在 2020 年 12 月 31 日 14:00 至 16:00 之间为 John 添加新预订。

例如,如果另一位客户希望 John 在 2020 年 12 月 31 日 15:00 进行头部按摩。然后系统将取消该预订。因为那时约翰会为另一位顾客做头部按摩。

这是我的 vba 代码

Private Sub check_Click()

If (DCount("Employee_Name", "Reservations", "Employee_Name=""" & [Text1].Value & """ AND [Date]=#" & [Text2].Value & "#") <> 0) Then
      MsgBox "There is a reservation for the employee in this date. Please check the time with that reservation."

Else
    MsgBox "No reservations booked in this day."
    
End If
End Sub 

从上面的代码中,我可以仅使用新记录检查员工姓名和日期。但我想查看员工姓名、日期、开始时间和服务时间。

我希望你能理解我的情况。请帮帮我。

感谢和问候,Zajjith

【问题讨论】:

    标签: vba ms-access


    【解决方案1】:

    不清楚您是只预订一天/日期,还是预订日期+特定人?

    以太方式,逻辑简单。

    任何类型的预订冲突都会通过以下简单公式发生:

    在以下情况下发生碰撞:

    RequestStartDate <= EndDate 
    and 
    RequestEndDate >= StartDate 
    

    因此上面是一个相当简单的查询,但是如果发生任何冲突, 以上将返回记录,您根本不允许预订。其他 换句话说,既然我们绝不允许发生碰撞预订,那么上面的内容很简单 声明对我们有用。

    上面将捕获跨越开始/结束的尝试。或落在里面的跨度。事实上,上面的测试也会捕捉到与开始或结束的任何重叠,或者它们的任何组合!!

    那么,有一些代码可以检查预订空档吗?

    好吧,我们假设我们在这里使用日期时间数据类型。 (因此,我们将日期和时间列为“一种类型”的列。这使事情变得非常容易 - 事实上,如果我们愿意的话,可以允许预订跨越午夜 - 或者说跨越多天。我们可能会预订一个啤酒桶,一个房间,或者几天的电钻。

    dim strWhere                        as string 
    dim dtRequeestStartDate      as date 
    dim dtRequestEndDate         as date 
    
    
    dtRequestStartDate = inputbox("Enter start Date") 
    dtRequestEndDate = inputbox("Enter end date") 
    
    
    strWhere="#" & format(dtRequestStartDate,"mm/­dd/yyyy") & "# <= EndDate" & _ 
        " and #" & format(dtRequestEndDate,"mm/dd­/yyyy") & "#  >= StartDate" 
    

    现在到上面,会/可以添加一个房间号,或者一个人(比如医生)或其他什么。

    当然,当我使用输入框时,您通常会在表单上放置一些文本框供用户输入。 (也许是一个很酷的组合框来选择员工)

    在上面我使用了日期 - 但我们应该在该查询中包含日期 + 时间。因此,格式应该(可以)从 mm/dd/yyyy 更改为

    ? FORMAT(NOW,"MM\/DD\/YYYY HH:MM")
    12/28/2020 18:02
    

    当然,在上面的 where 子句中,我们会包括那个房间号、那个电动工具号,或者说你想预订的员工。

    strWhere = strWhere & " And EmployeeName = 'John'
    

    如前所述,尚不清楚是否所有员工都可以提供所有服务。但是,如果 John 在该日期范围内被预订 - 那么您会取回记录 - 因此您无法进行该预订。

    所以现在输入日期要求用户还包括时间。

    因此,有了上面的 where 子句,我们就可以去:

    if dcount("*","Reservations",strW­here) > 0 then 
        msgbox "sorry, you cant book 
        ...bla bla bla.... 
    

    【讨论】:

    • 非常感谢您的努力。一些额外的信息。在这里,员工可以提供许多服务。我需要检查员工姓名、日期、开始时间、结束时间(开始时间+服务时间)。因此,同一员工不能在现有预订的开始时间和结束时间内预订同一天。我希望你能理解我。
    • 那么只需要检查每个人就可以了。如果他们按上述方式预订,那么他们将无法处理其他任何事情。所以你按日期/时间和人预订。当然,活动扳手将是某些员工只提供某些服务。但话又说回来,这只是您在选择员工的表格上放置的下拉列表的一部分。如果员工提供某些服务,则只需在下拉列表中为他们提供的每项服务显示同一员工。如果他们提供 2 或 10 种不同的,那真的没关系,因为如果预订的员工不可用。
    • 先生,您可以将所有代码合二为一吗?请先生,我试过有错误。请将所有代码合二为一。
    猜你喜欢
    • 2012-01-23
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多