2017-01-23 2 views
0

В надежде, кто-то может помочь? Я довольно новичок в Access 2016, и мне было поручено создать очень простую систему бронирования для завтрака нашей школы и после школьных клубов. У меня есть таблица со списком детей (первичный ключ - ChildID), другая таблица (CLUBS) перечисляет 5 доступных клубов, а третий стол (BOOKINGS) соединяет детей с клубами (ChildID, ClubID, DateRequested)Вставить несколько записей с диапазоном дат в MS Access

У меня есть простая форма, которая позволяет мне выбрать имя ребенка из раскрывающегося списка, затем из списка выберите клуб, затем введите нужную дату. Это сохраняет запись в таблице «Заказы».

Это прекрасно работает, однако, чтобы упростить его использование ... Я добавил поля формы «Начало» и «Конечная дата» в форме, чтобы иметь возможность быстро забронировать ребенка за срок. вместо того, чтобы добавлять каждый день индивидуально, я ввожу имя ребенка, выбираю клуб, а затем вводим даты начала и окончания. В таблице бронирования создается несколько записей с идентификатором ребенка, идентификатором клуба идентичным, но поле DateRequested меняется.

Нам нужно сохранить запись в таблице «Бронирование» для ребенка на каждую дату, чтобы мы могли распечатать регистр на каждый день ... так же, как для выставления счетов/отчетности.

От взгляда на VBA ... Думаю, мне нужно использовать команду INSERT INTO? Это лучший способ сделать это? Также мне нужно убедиться, что даты в диапазоне, которые являются Sat/Sunday, игнорируются.

Я бы очень признателен за любые рекомендации по этому вопросу и указатели на команды, которые будут работать лучше ...

+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 

Вставьте код в коде модуль формы, настроить имена полей и управления для тех, кто из ваших, и вызовите функцию от замкового события кнопки.

+0

Большое спасибо Густав .... это сработало в первый раз!Единственная оставшаяся проблема заключается в том, как остановить нерабочие дни (суббота/воскресенье) ... поэтому, если диапазон дат составляет 14 дней - нужно добавить только 10 записей .... –

+0

Просто проверьте день недели. См. Править. – Gustav

+0

Отличный - у меня это работает - много спасибо –

0

Рассмотрим заполнение таблицу отдельный DateRange, который содержит все возможные даты, как и все 2017. Вы можете построить такая таблица итеративно с динамическими вызовами SQL-запросов в VBA. И запустите это только один раз.

Затем создайте хранимый запрос, который присоединяется к переправиться Детей, клуба и 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 
Смежные вопросы