Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2013, 06:33   #1
И-ван-Ыч
Пользователь
 
Регистрация: 08.08.2013
Сообщений: 19
По умолчанию Как остаться в том же поле

Доброго времени суток всем!
..
Есть простая форма с двумя свободными полями.
Как при проверке значений в поле при невыполнении условия остаться в том же поле?
Пробовал разные варианты:

Код:
Private Sub ДатаОдин_AfterUpdate()
  If Nz(Me.[ДатаОдин] > Date) Then
    MsgBox "Дата не может быть больше текущей"
    Me.[ДатаОдин].SetFocus
  End If
End Sub
Код:
Private Sub ДатаОдин_AfterUpdate()
  If Nz(Me.[ДатаОдин] > Date) Then
    MsgBox "Дата не может быть больше текущей"
    Cancel = -1
  End If
End Sub
Код:
Private Sub ДатаОдин_AfterUpdate()
  If  [ДатаОдин] > Date Then
    MsgBox "Дата не может быть больше текущей"
    Screen.PreviousControl.SetFocus
  End If
End Sub
И для второго поля похожие варианты:

Код:
Private Sub ДатаДва_AfterUpdate()
 If [ДатаДва] < [ДатаОдин] Then
   MsgBox "Вторая дата не может быть меньше первой"
   'Screen.PreviousControl.SetFocus
   Cancel = -1
 Else
   DoCmd.OpenQuery "зУдалениеГрафика", acViewNormal, acEdit
   DoCmd.Close acForm, "фУдалениеГрафиков"
 End If
End Sub
И ничего не получается. При невыполнении условия сообщение выводится, но курсор в поле не остается, а переходит на следующее поле (или, для второго поля, запускает запрос). Что можете посоветовать (только попроще, для начинающих чтобы)?
Спасибо всем за уделённое данной теме время.
И-ван-Ыч вне форума Ответить с цитированием
Старый 02.10.2013, 11:33   #2
И-ван-Ыч
Пользователь
 
Регистрация: 08.08.2013
Сообщений: 19
По умолчанию

Для первого поля нашел в и-нете похожее решение:

Код:
Private Sub ДатаОдин_Exit(Cancel As Integer)
  If [ДатаОдин] > Date Then
  Cancel = True
    If MsgBox("Дата не может быть больше текущей", vbOKCancel, "") = vbOKCancel Then Exit Sub
    DoCmd.Close
  End If
End Sub
А вот со вторым полем подобным образом никак не получается. (
Тут надо при [ДатаДва] < [ДатаОдин] вывести сообщение и остаться на этом же поле, а в противном случае запустить запрос и закрыть эту текущую форму. Вот без сравнения условия и запрос запускается и форма закрывается, а с условием - различные ошибки в зависимости от вариантов написанного кода.
И-ван-Ыч вне форума Ответить с цитированием
Старый 02.10.2013, 13:36   #3
Myhaylo
Форумчанин
 
Регистрация: 19.07.2012
Сообщений: 520
По умолчанию

Понимаете ли, событие "Выход" (Exit) имеет переменную Cancel для отмены события. Но вот событие "После обновления" (AfterUpdate) - нет. А Вы в первых 4 вариантах пытались работать с Cancel... Теперь понимаете, почему у Вас ничего не получалось?
Теперь покажите, что именно Вы делаете с 2 датами. А событие ли "Выход" (Exit) Вы используете?
Окупант, руки прочь от Украины!!! Слава Героям!
Myhaylo вне форума Ответить с цитированием
Старый 03.10.2013, 06:29   #4
И-ван-Ыч
Пользователь
 
Регистрация: 08.08.2013
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Myhaylo Посмотреть сообщение
Понимаете ли, событие "Выход" (Exit) имеет переменную Cancel для отмены события. Но вот событие "После обновления" (AfterUpdate) - нет. А Вы в первых 4 вариантах пытались работать с Cancel... Теперь понимаете, почему у Вас ничего не получалось?
Ну, теперь-то я понимаю, хоть и с трудом (в прямом и переносном смыслах).

Цитата:
Сообщение от Myhaylo Посмотреть сообщение
Теперь покажите, что именно Вы делаете с 2 датами.
Есть такая формочка [фУдалениеГрафиков] (вызывается из главной формы по клику на кнопку):


420x218(12.49 kB)


Вводятся две даты, затем запускается запрос на удаление и все записи, которые попадают между этими датами включительно, удаляются (в запросе ссылка на поля формы с операцией Between) и форма закрывается.

Если для первого поля все уже работает по коду
Код:
Private Sub ДатаОдин_Exit(Cancel As Integer)
  If [ДатаОдин] > Date Then
  Cancel = True
    If MsgBox("Дата не может быть больше текущей", vbOKCancel, "") = vbOKCancel Then Exit Sub
    DoCmd.Close
  End If
End Sub
то для второго поля ничего не получается сделать.

Пример моих попыток (часть попыток закомментена апострофами дабы не перебивать много раз):
Код:
Private Sub ДатаДва_Exit(Cancel As Integer)
 If [ДатаДва] < [ДатаОдин] Then
   Cancel = True
     If MsgBox("Вторая дата не может быть меньше первой", vbOKCancel, "") = vbOKCancel Then Exit Sub
     DoCmd.Close
 Else
   DoCmd.OpenQuery "зУдалениеГрафика", acViewNormal, acEdit
   DoCmd.Close acForm, "фУдалениеГрафиков"
     
   'MsgBox "Вторая дата не может быть меньше первой"
   'Screen.PreviousControl.SetFocus
   'Cancel = -1
 'Else
   'DoCmd.OpenQuery "зУдалениеГрафика", acViewNormal, acEdit
   'DoCmd.Close acForm, "фУдалениеГрафиков"
 End If
End Sub
Цитата:
Сообщение от Myhaylo Посмотреть сообщение
А событие ли "Выход" (Exit) Вы используете?
Да.

Уже думаю опять просто оставить параметрический запрос, без вызова формы [фУдалениеГрафиков] или в форме не проверять условия, тогда всё работало.

Myhaylo - спасибо (рейтинг поднять пока не могу), поэтому здесь.

Последний раз редактировалось И-ван-Ыч; 04.10.2013 в 06:12.
И-ван-Ыч вне форума Ответить с цитированием
Старый 04.10.2013, 04:32   #5
Волшебник
Пользователь
 
Аватар для Волшебник
 
Регистрация: 17.08.2011
Сообщений: 39
По умолчанию

И-ван-Ыч,

Я бы это повесил бы на кнопку,
или на закрытие формы.
---------------------------------
Чтобы не было ошибок
при выполнении запроса,
то нужно проверять все условия.

А их может быть несколько.
----------------------------------
1.
If IsNull(Me![Дата1]) And IsNull(Me![Дата2]) Then
If (7 = MsgBox("Необходимо ввести начальную и конечную даты.", 48, "Удаление графиков")) Then
End If
Me![Дата1].SetFocus
Exit Sub
End If

2.
If IsNull(Me![Дата1]) Then
If (7 = MsgBox("Необходимо ввести начальную дату.", 48, "Удаление графиков")) Then
End If
Me![Дата1].SetFocus
Exit Sub
End If

3.
If IsNull(Me![Дата2]) Then
If (7 = MsgBox("Необходимо ввести конечную дату.", 48, "Удаление графиков")) Then
End If
Me![Дата2].SetFocus
Exit Sub
End If

4.
If Me![Дата1] > Me![Дата2] Then
If Me![Дата1] > Date Then
If (7 = MsgBox("Начальная дата не должна превосходить " & Date & ".", 16, "Удаление графиков")) Then
End If
Me![Дата1].SetFocus
End If
If Me![Дата1] <= Date Then
If (7 = MsgBox("Конечная дата должна превосходить начальную дату," & vbNewLine & "либо быть ей равной.", 16, "Удаление графиков")) Then
End If
Me![Дата2].SetFocus
End If
Exit Sub
End If

5.
If Me![Дата1] = Me![Дата2] Then
If Me![Дата1] > Date Then
If (7 = MsgBox("Начальная дата не должна превосходить " & Date & ".", 16, "Удаление графиков")) Then
End If
Me![Дата1].SetFocus
Exit Sub
End If
End If

6.
If Me![Дата2] > Date Then
If (7 = MsgBox("Конечная дата не должна превосходить " & Date & ".", 16, "Удаление графиков")) Then
End If
Me![Дата2].SetFocus
Exit Sub
End If
---------------------------------------------
Если даты введены правильно, то выполняем запрос.
И закрываем форму.
-----------------------------
307 МОНЕТ ВОЛШЕБНИКА
Волшебник вне форума Ответить с цитированием
Старый 04.10.2013, 06:09   #6
И-ван-Ыч
Пользователь
 
Регистрация: 08.08.2013
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Волшебник Посмотреть сообщение
И-ван-Ыч,

Я бы это повесил бы на кнопку,
или на закрытие формы.
---------------------------------
Чтобы не было ошибок
при выполнении запроса,
то нужно проверять все условия.

А их может быть несколько.
Спасибо! Попробую.
Только не хотелось бы вешать ни на кнопку, ни на закрытие формы, хотелось бы чтобы сразу во второе поле вбил дату, и сразу либо сообщение (если не выполнены условия), либо запуск запроса, чтобы меньше действий было (пользователи и я ленивые, лишний раз давить - лень).

Последний раз редактировалось И-ван-Ыч; 04.10.2013 в 06:13.
И-ван-Ыч вне форума Ответить с цитированием
Старый 04.10.2013, 10:43   #7
Myhaylo
Форумчанин
 
Регистрация: 19.07.2012
Сообщений: 520
По умолчанию

Убийственное предложение: отключить переход по {ENTER} в меню MS Access ("Сервис"/"Параметры"/Клавиатура" -> "Поведение по Enter"="Нет"). Тогда достаточно будет обрабатівать только событие "После обновления" (AfterUpdate)...
Окупант, руки прочь от Украины!!! Слава Героям!
Myhaylo вне форума Ответить с цитированием
Старый 08.10.2013, 11:44   #8
beal
Пользователь
 
Регистрация: 07.10.2013
Сообщений: 10
По умолчанию

например, так:
Цитата:
Private Sub ДатаОдин_LostFocus()
If Me.ДатаОдин > Date Then
MsgBox "Дата не может быть больше текущей"
Me.Поле0.SetFocus 'поле Поле0 абстрактное (либо создать его на форме, либо использовать любое другое существующее поле)
Me.ДатаОдин.SetFocus
End If
End Sub
это наиболее простой вариант.
beal вне форума Ответить с цитированием
Старый 14.10.2013, 07:05   #9
Woodlin
Форумчанин
 
Регистрация: 30.03.2010
Сообщений: 153
По умолчанию

Если тема ещё актуальна можно использовать событие До обновления (BeforeUpdate).
Код:
Private Sub ДатаОдин_BeforeUpdate(Cancel As Integer)
  If Nz(Me.[ДатаОдин] > Date) Then
    MsgBox "Дата не может быть больше текущей"
    Cancel = -1
  End If
End Sub
Woodlin вне форума Ответить с цитированием
Старый 15.10.2013, 18:04   #10
Myhaylo
Форумчанин
 
Регистрация: 19.07.2012
Сообщений: 520
По умолчанию

Но к сожалению, курсор переходит в следующее поле и этот MsgBox никого ни к чему не обязывает...
Окупант, руки прочь от Украины!!! Слава Героям!
Myhaylo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Hook, как убедиться в том, что это нужное мне окно crazygoldbullet Win Api 2 25.08.2013 03:10
Как отключиь том VladimirVB Операционные системы общие вопросы 3 07.07.2010 15:44
Как проверить нажата ли любая клавиша (в том числе и на мыши)? Вадим Буренков Общие вопросы Delphi 11 07.07.2009 16:30
Проектирование электронных устройств (о том, как создаются новые продукты) Askofen Обсуждение статей 0 12.04.2009 18:21