通过excel VBA

时间:2017-08-21 12:05:47

标签: mysql vba prepared-statement string-concatenation

我在Mysql中编写了一个准备好的语句,它根据当前日期动态创建周列。当我在Toad for Mysql中运行查询时,它无缝地工作,当我尝试将查询转换为VBA中的字符串时,我遇到了运行查询的巨大问题......我得到一个错误,说明我有与sql相近的语法问题。尽管字符串看起来很好,但是在sql的每个部分都创建了错误。我接受了#34;与chr(34),或'使用chr(39),我仍然得到sql语法的错误。我还尝试通过导入导入.sql文件的代码来避免这些字符串问题。

    Sub TopAway()
    Dim Cnn As Object
    Dim Rst As Object
    Dim ConnectionString, SqlTextFile, SqlStatement As String
    Set Cnn = CreateObject("ADODB.Connection")
    Set Rst = CreateObject("ADODB.Recordset")

    Application.ScreenUpdating = False

    ThisWorkbook.Sheets("Summary").Range("A2:T3000").ClearContents

    ConnectionString = "Driver={MySQL ODBC 5.3 Unicode Driver};Server =  10.1.1.201; Database = cms; Uid = root; Pwd = something;"

   Cnn.Open ConnectionString
   Cnn.CommandTimeout = 900

   SqlTextFile = "C:\Users\adam\Desktop\WORK FOLDER\Tony Project\Analysis Projects\Away_No_Stock\Dynamic_Away.sql"
   Debug.Print SqlTextFile
   Dim hFile As Long
   hFile = FreeFile
   Open SqlTextFile For Input As #hFile
   SqlStatement = Input$(LOF(hFile), hFile)
   Close #hFile
   Debug.Print SqlStatement

   Rst.Open SqlStatement, Cnn '<-- This is where the code fails

   Sheets("Summary").Range("B3").CopyFromRecordset Rst
   End Sub

SQL代码低于.....

    SELECT
    GROUP_CONCAT(DISTINCT
    CONCAT("SUM(IF((part_id IN (265,302,647) OR notes REGEXP ('away|unfit|unavailable|bus away|night')) && WEEKOFYEAR(job_engineerdate) = '", WEEKOFYEAR(job_engineerdate) , "' , 1 ,0)) AS '", WEEKOFYEAR(job_engineerdate), "'")
    )
    INTO @answers
    FROM (
    SELECT DISTINCT (job_engineerdate)
    FROM job j                          
    ORDER BY (job_engineerdate) ASC
    ) A
    WHERE job_engineerdate >= CURDATE() - INTERVAL 112 DAY AND job_engineerdate <= CURDATE();


    SET @query =  CONCAT("SELECT customer_name, garage_name, ", @answers, " 
    FROM (
    SELECT c.customer_name, g.garage_name, j.id, jp.part_id, jn.notes, j.job_engineerdate

    FROM job j 
    INNER JOIN vehicle v ON j.job_vehicleid = v.id 
    INNER JOIN garage g ON v.garage_id = g.id 
    INNER JOIN customer c ON g.customer_id = c.id 
    INNER JOIN fault_type ft ON j.job_fault = ft.id
    INNER JOIN job_parts jp ON j.id = jp.job_id 
    INNER JOIN part p ON p.id = jp.part_id 
    INNER JOIN job_notes jn ON j.id = jn.job_id 
    INNER JOIN users u ON j.job_engineer = u.id         

    WHERE
    c.customer_group IN (13) AND
    j.deleted = 0 
    AND j.job_engineerdate >= CURDATE() - INTERVAL 112 DAY

    GROUP BY
    v.vehicle_fleet_number, v.id, j.id, jp.part_id, jn.id

    ORDER BY customer_name, garage_name
    ) AS T
    GROUP BY customer_name, garage_name
    ORDER BY 18 DESC
    LIMIT 15") 
    ;

    PREPARE stmt FROM @query;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;

我不知道如何让这项工作通过excel,如果有人有任何想法,我将非常感激!我花了很长时间在网上寻找答案,但一直无法找到解决这个问题的方法。提前谢谢!

1 个答案:

答案 0 :(得分:0)

我还解决了如何在Excel(VBA)中翻译sql预处理语句的问题,最后我在VBA中编写了一个例程来构建与预编译语句构建相同的sql语句。 最后,准备好的声明是一个&#34;程序&#34;你应该没有问题在VBA代码中进行翻译。 希望它可以帮到你(即使我没有设法编写与你的案例相关的VBA代码)......