我有一个简单的表单,可以让我从下拉框中选择一个孩子的名字,然后从列表中选择一个俱乐部,然后输入所需的日期。这会将记录保存到预订表。
这样可以正常使用,但是为了更容易使用...我在表单中添加了未绑定的“开始日期”和“结束日期”字段,以便能够在一个词内快速预订一个孩子。我不是必须单独添加每一天,而是输入孩子的名字,选择一个俱乐部,然后输入开始和结束日期。在预订表中创建了多个记录,其中子ID,俱乐部ID相同,但DateRequested字段有所不同。
我们确实需要在每个日期为孩子在Bookings表中存储记录,这样我们就可以打印每天的注册表以及发票/报告。
从VBA看......我想我需要使用INSERT INTO命令?这是最好的方法吗?此外,我需要确保忽略星期六/星期日范围内的日期。
我真的很感激任何指导,并指出哪些命令最有效......
答案 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解决方案有很多优势。