我在MS-Access中有一个表 - 我们称之为tComputers
。该表中的两个字段标题为Status
- 具有Active,Storage,Deactivated和DeactivationDate
选项。
当且仅当DeactivationDate
的值已取消激活时,我才强制要Status
,我该怎么做?
答案 0 :(得分:3)
如果你想在表级强制执行此操作,我相信你运气不好。如果您使用的是Access 2010,则可以对数据宏执行某些操作。 编辑:我已经纠正了。虽然我个人从未使用过这个功能(更喜欢在表单级别处理验证更复杂的验证),但绝对可以:Validation Rules
如果您的用户只是通过绑定表单更新数据,您可以在Form_BeforeUpdate
事件中执行验证。然后,如果Status ='Deactivated'且DeactivationDate为Null,则设置Cancel = True
将阻止保存更改。显然,您需要显示一个消息框或以其他方式指示无法保存表单的原因。
答案 1 :(得分:3)
如果我想强制使用DeactivationDate当且仅当状态值为Deactivated时,我该怎么做?
相反,如果一个Deactivated记录稍后更改状态...说成为活动...是否应该丢弃DeactivationDate?
我认为您可以使用表级验证规则来完成此操作。使用TComputers在设计视图中,打开属性表并将其用作验证规则属性:
IsNull([DeactivationDate])=IIf([Status]="Deactivated",False,True)
找出您希望用户在违反验证规则时看到的消息,并将其作为验证文本属性放入。默认消息不太可能对他们有任何意义。
尽管有可能,但我怀疑这是多么有用。用户应该通过表单编辑数据,这使您有机会在数据库之前强制执行验证要求 引擎甚至尝试保存数据...使用Form_BeforeUpdate事件为@ mwolfe02描述。
修改:这是Form_BeforeUpdate的大纲。它假定您有一个名为cboStatus的组合绑定到Status字段,并且一个名为txtRetireDate的文本框绑定到RetireDate字段。
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim strMsg As String
Select Case Me.cboStatus
Case "Deactivated"
If IsNull(Me.txtRetireDate) Then
strMsg = "RetireDate is required for Status = Deactivated"
MsgBox strMsg
Me.txtRetireDate.SetFocus
Cancel = True
End If
Case "Active", "Storage"
'* what should happen here? *'
Case Else
'* what should happen here? *'
End Select
End Sub
答案 2 :(得分:0)
如果您使用表单输入数据,则可以使用VBA验证表单条目。在按下按钮以保存数据,您可以检查状态的值是否已取消激活,如果是,则可以要求DeactivationDate具有值。否则,将不会保存数据。
在表格设计窗口中做你想做的事情,我不知道怎么做。