2017-01-23 27 views
0

誰かが助けることを望んでいますか?私はAccess 2016をかなり新しくしており、学校の朝食と放課後クラブのための非常に簡単な予約システムを構築する任務があります。 私は子供のリストを持つテーブルを持っています(主キーはChildIDです)、別のテーブル(CLUBS)は利用可能な5つのクラブをリストし、3番目のテーブル(BOOKINGS)は子供をクラブに接続します(ChildID、ClubID、DateRequested)MS Accessで日付範囲の複数のレコードを挿入

私はドロップダウンボックスから子供の名前を選択し、リストからクラブを選択して必要な日付を入力する簡単なフォームを持っています。これにより、レコードが[予約]テーブルに保存されます。

これはうまくいきますが、使いやすくするために...私は、期間内に子供を素早く予約できるように、フォームにアンバインドされた開始日と終了日のフィールドを追加しました。毎日個別に追加するのではなく、私は子供の名前を入力し、クラブを選択して開始日と終了日を入力します。複数のレコードが予約テーブルに作成され、Child ID、Club IDは同一ですが、DateRequestedフィールドは異なります。

毎日の登録を印刷できるように、各日付の子供用の予約テーブルにレコードを保存する必要があります。また、請求書作成/レポート作成のためだけでなく、

VBAを見てから...私はINSERT INTOコマンドを使用する必要があると思いますか?それを行う最善の方法はありますか?また、土曜日/日曜日の範囲内の日付が無視されるようにする必要があります。

私はこれと最高の仕事とコマンドへのポインタ上の任意の指導を本当に感謝...

+0

'Insert'では大きなSQL文字列を作成して一度に実行する必要があります。 'Recordset.Addnew'は別のオプションですが、前者が好ましいです。どちらの場合でもVBAループが必要です。 *ストアドプロシージャ*(MS-Accessのクエリ)を作成することを検討してください。あなたは 'ChildId'と' TermId'だけをフィードする必要があり、サーバ上でジョブを実行します。 IMOこれが最良の選択肢です。 –

答えて

0

DAOが輝く場所です。挿入を複数回呼び出すよりも、レコードを追加するループを実行するほうがはるかに高速です。

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

多くのありがとうGustav ....それは初めて働いた!残っている唯一の問題は、土曜日/日曜日に到着する非稼働日を止める方法です。日付範囲が14日の場合は、10レコードを追加する必要があります。 –

+0

曜日をチェックしてください。編集を参照してください。 – Gustav

+0

偉大な - 私は働いている - 多くの感謝 –

0

は、あなたが構築することができます2017年のすべてのように、すべての可能な日付を保持している別ののDateRangeテーブルを取り込む考えてみましょうこのようなテーブルは、VBAで動的SQLクエリ呼び出しを繰り返し実行します。これを一度だけ実行してください。その後

子供に参加する横断保存されたクエリを作成し、クラブ、およびフォームパラメータによって、すべてのためのフィルターとのDateRange。これは、テーブルappendのために同じ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 
関連する問題