我为700名现有顾问建立了一个数据库。
我在5个字段的表格中记录了他们的可用性,或者更准确地记录了他们的可用性。
主键,ConsultantID,BusyStart,BusyEnd,BusyType。
我的主窗体选择ConsultantID,并有一个EventDate的文本框。
EventDate使用
= IIf([EventDate]之间[TrainerBusy子表格]。[表格]![BusyStart]和[TrainerBusy子表格]。[表格]![忙碌],“是”,“否”)
但它仅适用于子表单中显示的第一条记录。
我已经尝试过使用vba来浏览子表单中的所有记录,我认为我需要For Each来处理记录,每个“是”的变量+1,然后给出如果该变量> 0,则为“是”或“否”。
我在这里完全是一个兔子洞,还是这个正确的想法?
答案 0 :(得分:0)
EventDate只是一个日期吗?我假设你有一个事件开始和一个事件结束,你想确保没有重叠。如果您的情况不同,您必须调整代码以解决此问题。
不要尝试读取子表单,而是读取提供子表单的数据。
我的表单有一个ConsultantID组合框,一个EventStart文本框,一个EventEnd文本框,最后一个文本框,显示该顾问的事件是否正常。
我使用EventStart和EventEnd文本框的更改事件来调用另一个更新" status"文本框。
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
记录集对结果求和 - 如果没有冲突则为零,如果存在冲突则为1。如果总和为零,则没有任何记录冲突,并且Yes被写入文本框。
例如,您需要进行更多错误检查,以确保选择了ConsultantID。