2016-07-21 53 views
0

我爲700名現有顧問構建了一個數據庫。MS Access 2010員工可用性

我在一個有5個字段的表格中記錄了他們的可用性,或者更準確地說他們缺乏。

主鍵,ConsultantID,BusyStart,BusyEnd,BusyType。

我的主窗體選擇ConsultantID,並有一個EventDate的文本框。

EVENTDATE工作方式使用

= IIF([EVENTDATE]之間[TrainerBusy子窗體] [表]![BusyStart]和[TrainerBusy子窗體] [表]![BusyEnd], 「是」,」否「)

但它只適用於子窗體中顯示的第一條記錄。

我已經做了幾次嘗試使用vba來瀏覽子表單中的所有記錄,並且我認爲我需要For Each通過記錄工作,對每個「yes」的變量+1,然後如果該變量> 0,則給出最終的「是」或「否」。

我完全是在這裏的一個兔子洞或者這是正確的想法?

回答

0

EventDate只是一個日期嗎?我假設你有一個事件開始和一個事件結束,你想確保沒有重疊。如果你的情況不同,你必須調整代碼來解決這個問題。

而不是嘗試讀取子窗體,讀取提供子窗體的數據。

我的表單有一個用於ConsultantID的組合框,一個用於EventStart的文本框,一個用於EventEnd的文本框,最後還有一個用於顯示該顧問的事件是否可用的文本框。

我使用EventStart和EventEnd文本框的更改事件來調用更新「狀態」文本框的另一個過程。

Private Sub tbxEventEnd_AfterUpdate() 

    If IsDate(Me.tbxEventStart.Value) And IsDate(Me.tbxEventEnd.Value) Then 
     PopulateIsOK 
    End If 

End Sub 

Private Sub tbxEventStart_AfterUpdate() 

    If IsDate(Me.tbxEventStart.Value) And IsDate(Me.tbxEventEnd.Value) Then 
     PopulateIsOK 
    End If 

End Sub 

Private Sub PopulateIsOK() 

    Dim rs As ADODB.Recordset 
    Dim cn As ADODB.Connection 
    Dim aSql(1 To 5) As String 

    aSql(1) = "SELECT SUM(SWITCH ((BusyStart < #" & Me.tbxEventStart.Value & "# AND Busyend < #" & Me.tbxEventStart.Value & "#)" 
    aSql(2) = "OR (BusyStart >= #" & Me.tbxEventStart.Value & "# AND BusyStart > #" & Me.tbxEventEnd.Value & "#) , 0, True, 1" 
    aSql(3) = ")) As StartCheck" 
    aSql(4) = "FROM tblBusy WHERE ConsultantID = " & Me.cbxConsultantID.Value 

    Set cn = CurrentProject.Connection 
    Set rs = cn.Execute(Join(aSql, Space(1))) 

    If rs.Fields(0).Value = 0 Then 
     Me.tbxIsEventOK.Value = "Yes" 
    Else 
     Me.tbxIsEventOK.Value = "No" 
    End If 

End Sub 

記錄集將結果相加 - 如果沒有衝突,則爲0,如果存在衝突,則爲1。如果總和爲零,則沒有記錄發生衝突,並且寫入文本框。

例如,您需要更多的錯誤檢查以確保選擇了一個ConsultantID。