我在锁定数据库中名为“所有者”的字段时遇到麻烦。通过从网络中获取该用户的用户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
我使用与此非常相似的方法来停止状态字段中的更改,并且效果很好。但是由于某种原因,我在同一表格上遇到了该版本的问题。
编辑:希望不需要输入整个代码,因为它很长,但是就在这里。
编辑:这是为了表明该字段已锁定并且仍然存在问题
-德克
答案 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")