Есть ли событие для изменения значения элемента управления в MS Access перед отправкой его на проверку в таблице

#ms-access #vba

#ms-access #vba

Вопрос:

У меня есть поле даты с соответствующим столбцом datetime, и я хочу иметь возможность вводить строку относительной даты, скажем, «m 1», чтобы ввести дату ровно через месяц с сегодняшнего дня. Есть ли событие для подключения, к которому я могу написать код VBA, который интерпретирует это и изменит значение поля на фактическую дату, которую поймет проверка, прежде чем оно будет отправлено на проверку?

Кажется, я не могу найти такое событие, даже BeforeUpdate срабатывает слишком поздно. Я получаю "The value you entered isn't valid for this field." сообщение об ошибке перед BeforeUpdate срабатыванием.

Комментарии:

1. У вас есть текстовое поле, привязанное к полю даты / времени? Вы хотите, чтобы это поле в новой записи имело значение по умолчанию Сегодня 1 месяц? Используйте свойство defaultValue с вычислением с использованием функции DateAdd(). Заблокируйте текстовое поле, чтобы пользователи не могли редактировать.

2. Есть Change где вы могли бы отслеживать myTextbox.Text специальный синтаксис и редактировать текст, если он соответствует. Хотя это был бы странный пользовательский интерфейс.

Ответ №1:

Вы можете использовать событие нажатия клавиши элемента управления. И отключиться (чтобы отключить нажатие клавиши из системы управления доступом, НЕ видящей клавишу, затем установите keycode = 0.

Таким образом, эта процедура позволит пользователю нажать Y или y = добавить или вычесть год D или d = добавить или вычесть день M или m — добавить или вычесть месяц.

Обратите внимание, что вы должны использовать клавишу shift — caps lock игнорируется.

 Private Sub IvDate_KeyDown(KeyCode As Integer, Shift As Integer)

  Dim strMyKeys     As String
  strMyKeys = "mdy"       ' key check ignores caps
  If InStr(strMyKeys, Chr(KeyCode)) > 0 Then

     If IsNull(Me.IvDate) Then Me.IvDate = Date

     Select Case KeyCode

        Case Asc("M") And (Shift = 1)

           ' Move ahead one month
           Me.IvDate = DateAdd("m", 1, Me.IvDate)
        Case Asc("M")
           ' move bck one month
           Me.IvDate = DateAdd("m", -1, Me.IvDate)
        Case Asc("D") And (Shift = 1)
           Me.IvDate = DateAdd("d", 1, Me.IvDate)
        Case Asc("D")
           Me.IvDate = DateAdd("d", -1, Me.IvDate)
        Case Asc("Y") And (Shift = 1)
           Me.IvDate = DateAdd("yyyy", 1, Me.IvDate)
        Case Asc("Y")
           Me.IvDate = DateAdd("yyyy", -1, Me.IvDate)
     End Select

     KeyCode = 0   ' sends current key to black hole

  End If



End Sub