繁体   English   中英

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

[英]syntax error (missing operator) in query expression - VBA and Access

我使用以下语法构建查询:

SELECT e.codigo AS `Código`,
       e.razao_social AS `Razão Social`,
       e.grupo AS `Grupo`,
       e.tributacao AS `Tributação`,
       e.sistema AS `Sistema`,
       r.nome AS `Responsável`,
       date_format(t.competencia, '%m/%Y') AS `Competência`,
       s.nome AS `Status`,
       c.nome AS `Tipo Conferência`
FROM tarefa AS t
RIGHT JOIN empresa AS e ON t.id_empresa = e.id_empresa
LEFT JOIN responsavel AS r ON t.id_responsavel = r.id_responsavel
LEFT JOIN status AS s ON t.id_status = s.id_status
LEFT JOIN conferencia AS c ON t.id_conferencia = c.id_conferencia
WHERE c.nome = 'Encerramento Contábil'
ORDER BY `Competencia`;

我在 MariaDB 中做了一个测试查询,它成功了。

现在,我使用 VBA MSExcel 在 Access 中使用此查询,它在表之间具有相同的结构和关系,但返回错误。

消息错误 vba:

表达式“t.id_empresa = e.id_empresa LEFT JOIN responsavel AS r ON t.id_respons”中的语法错误(缺少运算符)

这是我的代码 vba MSExcel:

Sub testSql()

'Creating objects of Connection and Recordset
Dim conn As New Connection, rec As New Recordset
Dim DBPATH, PRVD, connString, query As String

    'Declaring fully qualified name of database. Change it with your database's location and name.
    DBPATH = "C:\Users\ctb06\Documents\Database2.accdb"
    
    'This is the connection provider. Remember this for your interview.
    PRVD = "Microsoft.ace.OLEDB.12.0;"
    
    'This is the connection string that you will require when opening the the connection.
    connString = "Provider=" & PRVD & "Data Source=" & DBPATH
    
    'opening the connection
    conn.Open connString
    
    'the query I want to run on the database.
    query = "SELECT e.codigo AS `Código`, e.razao_social AS `Razão Social`, e.grupo AS `Grupo`, e.tributacao AS `Tributação`, e.sistema AS `Sistema`, r.nome AS `Responsável`, date_format(t.competencia, '%m/%Y') AS `Competência` FROM tarefa AS t RIGHT JOIN empresa AS e ON t.id_empresa = e.id_empresa LEFT JOIN responsavel AS r ON t.id_responsavel = r.id_responsavel;"
        
    'running the query on the open connection. It will get all the data in the rec object.
    rec.Open query, conn
    
    'clearing the content of the cells
    Range("a1").Select
    Cells.ClearContents
    
    If (rec.RecordCount <> 0) Then
        col = 1
        For Each resp In rec.Fields
        
            With Cells(1, col)
                .Value = resp.Name
            End With
            
            col = col + 1
        
        Next resp
        
        Cells(2, 1).CopyFromRecordset rec
    
    End If
    

    rec.Close
    conn.Close
    

End Sub

我在哪里失踪?

没有两个 SQL 方言是完全相同的,以实现精确的可转移性。 Simply, MariaDB's SQL will not perfectly align to MS Access' SQL similar to running same query from Oracle to Postgres, MySQL to SQL Server, Sybase to DB2... There will need to be some translation.

具体来说:

  • DATE_FORMAT在 MS Access 中不是可用的 function。 而是使用具有不使用%的适当格式模式的FORMAT

  • 在 MS Access 中,不止一个JOIN需要括号括起来。 但是, RIGHT JOINLEFT JOIN的混合可能需要嵌套连接。

    (诚然,对于使用查询设计器而不是 SQL 构建复杂查询的新 Access 用户来说,这是一个令人沮丧的要求。我提出了这个建议的更改,其中包括 Access 的 SQL 方言。)

  • 幸运的是,MS Access 支持反引号,尽管方括号[...]是使用特殊字符或关键字转义标识符的更流行的形式。

考虑以下调整:

SELECT e.codigo AS `Código`,
       e.razao_social AS `Razão Social`,
       e.grupo AS `Grupo`,
       e.tributacao AS `Tributação`,
       e.sistema AS `Sistema`,
       r.nome AS `Responsável`,
       FORMAT(t.competencia, 'mm/yyyy') AS `Competência`,
       s.nome AS `Status`,
       c.nome AS `Tipo Conferência`
FROM ((((empresa AS e 
RIGHT JOIN tarefa AS t ON t.id_empresa = e.id_empresa)
LEFT JOIN responsavel AS r ON t.id_responsavel = r.id_responsavel)
LEFT JOIN status AS s ON t.id_status = s.id_status)
LEFT JOIN conferencia AS c ON t.id_conferencia = c.id_conferencia)
WHERE c.nome = 'Encerramento Contábil'
ORDER BY `Competencia`;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM