MS Access:SQL语句;更新;给出模糊错误3144“;UPDATE语句中的语法错误;

MS Access:SQL语句;更新;给出模糊错误3144“;UPDATE语句中的语法错误;,sql,database,vba,ms-access,Sql,Database,Vba,Ms Access,我当前正在运行一个链接到表的窗体,其中窗体中显示的一个控件依赖于另一个控件。具体而言,这是一个名为机器挖掘的字段,需要是用户在手动挖掘字段中输入百分比的剩余百分比。这些字段与从另一个控件中指定的特定记录相关,格式为挖掘类型。例如,如果我将30%输入到手动挖掘中,则机器挖掘需要为70%。我创建了一段代码,在执行手动挖掘控件中的AfterUpdate事件时,该代码将使用VBA中的RunSQL方法将其存储在基础表中: Private Sub Text_HandExcvPerc_AfterUpdate(

我当前正在运行一个链接到表的窗体,其中窗体中显示的一个控件依赖于另一个控件。具体而言,这是一个名为机器挖掘的字段,需要是用户在手动挖掘字段中输入百分比的剩余百分比。这些字段与从另一个控件中指定的特定记录相关,格式为挖掘类型。例如,如果我将30%输入到手动挖掘中,则机器挖掘需要为70%。我创建了一段代码,在执行手动挖掘控件中的AfterUpdate事件时,该代码将使用VBA中的RunSQL方法将其存储在基础表中:

Private Sub Text_HandExcvPerc_AfterUpdate()

DoCmd.RunSQL ("UPDATE tbl-ExcavationType SET [Machine Excavation] = 1 - [Hand Excavation] WHERE [Excavation Type] = Text_ExcvType.Value;") End Sub

tbl EXCUAVATIONTYPE是链接到表单的表,Text\u EXCUVTYPE。Value是包含当前记录标识符的文本框控件。有人能评论一下我的DoCmd.RunSQL的语法吗?我一直收到一个错误。

您在这里看到的似乎是一个计算字段:即[机器挖掘]始终是1-[手动挖掘],因此我不明白您为什么需要存储它。也就是说,您需要用名为Text_exvtype的控件中的实际值替换单词“Text_exvtype.Value”,而当它位于语音标记内时,它不能这样做。试一试

dim strsql as string

strsql = "UPDATE tbl-ExcavationType SET [Machine Excavation] = "

strsql = strsql & "1 - [Hand Excavation] WHERE [Excavation Type] = '"

strsql = strsql & Text_ExcvType.Value & "';" 

DoCmd.RunSQL strsql
这允许访问首先计算Text_exvtype.Value,将结果放入字符串,然后执行sql 这样做还可以让您观察调试中的字符串构建,找出错误所在

DoCmd.RunSQL ("UPDATE [tbl-ExcavationType] SET [Machine Excavation] = " & _
    "1 - [Hand Excavation] WHERE [Excavation Type] = """ & Text_ExcvType.Value & """;")
请注意,文本框值周围有三个引号。Access对字符串使用双引号而不是单引号。因为您是在字符串中输入的,所以必须使用两个双引号来表示字符串的单双引号,然后使用另一个双引号来打断字符串以连接您的值。系统将有效地看到以下内容:

UPDATE [tbl-ExcavationType] SET [Machine Excavation] = 1 - [Hand Excavation] WHERE [Excavation Type] = "My Data Value";

您有几个问题:

  • 您需要将表名用括号括起来,因为它包含一个
    -
  • 您需要将文本值括在单引号(
    )或双引号(
    )中
  • 您需要在查询中添加
    Text\u exvtype.value
    的值,而不是字符串
    “Text\u exvtype.value”
  • 我已经测试了以下功能:

    Private Sub Text_HandExcvPerc_AfterUpdate()
        DoCmd.RunSQL "UPDATE [tbl-ExcavationType] SET [Machine Excavation] = 1 - [Hand Excavation] WHERE [Excavation Type] = '" & Text_ExcvType.Value "';"
    End Sub
    

    (a)
    Text\u exvtype.Value
    是指SQL语句的一部分,还是指
    WHERE[decultation Type]=“&Text\u exvtype.Value&”
    ?(b) 我不确定,但是
    tbl-excuvationtype
    可能需要放在括号中,即
    [tbl-excuvationtype]
    。是的,这就是我对Text\u-excuvtype.Value的意思,但即使使用了下面Harrassed-Dad给出的正确语法,它仍然不起作用。首先,感谢您的回复。我使用了您的代码,但是会弹出相同的错误,调试会突出显示字符串已连接的最后一行。不知道还能是什么。。。关于第一个问题,只有查询允许您输入计算。我可以使用验证规则,但它不会自动填充单元格。这不起作用。你的意思是在那里的某个地方放一组单引号吗?另外,是否有其他方法可以通过使用来自另一个字段但相同指定记录的值进行计算,将值输入到表中?我尝试使用验证规则,但这不会自动填充,只是限制输入。Access使用双引号,而不是单引号,所以这不应该是问题所在。它给你的是完全相同的错误吗?是的错误3144非常模糊的东西。有没有办法只调试SQL?只需进行一次快速虚拟检查,确保表名和字段名拼写正确。另外,如果你使用了我输入的换行符,请确保输入的格式正确。您还可以尝试将SQL语句设置为字符串,并使用Debug.Print确保其结果与I show.FWIW一样。Access接受文本值周围的单引号或双引号。