【问题标题】:VBA code will not update table field from form inputVBA 代码不会从表单输入更新表字段
【发布时间】:2015-04-07 01:31:54
【问题描述】:

我正在尝试构建一个表单,以根据表单中的客户输入更新表中的字段。该表单有一个条件字段,用于搜索匹配条目,然后是一个更新字段以更新另一个表字段。我的问题是,当我引用表单中的字段时,我无法使更新生效。代码如下:

Dim db As Database
Dim strSQL As String
Set db = CurrentDb
Dim uiTAGNAME As String
Dim uoX_NAM As String

Forms![Prefill Xmtr Data]!TxtCPointTagname.SetFocus
uiTAGNAME = Forms![Prefill Xmtr Data]!TxtCPointTagname.Text

Forms![Prefill Xmtr Data]!TxtQTransmitter.SetFocus
uoX_NAM = Forms![Prefill Xmtr Data]!TxtQTransmitter.Text

Debug.Print uiTAGNAME
Debug.Print uoX_NAM

'no error, but no update
db.Execute "UPDATE [IO Data] SET [io data].x_nam = '  uoX_NAM ' " & _
    "WHERE [IO Data].tagname Like 'bkr7*';"

当我设置中断时,我可以查看uoX_NAM 的值,并且它是从表单正确更新的。

我很确定我的表单字段引用不正确,但我尝试了各种其他方法,但都没有更新表格。

如果我尝试以下代码,正确的字段会更新,但它不是表单中的条目:

'this updates the correct fields
db.Execute "UPDATE [IO Data] SET [io data].x_nam = 'BRKRCMD'" & _
    "WHERE [IO Data].tagname Like 'bkr7*';"

所以我的问题似乎在于我如何引用uoX_NAM 变量。

【问题讨论】:

    标签: ms-access vba


    【解决方案1】:

    每当您执行在代码中动态构建的 SQL 时,请帮自己一个忙:将其存储在一个字符串中并在运行之前调试。打印该字符串。我看到你已经声明了strSQL,但你没有使用它!

    'current code:
    strSQL = "UPDATE [IO Data] SET [io data].x_nam = '  uoX_NAM ' " & _
        "WHERE [IO Data].tagname Like 'bkr7*';"
    Debug.Print strSQL
    db.Execute strSQL
    

    将打印并运行:

    UPDATE [IO Data] SET [io data].x_nam = '  uoX_NAM ' WHERE [IO Data].tagname Like 'bkr7*';
    

    您当前的代码更改将字段设置为文字文本uoX_NAM,就像您的第二个代码块将字段设置为文字文本BRKRCMD。要插入变量的值,而不是其名称,变量名称必须在任何引号之外并由&s 连接,如下所示:

    strSQL = "UPDATE [IO Data] SET [io data].x_nam = '" & uoX_NAM & "'" & _
        "WHERE [IO Data].tagname Like 'bkr7*';"
    Debug.Print strSQL
    db.Execute strSQL
    

    将打印并运行:

    UPDATE [IO Data] SET [io data].x_nam = 'YOUR VALUE HERE' WHERE [IO Data].tagname Like 'bkr7*';
    

    此外,您可以通过引用控件的 Value 而不是 Text 属性更直接地设置变量,而无需 SetFocus。由于 Value 是默认属性,您甚至可以省略 .Value 并仅引用控件名称:

    uiTAGNAME = Forms![Prefill Xmtr Data]!TxtCPointTagname
    uoX_NAM = Forms![Prefill Xmtr Data]!TxtQTransmitter
    

    【讨论】:

    • 一定是我做错了什么。我已经对您的建议尝试了几种变体,但表格仍未更新 - 我对最后一行寄予厚望,但我没有尝试过。
    • 另外,如果我尝试按照您的建议直接设置变量,我仍然会遇到错误。“除非控件具有焦点,否则您无法引用控件的属性或方法。”表单字段未绑定。我知道我之前遗漏了它,但代码是通过按下按钮启动的。
    • 现在您已将 SQL 打印到调试窗口中,将其复制到剪贴板上。创建一个新查询,将其切换到 SQL 视图,然后将 SQL 粘贴到窗口中。如果您随后运行更新查询,您可能会收到更具体的错误消息。如果以这种方式没有错误消息但也没有结果,请将 SQL 更改为 SELECT 查询(没有 UPDATE 部分)并确认与 where 条件匹配的行数。没有通过 where 选择行意味着目标表中没有变化并且没有错误消息..
    • 这是一个很好的建议。我收到“由于密钥违规而没有更新”错误。此代码与更新字段的代码几乎相同[code] db.Execute "UPDATE [IO Data] SET [io data].x_nam = 'BRKRCMD'" & _ "WHERE [IO Data].tagname Like 'bkr7* ';"[/code]
    • 这表明表 [IO Data] 上有一个索引,该索引不允许某些字段或字段组合中的重复。您的表中已经有与键组合匹配的记录 - 您无法更改您选择的记录,因为它们将成为您拥有的任何键的第二个版本。
    【解决方案2】:

    首先,感谢您的帮助,Pteranodon 的建议使我得到了答案。我正在使用的数据库正在链接数据库中进行更改。无论如何,与我没想到的另一张桌子有关系。这导致了密钥违规。

    【讨论】:

      猜你喜欢
      • 2015-02-16
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      相关资源
      最近更新 更多