0

我有多个重叠计划的 Access 数据库表。我认为创建 Bu 面对一些重叠的现有时间范围对我来说很简单。如果用户批准了一名员工的日程安排。当用户去批准同一员工的下一个重叠时间的计划时。当用户批准重叠计划并从表中删除“已批准”文本时,我需要创建一条警报消息。关于 VB 代码的知识不多,或者我是否可以在查询中设置一些东西。任何帮助将不胜感激。

4

2 回答 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 回答