2015-08-07 12 views
2

У меня есть форма в MS Access, которую я пытаюсь создать для страховых требований. У меня есть все поля, которые мне нужно заполнить, но то, что я хотел бы сделать, это включить или отключить эти поля в зависимости от определенных действий пользователей. Таким образом, поток формы выглядит следующим образом: у меня есть фрейм сверху с двумя переключателями, один для случая с одним претензием и один для случая с несколькими претензиями. Если пользователь нажимает кнопку с одним приложением, все продолжается без проблем. Если пользователь нажимает кнопку с несколькими претензиями, рядом со списком появляется выпадающий список номеров MultiClaim_Incident_ID, которые им нужно выбрать. То, что я пытаюсь сделать, заключается в том, что пользователь выбирает кнопку «Случай с несколькими претензиями» И не выбирает номер идентификатора инцидента из раскрывающегося списка (т.е. оставляет его по умолчанию), тогда остальная часть формы отключается до тех пор, пока не будет исправлена а также все поля ...Включение/выключение полей с определенными критериями MS Access

Кажется, что это должно быть довольно просто, но я не могу заставить его работать, я не уверен, что моя логика ошибочна или что. Вот сокращенная версия моего кода VBA:

Private Sub Form_Load() 
    Me.SM_Frame.Value = 1 
    Me.MultiClaim_Drpdwn.Value = Null 
End Sub 

Private Sub SM_Frame_AfterUpdate() 
    If SM_Frame.Value = 1 Then 
     Me.MultiClaim_Incident_ID_Label.Visible = False 
     Me.MultiClaim_Drpdwn.Visible = False 
    ElseIf SM_Frame.Value = 2 Then 
     Me.MultiClaim_Incident_ID_Label.Visible = True 
     Me.MultiClaim_Drpdwn.Visible = True 
    ElseIf SM_Frame.Value = 2 & MultiClaim_Drpdwn.Value = Null Then 
     Me.Incident_Date = Null 
     Me.Incident_Date.Enabled = False 
     Me.Claimant_Name.Value = "" 
     Me.Claimant_Name.Enabled = False 
    //PATTERN CONTINUES FOR REST OF FIELDS// 
     MsgBox ("CLEAR EVERYTHING!!") 
    ElseIf SM_Frame.Value = 1 Then 
     Me.Incident_Date.Value = "" 
     Me.Incident_Date.Enabled = True 
     Me.Claimant_Name.Value = "" 
     Me.Claimant_Name.Enabled = True 
    //PATTERN CONTINUES FOR REST OF FIELDS// 
     MsgBox ("Everything can continue as is") 
    End If 
End Sub 
+0

Это выражение возвращает True, когда * Condition1 * и * Condition2 * являются True или False, когда любое условие False: 'Condition1 And Condition2'. Это выражение попытается объединить эквивалент строки * Condition1 * с эквивалентом строки * Условие2 *: 'Условие1 & Условие2' – HansUp

+0

Проверка того, что' foo = Null' никогда не вернется True, независимо от значения * foo *. Используйте 'IsNull (foo)', чтобы проверить, является ли * foo * Null. – HansUp

+0

Значит, вы говорите, что используете амперсанд для логического сравнения, а не для ввода «И»? Кроме того, чтобы очистить текстовые поля, которые могут иметь текст в них, является 'Me.Incident_Date = Null' правильным способом, или лучше сделать' Me.Incident_Date = "" '? –

ответ

1

Позвольте мне сказать, что получение таких последовательностей, как эти права, не является прямым на всех! Так что не чувствуйте себя плохо в том, чтобы не получить это правильно с первой попытки. Я должен создавать такие вещи примерно раз в месяц и все еще нуждаться в большом количестве попыток, пока он не будет работать во всех ситуациях.

Попробуйте отделить озабоченности:

У вас уже есть SM_Frame_AfterUpdate(). Сделайте в нем то, что нужно, чтобы обрабатывать изменения со значения 1 до 2, а именно, чтобы сделать Combobox видимым, но STOP там. Вы не знаете, что произойдет с полями с информацией только от SM_Frame, вам нужно подождать MultiClaim_Drpdwn. Также сделайте то, что нужно, чтобы перейти от 2 к 1, а именно скрыть Combobox.

Затем создайте обработчик AfterUpdate MultiClaim_Drpdwn_AfterUpdate(). Используйте THAT для обработки полей (включить/отключить, установить пустой) в соответствии с его значением.

После того, как у вас есть это, вы оставите только оставшиеся края. Например, вы хотите, чтобы поля вели себя как MultiClaim_Drpdwn_AfterUpdate() состояния сразу после изменения SM_Frame. Это легко, как только вы поймете, что можете просто счастливо позвонить MultiClaim_Drpdwn_AfterUpdate() с точностью до SM_Frame_AfterUpdate(), лучше всего сделать в самом конце. Эти обработчики событий по-прежнему являются обычными функциями, уже общедоступными и доступными для всех. Это сделает вещи цепочкой красиво, когда вы придете от радиобарабана или нет, когда вы пришли из Combobox.

+0

Это помогло немного, положив второй обработчик 'ElseIf' в обработчик' MultiClaim_Drpdwn_AfterUpdate() 'Мне удалось отключить поля, но не включить, если бы я изменил значение' MultiClaim_Drpdwn.Value'. Возможно, я здесь недостаточно, но могу ли я сделать что-то вроде этого: 'ElseIf SM_Frame.Value = 1 Или (SM_Frame.Value = 2 И Not IsNull (MultiClaim_Drpdown.Value))'? –

1

В серии «ELSEIF», когда условие истинно, остальное игнорируется.

Итак, ваш

ElseIf SM_Frame.Value = 2 & MultiClaim_Drpdwn.Value = Null Then

никогда не достигается, потому что у вас

ElseIf SM_Frame.Value = 2 Then 

раньше.

В той же идее, «ElseIf SM_Frame.Value = 1 Тогда» после того, как MsgBox совершенно бесполезно, потому что это скрытый по «Если SM_Frame.Value = 1 Тогда»

Попробуйте использовать шаг пошаговый режим отладки, чтобы увидеть это.

Смежные вопросы