【问题标题】:Duplicate Entry Warning Message Box重复输入警告消息框
【发布时间】:2016-02-25 22:22:03
【问题描述】:

我试图在输入重复号码时显示一个消息框。如果 [Source] 和 [Voucher_Number] 两个字段都匹配,则此表中的重复项。

[来源]被格式化为文本

[Voucher_Number] 格式为数字

我的代码如下所示:

If (IsNull(DLookup("Source", "tblInvoiceLog", "Source ='" & 
Me.Source.Value & "'"))) And _
(IsNull(DLookup("Voucher_Number", "tblInvoiceLog", "Voucher_Number ='" &
Me.Voucher_Number.Value & "'"))) Then

Else
MsgBox "Duplicate Entery!" & Chr(13) & Chr(10) & "Please Use the Next
Available Consecutive Voucher Number", vbInformation, "Required"
End If

End Sub

我得到:

运行时错误 3464

除了解决这个问题,我最终想做的是在消息框中为原始条目返回 [Vendor_Name] 中的字段值。

感谢您提供的任何帮助

【问题讨论】:

  • 我已经很久没有使用 VBA 或 VB 了,但您似乎将 & 和 "And" 用于逻辑运算符...您能检查一下该代码是否正确吗?
  • 对不起 "Me.Source.Value & "'"))) 并且 _ 应该是 "Me.Source.Value & "'"))) 或 _
  • 没关系,我记得 & 是 VB 中的字符串连接...与其他语言的按位/逻辑运算符混淆了。似乎在 If 语句之前连接你的字符串会更好,至少这是我要尝试的第一件事。
  • 哪一行报错了?
  • (IsNull(DLookup("Voucher_Number", "tblInvoiceLog", "Voucher_Number ='" & Me.Voucher_Number.Value & "'"))) 然后

标签: database vba ms-access-2007


【解决方案1】:

您可以尝试将 DLookup 返回值专门转换为字符串,以确保您将苹果与苹果进行比较。如果仍然出现错误,请使用 F8 单步执行并将鼠标悬停在 s1stLookup 和 s2ndLookup 上以查看为变量分配了哪些值。

Dim s1stLookup as String
Dim s2ndLookup as String

'Specifically cast the DLookup return values as Strings
s1stLookup = CStr(DLookup("Source", "tblInvoiceLog", "Source ='" & Me.Source.Value & "'"))
s2ndLookup = CStr(DLookup("Voucher_Number", "tblInvoiceLog", "Voucher_Number ='" & Me.Voucher_Number.Value & "'"))

If (IsNull(s1stLookup)) And (IsNull(s2ndLookup)) Then
  '... Presumably some code here
Else
  MsgBox "Duplicate Entery!" & vbCrLF & _
    "Please Use the Next Available Consecutive Voucher Number", _
    vbInformation, "Required"
End If

【讨论】:

  • 赞成仅用于从If 语句中提取查找;我认为IsNull(String) 将返回一致的False 而不管DLookup 值,因为CStr,所以条件可以改写为(如果我没有完全打破这个)If Not (s1stLookup = vbNullString Or s2ndLookup = vbNullString) Then,如果只有一个Else 分支。还可以考虑使用vbNewLine,而不是换行+回车。
  • 运行时错误 3464,看起来第一次查找得到了答案,但第二次没有?我真的很感谢您为此付出的时间
  • 首先,@Mat'sMug 是正确的。如果 DLookup 返回 Null,CStr 会将其强制转换为“1”,因此它永远不会为 Null。抓好垫子!如果第二个 DLookup 抛出数据类型不匹配错误,试试这个:"Voucher_Number =" & CStr(Me.Voucher_Number.Value)
  • 好的,我相信我们正朝着正确的方向前进,没有产生运行时错误,问题是它没有同时查看两个变量。它看到有 X 的 [Voucher_Number] 但看不到是否存在 [Source] AND [Voucher_Number] 与 X 的组合
【解决方案2】:

目前您正在分别测试这两个值。但是

如果 [Source] 和 [Voucher_Number] 两个字段都匹配,则此表中的重复项。

因此,您需要通过将两个条件与 AND 放入 DLookup 调用来测试这两个值是否存在于同一记录中。而且既然要获取[Vendor_Name],如果是重复的,可以直接查找这个字段:

Dim sVendor as String
sVendor = Nz(DLookup("Vendor_Name", "tblInvoiceLog", _
    "Source = '" & Me.Source & "' AND Voucher_Number = " & Me.Voucher_Number), "")

If sVendor <> "" Then
    MsgBox "Duplicate entry of vendor '" & sVendor & "'."
Else
    ' ok, no dupe
End If

我发现最好始终将Nz()DLookup() 一起使用,这样我就可以使用字符串而不是变体。空字符串表示没有结果。

【讨论】:

  • 这非常有效,非常感谢这个提示。非常感谢
猜你喜欢
  • 2019-06-19
  • 1970-01-01
  • 2018-07-05
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多