锁定访问记录中的字段的问题

时间:2019-07-12 18:46:01

标签: vba ms-access access-vba

我在锁定数据库中名为“所有者”的字段时遇到麻烦。通过从网络中获取该用户的用户ID来填充“所有者”字段。然后通过Sub Before Change功能上的VBA代码进行设置,以在其他人对该任务进行更改时阻止其更新(当前,它希望抓住任何更新记录的人并覆盖原始所有者User ID)。

代码如下:

Public beforeValueChange As Integer

Private Sub Form_BeforeUpdate(cancel As Integer)
Dim Owner As String
Owner = Environ("USERNAME")

        'If Me.NewRecord = True Then
            Me!Owner = Owner

  On Error Resume Next
  If [Owner] = "Name1" And [User ID] = "Unassigned" Then
  [User ID] = "Name1"

  ElseIf [Owner] = "Name2" And [User ID] = "Unassigned" Then
  [User ID] = "Name2"
  ElseIf [Owner] = "123456" And [User ID] = "Unassigned" Then
  [User ID] = "Name2"

ElseIf [Owner] = Null Then
  [User ID] = "Unassigned"
  End If
End Sub

Public Sub Status_Change()
Dim objOutlookApp As Object
Dim objMail As Object
Dim nConfirmation As Integer

'In progress
    If [Status] = 10 And IsNull(Me.[StartDate]) Then
    [StartDate] = Now()

'Completed
    ElseIf [Status] = 100 And IsNull(Me.[DateCompleted]) Then
    nConfirmation = MsgBox("Are you sure you want to complete this Task?", vbInformation + vbYesNo, "Complete Task?")
        If nConfirmation = vbYes And Not IsNull(Me.[StartDate]) Then
    [DateCompleted] = Now()
        Else
        [Status] = 0
        MsgBox "You cannot complete a task that has not been started"
        End If

'Transferred
    ElseIf [Status] = -10 And IsNull(Me.[DateTransferred]) Then
    [DateTransferred] = Now()

    'Copy Record without completed date
    DoCmd.DoMenuItem acFormBar, acEditMenu, 8, , acMenuVer70
    DoCmd.DoMenuItem acFormBar, acEditMenu, 2, , acMenuVer70
    DoCmd.DoMenuItem acFormBar, acEditMenu, 5, , acMenuVer70

    [Status] = 0
    [StartDate] = Null
    [User ID] = "Unassigned"
    [DateTransferred] = Null

    'Set Due Date
    If [Priority] = "(1) Hot!" Then
       [DueDate] = Date
    ElseIf [Priority] = "(2) High" Then
       [DueDate] = Date + 1
    ElseIf [Priority] = "(3) Normal" Then
       [DueDate] = Date + 2
    ElseIf [Priority] = "(4) Low" Then
       [DueDate] = Date + 3
    End If

'Waiting
    ElseIf [Status] = 50 Then
    '[DateCompleted] = Now()
    End If

    Forms![frmTasks].Form.Requery
    Forms![frmTasks].Form.Refresh

End Sub

Public Sub Staus_BeforeChange(cancel As Integer)
beforeValueChange = Me.[Status]
End Sub

Public Sub Status_AfterUpdate()
If Not IsNull(Me.[DateCompleted]) Then
Me.[Status] = beforeValueChange
Me.[Status] = 100
End If
End Sub

End Sub
Private Sub Owner_BeforeChange(cancel As Integer)
beforeValueChange = Me.Owner
End Sub

Private Sub Owner_AfterUpdate()
If Not IsNull(Me.Owner) Then
Me.Owner = beforeValueChange
DoCmd.OpenForm "Hal2001"
End Sub

我使用与此非常相似的方法来停止状态字段中的更改,并且效果很好。但是由于某种原因,我在同一表格上遇到了该版本的问题。

编辑:希望不需要输入整个代码,因为它很长,但是就在这里。

编辑:这是为了表明该字段已锁定并且仍然存在问题

Locked field

-德克

1 个答案:

答案 0 :(得分:1)

建议您使用与字段或控件名称不同的变量名称,例如strOwner

Dim strOwner As String
strOwner = Environ("USERNAME")

尝试取消注释行并制作单线If Then

If Me.NewRecord Then Me!Owner = strOwner

If IsNull(Me!Owner) Then Me!Owner = strOwner

或者不用担心变量,因为它在过程中仅使用一次。

If Me.NewRecord Then Me!Owner = Environ("USERNAME")