2017-01-23 103 views
0

希望有人能幫忙嗎?我對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',它就可以在服務器上完成這項工作。海事組織這是最好的選擇。 –

回答

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事件中調用該函數。

+0

非常感謝古斯塔夫......它第一次工作!唯一剩下的問題是如何停止非星期六(星期六/星期日)的工作日...所以如果日期範圍是14天 - 只應添加10條記錄.... –

+0

只需檢查工作日。請參閱編輯。 – Gustav

+0

太好了 - 我有這個工作 - 非常感謝 –

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