簡體   English   中英

運行時錯誤:為datepart指定了無效的參數1-VBA-SQL

[英]Run-time error: Invalid parameter 1 specified for datepart - VBA - SQL

我正在Excel VBA中運行一些代碼,該代碼查詢數據庫,然后將數據導入Excel進行格式化。

上次運行它(那個老栗子)效果很好,但是今天我來運行月度報告,它拋出datepart錯誤,因為

為datepart指定的參數1無效

這是代碼:

    StrQuery = "SELECT dbo_MANUFACTURER.COMPANY_NAME AS BRAND, dbo_COMPANY.COMPANY_NAME, dbo_AGENTS.SHORT_DESC AS AGENT, dbo_STOCK_SUB_TYPE.SHORT_DESC AS [STOCK TYPE], Replace(Replace(dbo_COMPANY.CURRENCY_ID,'110','EURO'),'1','GBP') AS [CURRENCY]," & _
    "Sum(([Unit_Net]*[QTY_SOLD])-[DELIVERY_TOTAL]) AS [NET TOTAL], dbo_SORDER.DATE_CREATED, dbo_SORDER.SORDER_CODE FROM (((((dbo_COMPANY INNER JOIN dbo_SORDER ON dbo_COMPANY.COMPANY_ID = dbo_SORDER.COMPANY_ID) INNER JOIN " & _
    "dbo_SORDER_ITEM ON dbo_SORDER.SORDER_ID = dbo_SORDER_ITEM.SORDER_ID) INNER JOIN dbo_STOCK ON dbo_SORDER_ITEM.STOCK_ID = dbo_STOCK.STOCK_ID) INNER JOIN dbo_STOCK_SUB_TYPE ON dbo_STOCK.SSTYPE_ID = dbo_STOCK_SUB_TYPE.SSTYPE_ID) INNER JOIN " & _
    "dbo_AGENTS ON dbo_COMPANY.AGENT_ID = dbo_AGENTS.AGENT_ID) INNER JOIN dbo_MANUFACTURER ON dbo_STOCK.MANUF_ID = dbo_MANUFACTURER.MANUF_ID GROUP BY dbo_MANUFACTURER.COMPANY_NAME, dbo_COMPANY.COMPANY_NAME, dbo_AGENTS.SHORT_DESC, " & _
    "dbo_STOCK_SUB_TYPE.SHORT_DESC, dbo_SORDER.DATE_CREATED, dbo_SORDER.SORDER_CODE, dbo_COMPANY.CURRENCY_ID, dbo_STOCK.MANUF_ID HAVING (((dbo_STOCK_SUB_TYPE.SHORT_DESC) <> " & "'EMBROIDERY'" & ") And ((Year([DATE_CREATED]) * 12 + " & _
    "DatePart(" & "'m'" & ", [DATE_CREATED])) = Year(Date) * 12 + DatePart(" & "'m'" & ", Date) - 1)) ORDER BY dbo_COMPANY.COMPANY_NAME, dbo_SORDER.DATE_CREATED;"

對於冗長的文字,我們深表歉意。
如前所述,代碼引發錯誤:為日期部分指定了無效的參數1。 我已經嘗試過按照論壇帖子中提到的某人轉換日期,但是沒有成功。

如果有人有什么好主意!

編輯:

在Access中刪除日期部分中m周圍的引號不起作用。 它彈出,要求輸入m的值。我在Access中使用的SQL查詢工作正常,我在下面添加了它:

SELECT 

 dbo_MANUFACTURER.COMPANY_NAME AS BRAND, dbo_COMPANY.COMPANY_NAME,
 dbo_AGENTS.SHORT_DESC AS AGENT, dbo_STOCK_SUB_TYPE.SHORT_DESC AS [STOCK TYPE], Replace(Replace(dbo_COMPANY.CURRENCY_ID,'110','EURO'),'1','GBP') AS [CURRENCY], Sum(([Unit_Net]*[QTY_SOLD])-[DELIVERY_TOTAL]) AS [NET TOTAL], dbo_SORDER.DATE_CREATED, dbo_SORDER.SORDER_CODE

FROM 

 (((((dbo_COMPANY INNER JOIN dbo_SORDER ON dbo_COMPANY.COMPANY_ID = dbo_SORDER.COMPANY_ID) INNER JOIN dbo_SORDER_ITEM ON dbo_SORDER.SORDER_ID = dbo_SORDER_ITEM.SORDER_ID) INNER JOIN dbo_STOCK ON dbo_SORDER_ITEM.STOCK_ID = dbo_STOCK.STOCK_ID) INNER JOIN dbo_STOCK_SUB_TYPE ON dbo_STOCK.SSTYPE_ID = dbo_STOCK_SUB_TYPE.SSTYPE_ID) INNER JOIN dbo_AGENTS ON dbo_COMPANY.AGENT_ID = dbo_AGENTS.AGENT_ID) INNER JOIN dbo_MANUFACTURER ON dbo_STOCK.MANUF_ID = dbo_MANUFACTURER.MANUF_ID

GROUP BY 

 dbo_MANUFACTURER.COMPANY_NAME, dbo_COMPANY.COMPANY_NAME, dbo_AGENTS.SHORT_DESC, dbo_STOCK_SUB_TYPE.SHORT_DESC, dbo_SORDER.DATE_CREATED, dbo_SORDER.SORDER_CODE, dbo_COMPANY.CURRENCY_ID, dbo_STOCK.MANUF_ID

HAVING 

 (((dbo_STOCK_SUB_TYPE.SHORT_DESC)<>"EMBROIDERY") AND ((Year([DATE_CREATED])*12+DatePart(m,[DATE_CREATED]))=Year(Date())*12+DatePart(m,Date())-1))

ORDER BY dbo_COMPANY.COMPANY_NAME, dbo_SORDER.DATE_CREATED;

只需嘗試以下查詢

SELECT DATEPART('m', GETDATE())

返回

為datepart指定的參數1無效。

MSAccess DatePart ,需要在設置周圍加上雙引號。 因此,嘗試使用雙引號而不是單引號可以解決您的問題。


因此,您的工作查詢將是:

SELECT dbo_MANUFACTURER.COMPANY_NAME AS BRAND, 
      dbo_COMPANY.COMPANY_NAME, 
      dbo_AGENTS.SHORT_DESC AS AGENT, 
      dbo_STOCK_SUB_TYPE.SHORT_DESC AS [STOCK TYPE], 
      Replace(Replace(dbo_COMPANY.CURRENCY_ID,'110','EURO'),'1','GBP') AS [CURRENCY],
      Sum(([Unit_Net]*[QTY_SOLD])-[DELIVERY_TOTAL]) AS [NET TOTAL], 
      dbo_SORDER.DATE_CREATED, 
      dbo_SORDER.SORDER_CODE

FROM (((((
dbo_COMPANY 
INNER JOIN dbo_SORDER ON dbo_COMPANY.COMPANY_ID = dbo_SORDER.COMPANY_ID) 
INNER JOIN dbo_SORDER_ITEM ON dbo_SORDER.SORDER_ID = dbo_SORDER_ITEM.SORDER_ID) 
INNER JOIN dbo_STOCK ON dbo_SORDER_ITEM.STOCK_ID = dbo_STOCK.STOCK_ID) 
INNER JOIN dbo_STOCK_SUB_TYPE ON dbo_STOCK.SSTYPE_ID = dbo_STOCK_SUB_TYPE.SSTYPE_ID) 
INNER JOIN dbo_AGENTS ON dbo_COMPANY.AGENT_ID = dbo_AGENTS.AGENT_ID) 
INNER JOIN dbo_MANUFACTURER ON dbo_STOCK.MANUF_ID = dbo_MANUFACTURER.MANUF_ID 

GROUP BY dbo_MANUFACTURER.COMPANY_NAME, 
         dbo_COMPANY.COMPANY_NAME, 
         dbo_AGENTS.SHORT_DESC, 
         dbo_STOCK_SUB_TYPE.SHORT_DESC, 
         dbo_SORDER.DATE_CREATED, 
         dbo_SORDER.SORDER_CODE, 
         dbo_COMPANY.CURRENCY_ID, 
         dbo_STOCK.MANUF_ID 

HAVING (((dbo_STOCK_SUB_TYPE.SHORT_DESC) <> 'EMBROIDERY') 
        And ((Year([DATE_CREATED]) * 12 
              + DatePart("m", [DATE_CREATED])) = Year(Date) * 12 
              + DatePart("m", Date) - 1)) 

ORDER BY dbo_COMPANY.COMPANY_NAME, 
         dbo_SORDER.DATE_CREATED;

從根本上講,您混淆了使用相同命名函數DatePart但參數不同的SQL方言。 根據Excel應用程序的體系結構層,您需要根據所使用的SQL方言調整ACE / Jet SQL或SQL Server TSQL的DatePart函數。

  • Excel->訪問-> SQL Server (鏈接表)

    如果Excel連接到Access數據庫,並且此Access數據庫使用SQL Server鏈接表(Access對象),則必須遵守ACE / Jet SQL方言,該方言要求DatePart的第一個參數是用雙引號或單引號括起來的字符串文字,例如@ Arulkumar在回答中顯示:

     DatePart('m', [DATE_CREATED]) 
  • Excel-> SQL Server (ADO)

    如果Excel通過VBA中的ADO連接直接連接到SQL Server,則您必須遵守SQL Server TSQL方言,該方言要求DatePart的第一個參數是命名值,而不是@GarethD在注釋中描述的字符串文字:

     DatePart(MONTH, [DATE_CREATED]) DatePart(MM, [DATE_CREATED]) DatePart(M, [DATE_CREATED]) 
  • Excel->訪問-> SQL Server (直通)

    如果Excel連接到調用Access直通查詢(而不是鏈接表)的Access數據庫,並且此直通查詢(腳本化並保存在Access數據庫中)通過ODBC / OLEDB連接到SQL Server,則您必須遵循SQL Server TSQL方言如上所述。

從表的名稱來看,我相信您正在通過MSSQL鏈接表連接到Access,因為SQL Server的對象限定符維護模式加表以及由句點分隔的字段:

dbo.COMPANY.COMPANY_NAME

當鏈接到Access時,表名中不允許使用多個句點,因此默認情況下用下划線代替:

dbo_COMPANY.COMPANY_NAME

無效的對象錯誤意味着Access鏈接表在Access數據庫中不存在,或者該表在連接的SQL Server數據庫中不存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM