MS Access Form VBA Флажки, перед проверкой других? - PullRequest
0 голосов
/ 23 мая 2018

Я работаю над приложением Access с серверной частью SQL.

У меня есть форма для людей, где каждому человеку нужно проверять или не проверять разные вещи.В форме есть следующие поля и соответствующие элементы управления:

Нет параметров (целое число - логическое значение - флажок)

Параметр A (целое число - логическое значение - флажок)

Параметр AСумма (деньги)

Вариант B (целое число - логическое значение - флажок)

Вариант B Сумма (деньги)

Вариант C (целое число - логическое значение - флажок)

Опция C Сумма (деньги)

Опция D (целое число - логическое значение - флажок)

Командная кнопка опции D (открывает всплывающую форму с раскрывающимся списком типов опций и суммами для ввода нескольких значений).

Меня беспокоит то, что если кто-то отметит один ящик, он может вступить в конфликт с другим флажком или денежными полями.

Если кто-то выберет Без параметров, а один из других вариантов отмечен, янадо снять галочку с тех.Мне также нужно обнулить соответствующее денежное поле.Если в связанной таблице есть записи варианта «Другой вариант», то мне нужно удалить их тоже после подтверждения с пользователем.Я также хочу отключить флажки и элементы управления денежными средствами / кнопками для параметров A - D.

Если я сниму флажок Без параметров, тогда мне нужно включить все это.

Вы можете начатьчтобы увидеть, как каждый раз, когда я проверяю любую из опций «Нет» или опции «A-D», я должен проверить состояние «Без опций» и соответствующую сумму опциона, чтобы подтвердить, что пользователь хочет внести это изменение.

Для этого я установил следующий код для параметра «Нет параметров перед обновлением»:

Private Sub NoOptions_BeforeUpdate(Cancel As Integer)
Dim Msg, Style, Title
Dim delOLiensSQL

If Me.NoOptions = False Then
    If (Me.OptionA = True Or Me.OptionB = True Or Me.OptionC = True Or Me.OptionD = True) Then
        Msg = "You have chosen No Options, but one or more option is checked." & vbCrLf & _
        "Choosing No Options will require removing all Lien amounts." & vbCrLf & _
        "Would you like to change this Person to No Options?"
        Style = vbYesNo
        Title = "All Options Will Be Reset to 0 and False."
        Response = MsgBox(Msg, Style, Title)

        If Response = vbYes Then
            If Nz(DLookup("ID", "tblPersonOtherOptionsD", "FKPerson = " & Me.ID), 0) Then
                delOLiensSQL = "Delete From tblPersonOtherOptionsD Where FKPerson = " & Me.ID
                DoCmd.RunSQL delOoptionssSQL, dbSeeChanges
            End If
            Me.OptionA = False
            Me.OptionAAmount = 0
            Me.OptionB = False
            Me.OptionBAmount = 0
            Me.OptionC = False
            Me.OptionCAmount = 0
            Me.OptionD = False
            OptionsAllowPubFunc (False)
        Else
            Me.Undo
            MsgBox "OK, we will leave everything as it is.", vbOKOnly, "Better Safe Than Sorry"
        End If
    Else
        Me.NoOptions = True
    End If
Else
    Me.NoOptions = False
End If
End Sub

OptionsAllowPubFunc (False) - это открытая функция, которая выглядит следующим образом:

Public Function PlaintiffLiensAllowed(Liens As Boolean)
    Forms!frmPerson.OptionAAmount.Enabled = Liens
    Forms!frmPerson.OptionBAmount.Enabled = Liens
    Forms!frmPerson.OptionCAmount.Enabled = Liens
    Forms!frmPerson.OptionDAmount.Enabled = Liens
End Function

Я также настроил перед обновлением общедоступную функцию для OptionA, OptionB, OptionC, OptionD следующим образом:

Public Function ChangeAOption(OptionCheck As Control, OptionAmount As Control, OptionName As String)
    Dim Msg, Style, Title
    Dim Msg2, Style2, Title2

    If OptionCheck = True Then

        If Nz(OptionAmount, 0) > 0 Then
            Msg = "There is a " & OptionName & " Option amount. Unchecking " & OptionName & " Option, will require the amount to be 0." & vbCrLf & _
            "Would you like to uncheck " & OptionName & " Option and make the amount 0?"
            Style = vbYesNo
            Title = "Confirm No " & OptionName & " Option."
            Response = MsgBox(Msg, Style, Title)

            If Response = vbYes Then
                OptionAmount = 0
                OptionCheck = False
            Else
                OptionCheck.Undo
                MsgBox "Ok, we will leave it as is.", vbOKOnly, "Better Safe Than Sorry."
            End If
        Else
            OptionCheck = False
        End If
    Else
        If Forms!frmPerson.NoOptions = True Then
            Msg2 = "No Options is Checked. Checking " & OptionName & " Options will require no Options to be unchecked." & vbCrLf & _
            "Would you like to uncheck no Options?"
            Style2 = vbYesNo
            Title2 = "Confirm No Options False."
            Response2 = MsgBox(Msg2, Style2, Title2)
            If Response2 = vbYes Then
                OptionsAllowPubFunc (True)
                Forms!frmPerson.NoOptions = False
                OptionCheck = True
            Else
                OptionCheck = True
            End If
        Else
        OptionCheck = True
    End If
End Function

Я проверяю это, и когда я пытаюсь установить флажок No Options, меняюот ложного до истинного, я получаю ошибку времени выполнения '-2147352567 (80020009)':

Макрос или функция, для которых установлено свойство BeforeUpdate или ValidationRule для этого поля, предотвращают [приложение People]от сохранения данных в поле.

Кто-нибудь знает, что я делаю не так?Есть ли более простой способ сделать это?

Спасибо !!!

1 Ответ

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

Из моего недавнего опыта, когда запускается событие «До обновления», оно использует новое значение поля в любых вычислениях.Так что я ожидаю, что вы захотите начать этот основной оператор If, например If Me.NoOptions = True Then.Я также не верю, что вам нужны Else OptionCheck = True биты непосредственно перед End If s.

. Возможно, проблема вызвана тем, что вы назвали OptionsAllowPubFunc, но функцию, которую вы включили вэтот вопрос на самом деле называется PlaintiffLiensAllowed - если у вас нет идентичной функции с именем OptionsAllowPubFunc, это приведет к ошибке.

Наконец, я никогда не находил, что me.undo особенно полезен в такого рода контекстах, но перед обновлением вы получите выход - просто скажите, чтобы он отменил, используя Cancel = True (или все, что неt 0), и он не будет обновлять поле и выходить из подпрограммы.

Вы также можете добавить немного, чтобы повторно включить поля опций, если они не устанавливали флажок.

Попробуйте запустить его как:

Private Sub NoOptions_BeforeUpdate(Cancel As Integer)
Dim Msg As String, Style As VbMsgBoxStyle, Title As String
Dim Response As VbMsgBoxResult, delOLiensSQL As String

If Me.NoOptions = True Then
    If (Me.OptionA = True Or Me.OptionB = True Or Me.OptionC = True Or Me.OptionD = True) Then
        Msg = "You have chosen No Options, but one or more option is checked." & vbCrLf & _
        "Choosing No Options will require removing all Lien amounts." & vbCrLf & _
        "Would you like to change this Person to No Options?"
        Style = vbYesNo
        Title = "All Options Will Be Reset to 0 and False."
        Response = MsgBox(Msg, Style, Title)

        If Response = vbYes Then
            If Nz(DLookup("ID", "tblPersonOtherOptionsD", "FKPerson = " & Me.ID), 0) Then
                delOLiensSQL = "Delete From tblPersonOtherOptionsD Where FKPerson = " & Me.ID
                DoCmd.RunSQL delOoptionssSQL, dbSeeChanges
            End If
            Me.OptionA = False
            Me.OptionAAmount = 0
            Me.OptionB = False
            Me.OptionBAmount = 0
            Me.OptionC = False
            Me.OptionCAmount = 0
            Me.OptionD = False
            PlaintiffLiensAllowed(False)
        Else
            MsgBox "OK, we will leave everything as it is.", vbOKOnly, "Better Safe Than Sorry"
            Cancel = True
        End If
    End If
Else
    PlaintiffLiensAllowed(True)
End If
End Sub
...