контрольный журнал в базе данных, имя пользователя не регистрируется - PullRequest
0 голосов
/ 30 декабря 2018

В настоящее время я пытаюсь создать базу данных базового магазина, используя Microsoft Access с VisualBasic, и создал полностью функционирующий контрольный журнал, используя набор интерактивных руководств.Тем не менее, я очень плохо знаком с Visual Basic, и у меня есть только две-три недели опыта работы с ним.

Из-за этого у меня возникают трудности с частью аудита UserName, поскольку это дает мнеимя пользователя учетной записи компьютера вместо имени, используемого при входе в базу данных.

текущий код, который я использую:

Sub AuditChanges(IDField As String, UserAction As String)
      On Error GoTo AuditChanges_Err
    Dim cnn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim ctl As Control
    Dim datTimeCheck As Date
    Dim strUserID As String
    Set cnn = CurrentProject.Connection
    Set rst = New ADODB.Recordset
    rst.Open "SELECT * FROM tblAuditTrail", cnn, adOpenDynamic, adLockOptimistic
    datTimeCheck = Now()
    strUserID = Environ("USERNAME")
    Dim Test As String
    Test = "EDIT"
    Select Case UserAction
        Case Test
            For Each ctl In Screen.ActiveForm.Controls
                If ctl.Tag = "Audit" Then
                    If Nz(ctl.Value) <> Nz(ctl.OldValue) Then
                        With rst
                            .AddNew
                            ![DateTime] = datTimeCheck
                            ![UserName] = strUserID
                            ![FormName] = Screen.ActiveForm.Name
                            ![Action] = UserAction
                            ![RecordID] = Screen.ActiveForm.Controls(IDField).Value
                            ![FieldName] = ctl.ControlSource
                            ![OldValue] = ctl.OldValue
                            ![NewValue] = ctl.Value
                            .Update
                        End With
                    End If
                End If
            Next ctl
        Case Else
            With rst
                .AddNew
                ![DateTime] = datTimeCheck
                ![UserName] = strUserID
                ![FormName] = Screen.ActiveForm.Name
                ![Action] = UserAction
                ![RecordID] = Screen.ActiveForm.Controls(IDField).Value
                .Update
            End With
    End Select
AuditChanges_Exit:
    On Error Resume Next
    rst.Close
    cnn.Close
    Set rst = Nothing
    Set cnn = Nothing
    Exit Sub
AuditChanges_Err:
    MsgBox Err.Description, vbCritical, "ERROR!"
    Resume AuditChanges_Exit
End Sub

Любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

0 голосов
/ 30 декабря 2018

Как упоминает @RyanWildry, ваш пользовательский логин будет определять, как получить текущее имя пользователя базы данных.При условии входа в форму, есть несколько способов получить текущего пользователя, который будет использоваться в контрольном журнале:

  1. TABLE : сохранить пользователя в таблице, например один-row CurrentUser , который обновляется после успешного входа в систему:

    User      StartTime
    Jane Doe  2018-12-31 12:00
    

    Запрос действия, который должен запускаться после успешного входа в систему:

    UPDATE [CurrentUser] SET [User] = Forms!DatabaseLogin!UserName, StartTime = Now();
    

    Затем в журнале аудита назначьтетаблица с DLookUp, заменяющая Environ("UserName"):

    ...
    strUserID = DLookUp("[User]", "[CurrentUser]")
    ...
    
  2. FORM : используйте форму входа в систему, особенно скрытую, которую пользователь не видит.После того, как пользователь введет учетные данные, сделайте форму входа в базу данных скрытой, чтобы она оставалась доступной для извлечения значений текстового поля:

    Forms!DatabaseLogin.Visible = True
    

    Затем в журнале аудита присвойте значение формы, заменив Environ("UserName"):

    ...
    strUserID = Forms!DatabaseLogin!UserName
    ...
    
  3. VARIABLE : использовать глобальную переменную VBA в стандартном модуле (т. Е. Не за какой-либо формой / отчетом), который устанавливается после входа в систему и сохраняется в течение сеанса приложения илисброс с использованием следующего пользователя:

    Option Compare Database              ' MS ACCESS DEFAULT
    Option Explicit                      ' BEST PRACTICE TO ADD
    
    Public CurrentUserName As String     ' PLACE OUTSIDE OF ANY FUNCTION/SUB
    
    ' CALL SUB ROUTINE AFTER LOGIN
    Sub SetUser()
        CurrentUserName = Forms!DatabaseLogin!UserName
    End SetUser
    

    Затем в журнале аудита назначьте глобальную переменную, заменив Environ("UserName"):

    ...
    strUserID = CurrentUserName
    ...
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...