访问表单 - 查询表达式中的语法错误(缺少运算符)

Posted

技术标签:

【中文标题】访问表单 - 查询表达式中的语法错误(缺少运算符)【英文标题】:Access Form - Syntax error (missing operator) in query expression 【发布时间】:2014-02-07 20:15:43 【问题描述】:

我在通过查询创建的表单中收到语法错误。我创建了表单来限制对更改记录的访问。尝试在表单上设置过滤器时,我收到尝试过滤的所有属性的语法错误。我相信这与查询代码中内部连接周围缺少() 有关,但对我来说奇怪的是我可以毫无问题地过滤查询。下面是查询代码:

SELECT CUSTOMER.[Product Number], SALESPERSON.[Salesperson Number],
SALESPERSON.[Salesperson Name], SALESPERSON.[Email Address]
FROM SALESPERSON INNER JOIN CUSTOMER ON
SALESPERSON.[Salesperson Number] = CUSTOMER.[Salesperson Number];

任何想法为什么只有表单会产生语法错误,或者如何解决这个问题?

【问题讨论】:

由于查询只包含一个连接,所以() 不是必需的。我最好的猜测是查询不是问题的原因。这一定是由于您用于设置过滤器的方法或过滤器表达式字符串的问题。 您可以通过在查询设计器中测试 SQL 来消除查询。 您发布的查询似乎运行良好。我认为您需要与我们分享的正是您尝试过滤记录的方式。请发布确切的语法和示例。 查询工作正常,完全没有过滤器问题。至于我如何尝试过滤,在我单击每个属性的下拉箭头的表单中,这是我收到错误的时候。我还注意到,一旦打开,下拉列表中的记录就没有列出任何数据。我发现我可以通过右键单击填充的单元格进行过滤。 【参考方案1】:

我可以通过进入表单的设计视图并将 [] 放在任何有空格的字段名称周围来快速修复它。我现在可以使用内置过滤器,而不会出现关于语法问题的烦人弹出窗口。

【讨论】:

这解决了我的问题。谢谢你的提示。【参考方案2】:

我遇到了同样的问题。 正如 Dedren 所说,问题不在于查询,而在于表单对象的控制源。在每个对象控制源周围放置 []。例如:Contol Source: [Product number]Control Source: Salesperson.[Salesperson number]

Makita 建议转到您在查询中引用的原始表并重命名该字段以便没有空格,例如:SalesPersonNumberProductNumber 等。这也将解决许多未来的问题。祝你好运!

【讨论】:

我不知道为什么人们对你投反对票,这实际上解决了我的问题,谢谢。 另外,取出其中的SalesPerson部分并将Number更改为IDSalesperson number 应改为简单的 ID Salesperson phone number => PhoneNumberPhone【参考方案3】:

尝试通过删除空格使字段名称合法。这是一个长远的目标,但实际上它以前对我有帮助。

【讨论】:

在查询中尝试过,但没有成功。 这对我有用,我用下划线替换了空格 是的。这。不过,不要用 _ 代替。将每个单词大写。 phone number 变为 PhoneNumber 或简单地为 Phone【参考方案4】:

不,不,不。

这些答案都是错误的。你的大脑中存在根本性的知识缺失,我现在要弥补。

您的主要问题是您的命名方案。它很冗长,包含不受欢迎的字符,而且非常不一致。

首先:名为Salesperson 的表不需要将表中的每个字段都称为Salesperson.Salesperson numberSalesperson.Salesperson email。您已经在表中Salesperson。此表中的所有内容都与Salesperson 有关。你不必一直说。

改为使用IDEmail。不要使用Number,因为这可能是一个保留字。在数据库的生命周期内,您真的努力在每个字段名称周围键入 [] 吗?

名为Student 的表上的主键可以是IDStudentID,但要保持一致。外键只能由它指向的表命名,后跟ID。例如:Student.IDAppointment.StudentIDID 总是大写。我不在乎你的 IDE 是否告诉你不要这样做,因为除了你的 IDE 之外的任何地方都是ID。连Access都喜欢ID

第二:为所有字段命名时不要使用空格或特殊字符,并尽可能保持简短,如果它们与保留字冲突,请另找一个字。

而不是:phone number 使用 PhoneNumber 或者更好,更简单的是 Phone。如果您选择what time user made the withdrawal,则每次都必须输入。

第三个:这是最重要的一个:无论您选择何种命名方案,始终保持一致。您应该可以说:“我需要该表中的邮政编码;它的名称将是 PostalCode。”您应该知道这一点,甚至不必查找它,因为您的命名约定是一致的。

回顾:简洁,不冗长。保持名称简短,没有空格,不要重复表名,不要使用保留字,并且每个单词都大写。最重要的是,保持一致。

我希望你接受我的建议。这是正确的做法。我的答案是正确的。在这个星球上的余生中,你应该对你的命名方案非常迂腐到绝对痴迷的程度

注意:您实际上必须在表的设计视图和查询中更改字段名称。

【讨论】:

或者总结一下:Guidelines for naming【参考方案5】:

将 [] 放在任何有空格的字段名称周围(如 Dreden 所说)并保存您的查询,关闭它并重新打开它。

使用 Access 2016,在我在任何字段名称周围添加 [] 后,我仍然收到有关新查询的错误消息...直到保存查询。

一旦查询被保存(并且在对象列表中可见)、关闭并重新打开,错误消息就会消失。这似乎是 Access 的一个错误。

【讨论】:

没有。不要把 [] 放在它周围。你会到处这样做。去掉空格、特殊字符、表名(如Salesperson.Salesperson number),不要使用保留关键字,也不必在所有内容周围加上[]。 我尝试删除空格......但我仍然看到同样的问题正在弹出......不确定代码中是否做错了什么?查询表达式“AutoID=”中的这一行语法错误(缺少运算符)总是很糟糕 我认为这是 2013 版中也存在的 Access 错误(因此不太可能修复)。现在有好几次我一直在查询设计器中,当我查看查询而不保存它时,如果我尝试过滤列,则会出现此错误。在我保存它并重复相同的步骤后,没有错误。可能与列/字段名称中的空格有关,但尚未确定。【参考方案6】:

我确实通过进入相同表单的主表的“设计视图”并在任何有空格的字段名称之间放置 underline (_) 来快速修复它。我现在可以使用内置过滤器,而不会出现关于语法问题的烦人弹出窗口。

【讨论】:

只需取出_并将每个单词大写即可。使名称简短,不要重复表名。越短越好。我们不想伤害您一遍又一遍地打字的可怜的手指。【参考方案7】:

额外的 ( ) 括号可能会在 else if flow 中产生问题。这也会在查询表达式中产生语法错误(缺少运算符)。

【讨论】:

【参考方案8】:

我在 Recordsource 是动态的表单上使用了这个。

Sql 没问题,解决方法是捕获错误!

Private Sub Form_Error(DataErr As Integer, Response As Integer)
'    Debug.Print DataErr

    If DataErr = 3075 Then
        Response = acDataErrContinue
    End If

End Sub

【讨论】:

【参考方案9】:

大家都面临着类似的问题,这是我的完整代码

请让我知道我哪里出错了。 错误信息: 查询表达式“AutoID=”中的语法错误(缺少运算符)

只有当我点击登录而没有在组合框和密码字段中输入任何 txt 时才会发生这种情况。

    Option Compare Database
Option Explicit

Private Sub Login_Click()

If IsNull(Me.ComboUserSelect.Value) Then
    MsgBox "Please select username", vbInformation, "Login ID Required"
    Me.ComboUserSelect.SetFocus
ElseIf IsNull(Me.txtpassword.Value) Then
    MsgBox "please enter password", vbInformation, "Password is Required"
    Me.txtpassword.SetFocus
End If

'============= Declaring the variables ==========='
Dim passwordindatabase As String
Dim typedpassword As String
Dim useraccesstype As String


passwordindatabase = DLookup("Password", "LoginDB", "AutoID=" & ComboUserSelect.Value)
typedpassword = txtpassword.Value
useraccesstype = DLookup("AccessType", "LoginDB", "AutoID=" & ComboUserSelect.Value)


If typedpassword = passwordindatabase Then
    If useraccesstype = "Admin" Then
    DoCmd.OpenForm ("Cam Infra")
    DoCmd.Close acForm, "Login_Form", acSaveNo
    Else
    If useraccesstype = "user" Then
    DoCmd.OpenForm ("Custom_Search_Form")
    DoCmd.Close acForm, "Login_Form", acSaveNo
    End If
    End If
    End If
    

End Sub

【讨论】:

以上是关于访问表单 - 查询表达式中的语法错误(缺少运算符)的主要内容,如果未能解决你的问题,请参考以下文章

查询表达式中的语法错误(缺少运算符)“

在 MS Access 中的查询表达式中出现语法错误(缺少运算符)

语句中的查询表达式中的语法错误(缺少运算符)

查询表达式中的语法错误(缺少运算符)

查询表达式中的语法错误(缺少运算符) - ASP.NET

Access 2010:查询表达式中的语法错误(缺少运算符)