在 MS Access 中插入具有日期范围的多条记录

Insert multiple records with a date range in MS Access

希望有人能提供帮助?我是 Access 2016 的新手,我的任务是为我们学校的早餐和课后俱乐部构建一个非常简单的预订系统。 我有一个 table 列表 Children (主键是 ChildID),另一个 table (CLUBS) 列出了 5 个可用的俱乐部,第三个 table(预订)将 children 连接到俱乐部(ChildID、ClubID、DateRequested)

我有一个简单的表格,可以让我从下拉框中 select child 的名字,然后从列表中选择一个俱乐部,然后输入所需的日期。这会将记录保存到 Bookings table.

这很好用,但是为了使其更易于使用...我在表单中添加了未绑定的开始日期和结束日期字段,以便能够快速预订 child术语..即我不必单独添加每一天,而是输入 child 的名称,选择一个俱乐部,然后输入开始和结束日期。在预订 table 中使用 Child ID 创建了多个记录,俱乐部 ID 相同,但 DateRequested 字段不同。

我们确实需要在每个日期 child 的预订 table 中存储一条记录,这样我们就可以打印每一天的登记册……以及 invoicing/reporting .

从 VBA...我想我需要使用 INSERT INTO 命令?是最好的方法吗?我还需要确保 Sat/Sunday 范围内的日期被忽略。

我非常感谢任何关于此的指导以及关于哪些命令最有效的指示...

考虑填充一个单独的 DateRange table 来保存所有可能的日期,比如 2017 年的所有日期。您可以使用动态 SQL 查询 VBA 中的调用。而且只有这一次运行。

然后,创建一个交叉连接 ChildrenClubDateRange 的存储查询 通过表单参数过滤所有内容。此 returns 所有可能的日期范围重复相同 Child 和俱乐部 table 附加。

VBA

Public Sub PopulateTime()
    Dim i As Integer, StartDate As Date

    CurrentDb.Execute "CREATE TABLE DateRange (" _
                             & " [ID] AUTOINCREMENT PRIMARY KEY," _
                             & " [BookDate] DATETIME)", dbFailOnError

    StartDate = DateSerial(2017, 1, 1)
    For i = 0 To 364
          CurrentDb.Execute "INSERT INTO DateRange ([BookDate])" _
                 & " VALUES (#" & DateAdd("d", i, StartDate) & "#);", dbFailOnError
    Next i

End Sub

SQL

INSERT INTO Bookings (ChildID, ClubID, DateRequested)
SELECT c.ChildID, b.ClubID, d.BookDate
FROM Children c, Clubs b, DateRange d
WHERE c.ChildID = Forms!myformname!ChildID
  AND b.ClubID = Forms!myformname!ClubID
  AND d.BookDate BETWEEN Forms!myformname!StartDate 
                     AND Forms!myformname!EndDate

这就是 DAO 的闪光点。 运行 循环添加记录比多次调用 Insert Into 快得多。

方法如下:

Public Function PopulateBokings()

    Dim rsBookings  As DAO.Recordset
    Dim NextDate    As Date

    Set rsBookings = CurrentDb.OpenRecordset("Select Top 1 * From Bookings")

    NextDate = Me!StartDate.Value
    While DateDiff("d", NextDate, Me!EndDate.Value) >= 0
        If Weekday(NextDate, vbMonday) > 5 Then
            ' Skip Weekend.
        Else
            rsBookings.AddNew
                rsBookings!ChildrenId.Value = Me!ChildrenId.Value
                rsBookings!ClubsId.Value = Me!ClubId.Value
                rsBookings!DateRequested.Value = NextDate
            rsBookings.Update
        End If
        NextDate = DateAdd("d", 1, NextDate)
    Wend
    rsBookings.Close

    Set rsBookings = Nothing

End Function

将代码粘贴到窗体的代码模块中,将字段和控件名称调整为您的名称,并从按钮的 Click 事件中调用该函数。

您可以使用序列生成器查询将行重复插入到两个参数之间的 table 中。

对于这个例子,插入的最大天数是 999,但这可以很容易地增加到 9999 甚至更多。

灵感来自 this answer 古斯塔夫:

PARAMETERS [StartDate] DateTime, [EndDate] DateTime;
INSERT INTO MyTable(MyDateField)
SELECT DISTINCT [StartDate] - 1+ 100*Abs([Hundreds].[id] Mod 10) + 10*Abs([Tens].[id] Mod 10)+Abs([Ones].[id] Mod 10)+1
FROM MSysObjects As Ones, MSysObjects As Tens, MSysObjects As Hundreds
WHERE [StartDate] - 1+ 100*Abs([Hundreds].[id] Mod 10) + 10*Abs([Tens].[id] Mod 10)+Abs([Ones].[id] Mod 10)+1 Between [StartDate]-1 And [EndDate]

性能不会很好,但使用 non-VBA 解决方案有多个优点。