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

时间:2017-01-23 23:25:45

标签: vba ms-access date-range ms-access-2016 multiple-records

希望有人能帮忙吗?我是Access 2016的新手,我们的任务是为学校的早餐和课后俱乐部建立一个非常简单的预订系统。 我有一个包含Child列表的表(主键是ChildID),另一个表(CLUBS)列出了5个可用的俱乐部,第三个表(BOOKINGS)将孩子连接到俱乐部(ChildID,ClubID,DateRequested)

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

这样可以正常使用,但是为了更容易使用...我在表单中添加了未绑定的“开始日期”和“结束日期”字段,以便能够在一个词内快速预订一个孩子。我不是必须单独添加每一天,而是输入孩子的名字,选择一个俱乐部,然后输入开始和结束日期。在预订表中创建了多个记录,其中子ID,俱乐部ID相同,但DateRequested字段有所不同。

我们确实需要在每个日期为孩子在Bookings表中存储记录,这样我们就可以打印每天的注册表以及发票/报告。

从VBA看......我想我需要使用INSERT INTO命令?这是最好的方法吗?此外,我需要确保忽略星期六/星期日范围内的日期。

我真的很感激任何指导,并指出哪些命令最有效......

3 个答案:

答案 0 :(得分:0)

考虑填充一个单独的 DateRange 表,其中包含所有可能的日期,例如2017年全年。您可以使用VBA中的动态SQL查询调用迭代地构建此类表。只运行一次。

然后,使用表单参数的所有过滤器创建一个存储的查询,该查询交叉连接 Children Club DateRange 。这将返回所有可能的日期范围,重复相同的Child和Club for table append。

<强> 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

答案 1 :(得分:0)

这是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事件中调用该函数。

答案 2 :(得分:0)

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

对于此示例,插入的最大天数为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]

性能不会很好,但使用非VBA解决方案有很多优势。