Использование предыдущей записи для расчета MS Access VBA - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно убедиться, что мои пользователи не вводят больше времени простоя, чем доступно.Для этого я вычислил время, которое у них есть, и сделал в форме столбец промежуточных итоговых значений, показывающий их текущие минуты простоя (они вводят одну причину простоя и «минуты вниз» за раз).

СейчасЯ пытаюсь написать код VBA, который сравнивает доступное время с текущим общим временем простоя.Работает кроме первой записи.Если пользователь вводит число, превышающее доступное время при первой записи, это разрешается.Я думал, что это потому, что я использовал «после обновления», но я пробовал другие события, и это не изменило результат.

Вот мой текущий код VBA:

Private Sub Form_AfterUpdate()
    If Me.RunTime.Value < Me.DTSum Then
        MsgBox ("You have too much downtime")
        DoCmd.RunCommand acCmdDeleteRecord
        DoCmd.RunCommand acCmdRecordsGoToPrevious 
    Else
        MsgBox ("Okay")
    End If
End Sub

1 Ответ

0 голосов
/ 15 мая 2018

Подумайте об использовании триггерного события BeforeUpdate (обычно это событие для проверки данных), когда вы предупреждаете пользователя после ввода и перед сохранением, а затем соответственно отменяете событие. А для новых событий используйте BeforeInsert событие триггера.

При таком подходе вы избегаете действий по удалению и занимаете активную позицию вместо реактивной.

Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Me.RunTime.Value < Me.DTSum Then
        MsgBox ("You have too much downtime")
        Cancel = True
        Me!RunTime.Undo
    Else
        MsgBox ("Okay")
    End If
End Sub

Private Sub Form_BeforeInsert(Cancel As Integer)
    If Me.RunTime.Value < Me.DTSum Then
        MsgBox ("You have too much downtime")
        Cancel = True
        Me!RunTime.Undo
    Else
        MsgBox ("Okay")
    End If
End Sub

Или используйте функцию для решения DRY-er:

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Cancel = CheckRunTime
    Me!RunTime.Undo
End Sub

Private Sub Form_BeforeInsert(Cancel As Integer)
    Cancel = CheckRunTime
    Me!RunTime.Undo
End Sub

Function CheckRunTime As Integer
    Dim Cancel As Integer

    If Me.RunTime.Value < Me.DTSum Then
        MsgBox ("You have too much downtime")
        Cancel = True
    Else
        MsgBox ("Okay")
        Cancel = False
    End If

    CheckRunTime = Cancel
End Sub
...