【问题标题】:SQL VBA Run-Time Error 3075: Syntax error(missing operator) in query expressionSQL VBA 运行时错误 3075:查询表达式中的语法错误(缺少运算符)
【发布时间】:2015-05-01 16:00:12
【问题描述】:

我正在尝试遵循一组循环 SQL 代码来满足我在 Access 数据库中的特定需求。我遇到了这个错误

运行时错误 3075:查询中的语法错误(缺少运算符) 表达式 'SYRLIB_FLCRDD14.CRARNO=SYRLIB_FPCRDHDR.CHARNO 从 SYRLIB_FLCRDD14 内部连接 ​​SYRLIB_FPCUSMAS 开启 SYRLIB_FLCRDD14.CRCUST=SYRLIB_FPCUSMAS.CNUMBR 来自 SYRLIB_FLCRDD14 INNER JOIN SYRLIB_FPSECFIL on SYRLIB_FLCRDD14.CRCLRK=SYRLIB_FPSECFIL.SECNUM FROM SYRLIB FLCRDD1'.

(对于粗体部分,我认为应该是 SYRLIB_FLCRDD14,我已经搜索了整个代码,所有 23 个匹配项都拼写为“FLCRDD14”,我没有看到“FLCRDD1”。我错过了什么吗? )

感谢您到目前为止的所有评论!我根据以下建议重新编辑并重新粘贴了整套代码。我还去掉了SELECT 周围的括号,并去掉了[Issue by] 后面的逗号。我使用即时窗口并运行新查询。它给出了一个不同的错误:查询表达式'SYRLIB_FLCRDD14.CRCMMT'中的语法错误(缺少运算符)。

Sub RunDistrackData()  'Pulls Customer Rebate Data
'On Error GoTo Err_Handler:

    'DoCmd.SetWarnings False
    'DoCmd.Hourglass True

    Dim rst2 As ADODB.Recordset
    Set rst2 = New ADODB.Recordset
    rst2.Open "[TblDC]", CurrentProject.Connection

    Dim sCHAR As String
    Dim sName As String
    Dim sNUM As String
    Dim SQry As String
    Dim mySQL As String
    Dim qfd As QueryDef
    Dim db As Database
    Set db = CurrentDb
    Dim bTime As Date
    Dim eTime As Date
    'bTime = Now()

    rst2.MoveFirst

    DoCmd.OpenQuery "Clear Data", acViewNormal, acEdit
    Do While Not rst2.EOF

    sCHAR = rst2.Fields("DC CHAR")
    sNUM = rst2.Fields("DCNum")
    sName = rst2.Fields("DCName")


mySQL = "INSERT INTO [Data]([DC],[DC Name],[Customer Type],[Printed Date],[Entered Date],"
mySQL = mySQL & " [Customer Number],[Customer Name],[Transfer Invoice],[Item Number],"
mySQL = mySQL & " [Item Description],[CRTYPE],[Reason for Return],[Dist Return Code Override],"
mySQL = mySQL & " [Qty Returned],[CRRPCS],[CRCRTT],[CRDBCR],[CRINV#],[CRCMMT],"
mySQL = mySQL & " [GEN CMMT1],[GEN CMMT2],[GEN CMMT3],[Issue by])"

mySQL = mySQL & " SELECT " & sNUM & " AS [DC],  '" & sName & "'  AS [DC Name], "

mySQL = mySQL & " " & sCHAR & "LIB_FPCUSMAS.CSBSTY AS [Customer Type], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRCMDT AS [Printed Date], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRPRDT AS [Entered Date], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRCUST AS [Customer Number], "
mySQL = mySQL & " " & sCHAR & "LIB_FPCUSMAS.CLNAME AS [Customer Name], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRARNO AS [Transfer Invoice], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRITEM AS [Item Number], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRDESC AS [Item Description], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRTYPE, "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRRESN AS [Reason for Return], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRDSOV AS [Dist Return Code Override], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRQTSR AS [Qty Returned], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRRPCS, "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRCRTT, "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRDBCR, "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.[CRINV#], "
mySQL = mySQL & " " & sCHAR & "LIB_FLCRDD14.CRCMMT, "
mySQL = mySQL & " " & sCHAR & "LIB_FPCRDHDR.CHCMT1 AS [GEN CMMT 1], "
mySQL = mySQL & " " & sCHAR & "LIB_FPCRDHDR.CHCMT2 AS [GEN CMMT 2], "
mySQL = mySQL & " " & sCHAR & "LIB_FPCRDHDR.CHCMT3 AS [GEN CMMT 3], "
mySQL = mySQL & " " & sCHAR & "LIB_FPSECFIL.SECNAM AS [Issue by] "






'change below to connect FLCRDD14 table to whichever order table adding.  add order details above

mySQL = mySQL & " From " & sCHAR & "LIB_FLCRDD14 INNER JOIN " & sCHAR & "LIB_FPCRDHDR"
mySQL = mySQL & " ON " & sCHAR & "LIB_FLCRDD14.CRARNO = " & sCHAR & "LIB_FPCRDHDR.CHARNO"
mySQL = mySQL & " From " & sCHAR & "LIB_FLCRDD14 INNER JOIN " & sCHAR & "LIB_FPCUSMAS"
mySQL = mySQL & " ON " & sCHAR & "LIB_ FLCRDD14.CRCUST = " & sCHAR & "LIB_FPCUSMAS.CNUMBR"
mySQL = mySQL & " From " & sCHAR & "LIB_FLCRDD14 INNER JOIN " & sCHAR & "LIB_FPSECFIL "
mySQL = mySQL & " ON " & sCHAR & "LIB_FLCRDD14.CRCLRK = " & sCHAR & "LIB_FPSECFIL.SECNUM"


mySQL = mySQL & " FROM " & sCHAR & "LIB_FLCRDD14"
mySQL = mySQL & " WHERE (((" & sCHAR & "LIB_FPGLJNLDBK.CRITEM)"
mySQL = mySQL & " Like '*358300*') "

mySQL = mySQL & " AND ((" & sCHAR & "LIB_FPGLJNLDBK.CRCMDT)"
mySQL = mySQL & " Between [Forms]![Form1]![StartDate] "
mySQL = mySQL & " And [Forms]![Form1]![EndDate]));"

mySQL = mySQL & " AND ((" & sCHAR & "LIB_FPGLJNLDBK.CRRESN)"
mySQL = mySQL & " Like ('*MS*'Or '*RB*'Or '*GR*'))"

mySQL = mySQL & " AND ((" & sCHAR & "LIB_FPGLJNLDBK.CRITEM)>0))"


Debug.Print mySQL

    SQry = "Income" & sCHAR
    Set qfd = db.CreateQueryDef(SQry, mySQL)
    qfd.ODBCTimeout = 9999
    RefreshDatabaseWindow
    DoCmd.OpenQuery "Data" & sCHAR
    db.QueryDefs.Delete (SQry)

    rst2.MoveNext
    Loop

    'add additional queries here
    'DoCmd.OpenQuery "..............."

    DoCmd.OpenQuery "Add MIF Data"


    'DoCmd.SetWarnings True
    'DoCmd.Hourglass False

    rst2.Close
    Set rst2 = Nothing

    'eTime = Now()

    'MsgBox "Report run is completed.  Run Time = " & Format([eTime] - [bTime], "hh:nn:ss")

    End Sub

【问题讨论】:

  • 请提供 mySQL 变量的最终值。我们无法从代码 sn-p 中确定这一点(顺便说一句,它是不完整的)。
  • 去掉最后一行的逗号[Issue by],?
  • 不要将 SQL 关键字括起来……这是错误的:[SELECT]
  • 应@PittsburghDBA 的要求,请向我们展示Access 为Debug.Print mySQL 显示的内容
  • SELECT 在括号中是一个问题。尽管如此,检查 mySQL 的最终值仍然很好。

标签: sql ms-access vba


【解决方案1】:

在此答案的最后,我粘贴了从您的代码主循环创建的第一个 INSERT 语句的全文。

由于我的数据库副本无法连接到您的 ODBC 数据源,因此我无法测试该语句。

但是我可以看到几个问题:

  1. SELECT 字段列表中的 SYRLIB_FLCRD 在下一个字段之前缺少逗号。
  2. 我不确定 SYRLIB_FLCRD 是什么。它看起来像是表名的片段,后面没有实际的字段名。
  3. 多个FROM 子句。
  4. WHERE 子句中间的杂散分号 (;)
  5. Like ('*MS*'Or '*RB*'Or '*GR*') 在 Access SQL 中无效

这些可能不是所有的错误。但它们足以让我相信你现在应该忘记 VBA 代码。只专注于查询。使用SELECT 进行设计和测试。完成该工作后,将其修改为INSERT

只有在你有一个INSERT 之后才返回到 VBA 代码,它可以正确执行并执行你需要它做的事情。


INSERT INTO [Data]
    (
        [DC],
        [DC Name],
        [Customer Type],
        [Printed Date],
        [Entered Date],
        [Customer Number],
        [Customer Name],
        [Transfer Invoice],
        [Item Number],
        [Item Description],
        [CRTYPE],
        [Reason for Return],
        [Dist Return Code Override],
        [Qty Returned],
        [CRRPCS],
        [CRCRTT],
        [CRDBCR],
        [CRINV#],
        [CRCMMT],
        [GEN CMMT1],
        [GEN CMMT2],
        [GEN CMMT3],
        [Issue by]
    )
SELECT
    3 AS [DC],
    'SYRACUSE'  AS [DC Name],
    SYRLIB_FPCUSMAS.CSBSTY AS [Customer Type],
    SYRLIB_FLCRDD14.CRCMDT AS [Printed Date],
    SYRLIB_FLCRDD14.CRPRDT AS [Entered Date],
    SYRLIB_FLCRDD14.CRCUST AS [Customer Number],
    SYRLIB_FPCUSMAS.CLNAME AS [Customer Name],
    SYRLIB_FLCRDD14.CRARNO AS [Transfer Invoice],
    SYRLIB_FLCRDD14.CRITEM AS [Item Number],
    SYRLIB_FLCRDD14.CRDESC AS [Item Description],
    SYRLIB_FLCRDD14.CRTYPE,
    SYRLIB_FLCRDD14.CRRESN AS [Reason for Return],
    SYRLIB_FLCRDD14.CRDSOV AS [Dist Return Code Override],
    SYRLIB_FLCRDD14.CRQTSR AS [Qty Returned],
    SYRLIB_FLCRDD14.CRRPCS,
    SYRLIB_FLCRDD14.CRCRTT,
    SYRLIB_FLCRDD14.CRDBCR,
    SYRLIB_FLCRDD14.[CRINV#],
    SYRLIB_FLCRD
    D14.CRCMMT,
    SYRLIB_FPCRDHDR.CHCMT1 AS [GEN CMMT 1],
    SYRLIB_FPCRDHDR.CHCMT2 AS [GEN CMMT 2],
    SYRLIB_FPCRDHDR.CHCMT3 AS [GEN CMMT 3],
    SYRLIB_FPSECFIL.SECNAM AS [Issue by]
From SYRLIB_FLCRDD14 INNER JOIN SYRLIB_FPCRDHDR ON SYRLIB_FLCRDD14.CRARNO = SYRLIB_FPCRDHDR.CHARNO
From SYRLIB_FLCRDD14 INNER JOIN SYRLIB_FPCUSMAS ON SYRLIB_ FLCRDD14.CRCUST = SYRLIB_FPCUSMAS.CNUMBR
From SYRLIB_FLCRDD14 INNER JOIN SYRLIB_FPSECFIL  ON SYRLIB_FLCRDD14.CRCLRK = SYRLIB_FPSECFIL.SECNUM
FROM SYRLIB_FLCRDD14
WHERE
    (((SYRLIB_FPGLJNLDBK.CRITEM) Like '*358300*')
    AND ((SYRLIB_FPGLJNLDBK.CRCMDT)
    Between [Forms]![Form1]![StartDate] And [Forms]![Form1]![EndDate])); AND ((SYRLIB_FPGLJNLDBK.CRRESN)
    Like ('*MS*'Or '*RB*'Or '*GR*')) AND ((SYRLIB_FPGLJNLDBK.CRITEM)>0))

【讨论】:

  • 非常感谢,HansUp!我会听取您的建议并继续进行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多