对包含双引号的记录使用 FindRecord

Posted

技术标签:

【中文标题】对包含双引号的记录使用 FindRecord【英文标题】:Using FindRecord with records containing double quotes 【发布时间】:2020-07-22 21:57:29 【问题描述】:

我正在尝试在打开表单时使用OpenArgs 来定位记录。记录没有重复。该代码一直有效,直到记录包含双引号。

OpenArgs 在使用关闭一个表单时设置

Private Sub EditBtn_Click()
    Dim CurrentProd As String
    CurrentProd = Me.ProductName
    DoCmd.Close acForm, "ProductsFrm"
    DoCmd.OpenForm "ProductEditFrm", OpenArgs:=CurrentProd
End Sub

当新表单打开时,加载事件包含

Private Sub Form_load()
    Dim ProdSrch As String
    If Nz(Me.OpenArgs, 0) <> 0 Then
        ProdSrch = Replace(Me.OpenArgs, """", """""")
        Me.ProductName.SetFocus
        DoCmd.FindRecord ProdSrch
    End If
End Sub

替换函数将诸如“Chocolate Torte 8”Rich with Chocolate Ganache”之类的字符串更改为 Chocolate Torte 8”“Rich with Chocolate Ganache”。我发现的其他帮助建议这应该被解释为将两个双引号视为单引号而不是分隔符的指令,但是,Access 找不到记录。

即使我输入确切的文本并使其等于字符串变量,如下所示,Access 也不会找到记录

Private Sub Form_load()
    Dim ProdSrch As String
    If Nz(Me.OpenArgs, 0) <> 0 Then
        ProdSrch = "Chocolate Torte 8"" Rich with Chocolate Ganache"
        Me.ProductName.SetFocus
        DoCmd.FindRecord ProdSrch
    End If
End Sub

或者这个

Private Sub Form_load()
    Dim ProdSrch As String
    If Nz(Me.OpenArgs, 0) <> 0 Then
        ProdSrch = "Chocolate Torte 8" & Chr(34) & " Rich with Chocolate Ganache"
        Me.ProductName.SetFocus
        DoCmd.FindRecord ProdSrch
    End If
End Sub

没有错误,Access 将我带到第一条记录。

我使用recordsetclone 以另一种方式解决了这个问题。 将Openargs 更改为主键唯一编号而不是文本字符串。第二种形式中包含主键的文本框已将“启用”设置为“否”,因此 setfocus 不起作用。

Private Sub Form_load()
    Dim Rst As Recordset
    Dim ProdSrch As String
    If Nz(Me.OpenArgs, "") <> "" Then
        ProdSrch = "[ProductID] = " & Me.OpenArgs
        Set Rst = Me.RecordsetClone
        Rst.FindFirst ProdSrch
        Me.Bookmark = Rst.Bookmark
        Rst.Close
    End If
End Sub

我最初应该使用主键而不是名称来查找记录,在 VBA 中将文本框从 enabled = true 更改为 false。那应该简单得多。但是尝试过这种方法后,我想知道我缺少什么

顺便说一下,如果我单步执行我得到的代码

运行时错误编号 2046 弹出“命令或操作“FindRecord”现在不可用。

如果我不单步执行,这不会弹出。

【问题讨论】:

【参考方案1】:

数据中的撇号和引号是 SQL 语句或任何模仿 SQL 的 WHERE 子句(OpenForm/OpenReport 和域聚合函数的 WHERE 参数)的问题。 FindRecord 没有这个问题,因为它正在模拟“查找/替换”对话框。删除 Replace() 操作,您的原始代码应该可以工作。它对我有用。示例:DoCmd.OpenForm "Main", , , , , , Me.cbxProd

Private Sub Form_Load()
Me.tbxName.SetFocus
DoCmd.FindRecord Me.OpenArgs
End Sub

可以通过搜索数字 ID 字段来消除问题。

【讨论】:

删除了替换操作。仍然对我不起作用。你能发布对你有用的代码吗? 已编辑答案。也可以使用带有 ID 的 FindRecord。

以上是关于对包含双引号的记录使用 FindRecord的主要内容,如果未能解决你的问题,请参考以下文章

后台传值包含双引号时如何正确显示双引号的问题

Python中的单引号与双引号[关闭]

停止访问将两组双引号写入 csv

用其他东西替换或删除新行,但只能在 CSV 文件上使用 PHP 的单引号或双引号之间

用 \' 或 \" 替换每个单引号/双引号

使用 Python 将包含双引号的参数传递给子进程