我有多个重叠计划的 Access 数据库表。我认为创建 Bu 面对一些重叠的现有时间范围对我来说很简单。如果用户批准了一名员工的日程安排。当用户去批准同一员工的下一个重叠时间的计划时。当用户批准重叠计划并从表中删除“已批准”文本时,我需要创建一条警报消息。关于 VB 代码的知识不多,或者我是否可以在查询中设置一些东西。任何帮助将不胜感激。
问问题
1159 次
2 回答
0
好的,我有一个包含 3 个字段的表:EmpID、StartTime 和 EndTime。开始和结束时间有日期和时间。
然后我有一个具有相同 3 个字段的表单。
在 VBA 代码中,在 Before_Update 事件下,我检查是否存在冲突,如果是,我将 Cancel 属性设置为 true 并显示一条消息。这是代码:
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim RS As Recordset
Dim strSQL As String
Dim EmpID As Long
Dim ScheduleStart As String
Dim ScheduleEnd As String
EmpID = Me.txtEmpID
ScheduleStart = Me.txtStartTime
ScheduleEnd = Me.txtEndTime
strSQL = ""
strSQL = strSQL & "SELECT Count(schedule.EmpID) AS Conflict " & vbCrLf
strSQL = strSQL & "FROM schedule " & vbCrLf
strSQL = strSQL & "WHERE ( ( ( Schedule.EmpID ) = @EmpID ) " & vbCrLf
strSQL = strSQL & " AND ( ( #@ScheduleStart# ) <= [StartTime] ) " & vbCrLf
strSQL = strSQL & " AND ( ( #@ScheduleEnd# ) > [StartTime] ) ) " & vbCrLf
strSQL = strSQL & " OR ( ( ( Schedule.EmpID ) = @EmpID ) " & vbCrLf
strSQL = strSQL & " AND ( ( #@ScheduleStart# ) <= [EndTime] ) " & vbCrLf
strSQL = strSQL & " AND ( ( #@ScheduleEnd# ) > [EndTime] ) )"
strSQL = Replace(strSQL, "@EmpID", EmpID)
strSQL = Replace(strSQL, "@ScheduleStart", ScheduleStart)
strSQL = Replace(strSQL, "@ScheduleEnd", ScheduleEnd)
Debug.Print strSQL
Set RS = CurrentDb.OpenRecordset(strSQL)
If RS("Conflict") > 0 Then
Cancel = True
MsgBox "Conflict Detected", vbExclamation, "Conflict Detected"
End If
End Sub
这将查找 2 个场景,均使用 EmpID。
- 如果ScheduleStart < StartTime AND ScheduleEnd > StartTime
- 或ScheduleStart < EndTime AND ScheduleEnd > EndTime
大部分代码都在构建 SQL。如果使用参数查询会更整洁,但我这样做是因为我认为它更清晰。
Debug.Print strSQL 将向您显示您的建筑物的查询是什么样的。
这没有错误检查,所以你必须输入一些。现在,当你输入日期时,它必须看起来像:6/26/13 4:31 pm
于 2013-06-23T23:32:38.530 回答
-1
我创建了一组样本数据和一个如下所示的表单:
我将这段代码添加到冲突按钮中,以查看您的 StartTime 和 StartDate 是否介于任何其他记录的 StartTime/StartDate 和 EndTime/EndDate 之间。您需要稍微修改一下代码,以检查 EndTime 和 EndDate 是否也不会介于两者之间。
Private Sub Test_Button_Click()
Dim myR As Recordset
Dim strSQL As String
strSQL = "Select * From Sample Where " & _
"StartDate <= #" & Me.StartDate & "# " & _
"And StartTime <= #" & Me.StartTime & "# " & _
"And EndDate >= #" & Me.StartDate & "# " & _
"And EndTime >= #" & Me.StartTime & "#"
Debug.Print strSQL
Set myR = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
If myR.RecordCount = 0 Then
Debug.Print "There are no conflicts"
End If
Set myR = Nothing
End Sub
于 2013-06-23T12:02:24.550 回答