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

问题描述:

希望有人能帮忙吗?我对Access 2016相当陌生,并且负责为我们学校的早餐和课后俱乐部建立一个非常简单的预订系统。 我有一张儿童列表(主键是ChildID),另一个表(CLUBS)列出了5个可用的俱乐部,第三个表(BOOKINGS)将儿童连接到俱乐部(ChildID,ClubID,DateRequested)在MS Access中插入多个日期范围的记录

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

这工作正常,但为了使它更容易使用...我已经在表单中添加了未绑定的开始日期和结束日期字段,以便能够快速预订一个学期的儿童..i.e。而不必单独添加每一天,我输入孩子的名字,选择一个俱乐部,然后输入开始和结束日期。预订表中创建了多个记录,其中的儿童ID,俱乐部ID完全相同,但DateRequested字段有所不同。

我们确实需要在每个日期的孩子的预订表中存储一条记录,以便我们可以打印每一天的注册表以及发票/报告。

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

我很欣赏这个和指针的任何指导该命令可以正常使用最好...

+0

使用'Insert',您需要编写一个大的SQL字符串并立即执行它。 'Recordset.Addnew'是另一种选择,但前者是可取的。在这两种情况下你都需要一个VBA循环。考虑创建一个*存储过程*(MS-Access中的查询),你只需要给它一个'ChildId'和一个'TermId',它就可以在服务器上完成这项工作。海事组织这是最好的选择。 –

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

+0

非常感谢古斯塔夫......它第一次工作!唯一剩下的问题是如何停止非星期六(星期六/星期日)的工作日...所以如果日期范围是14天 - 只应添加10条记录.... –

+0

只需检查工作日。请参阅编辑。 – Gustav

+0

太好了 - 我有这个工作 - 非常感谢 –

考虑填充一个单独的DATERANGE表包含所有可能的日期,像所有的2017年,您可以建立这种表格迭代地在VBA中使用动态SQL查询调用。只运行一次。

然后,创建交叉连接儿童一个存储查询,俱乐部DATERANGE带过滤器的所有形式参数。这将返回所有可能的日期范围,重复相同的Child和Club来添加表格。

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