1

新来的 - 相当高级的 excel 用户现在正试图掌握 Access。

我正在建立一个学校数据数据库,该数据库基于一个链接表,其中包含由另一个团队管理的大部分学校信息(联系数据链接)和一个我需要的附加行表(附加联系数据)。使用 AutoExec(UNION 查询后跟创建表)附加这两个表以提供完整列表 (AllSchoolsData)。

用户将通过表单更新附加行表,我想防止他们复制其中一个字段(DfE),以便在 AllSchoolsData 中保持唯一。

我一直在尝试使用 DLookup 并且已经做到了这一点:

Private Sub Form_BeforeUpdate(Cancel As Integer)

Dim NewDfE As Variant
Dim stLinkCriteria As Variant

NewDfE = Me.DfE.Value
stLinkCriteria = [DfE] = NewDfE
If Me.DfE = DLookup("[DfE]", "[Contact Data Linked]", stLinkCriteria) Then
    MsgBox "This DfE number has already been allocated." _
        & vbCr & vbCr & "Please enter a unique DfE number.", vbInformation, "Duplicate DfE Number"
Me.Undo
End If
End Sub

这似乎非常适合“已链接的联系人数据”顶部列出的记录,但不会阻止输入任何其他 DfE 号码。

该代码基于我在 youtube 教程https://www.youtube.com/watch?v=XXLXo4As61Y和一些论坛中找到的解决方案,例如https://www.experts-exchange.com/questions/21522439/Dlookup -to-prevent-duplicate-entries.html

任何建议将不胜感激!

4

1 回答 1

0

您正在将 stLinkCriteria 设置为布尔值,即与 的结果DfE比较NewDFE。您应该将其设置为比较两者的字符串,并让数据库引擎处理比较

stLinkCriteria = "[DfE] = " & NewDfE 'If [DfE] is numeric

或者

stLinkCriteria = "[DfE] = '" & NewDfE & "'" 'If [DfE] is a string

或者,更好的是,在您的DLookUp:

Private Sub Form_BeforeUpdate(Cancel As Integer)
    Dim stLinkCriteria As Variant

    TempVars!NewDFE= Me.DfE.Value
    If Me.DfE = DLookup("[DfE]", "[Contact Data Linked]", "DfE = TempVars!NewDfE") Then
        MsgBox "This DfE number has already been allocated." _
            & vbCr & vbCr & "Please enter a unique DfE number.", vbInformation, "Duplicate DfE Number"
        Cancel = True
    End If
    TempVars.Remove "NewDfE"
End Sub

进一步的建议是:使用Cancel = True而不是Me.Undo. Me.Undo回滚所有更改,而Cancel = True只会使您无法提交更新(允许人们修复错误,然后保存更改)。

于 2018-03-28T16:36:35.257 回答