访问错误3141

时间:2017-07-17 15:24:31

标签: vba ms-access

我正在尝试使用以下查询为报告设置记录集:

Dim RS As Recordset
Set RS = CurrentDb.OpenRecordset("Select DISTINCT SalesOrders.SalesOrderNumber, Vendors.Name, SalesOrders.OrderDate, SalesOrders.Grade, SalesOrders.QuantityUOM, SalesOrders.PortOfDischarge, SalesOrders.Quantity, IIf([SalesOrders.DTHCIncludedYN],'DTHC INCLUDED','DTHC NOT INCLUDED') AS DTHCIncludedYN," & _
" SalesOrders.DeliveryTerms, SalesOrders.SalesOrderID, SalesOrders.GenesisDocumenationAssistant, Products.ProductLoadPorts, Customers.CustomerType, SalesOrders.UnitPriceUOM, SalesOrders.UnitPrice, Customers.CustomerName, Products.ProductName, SalesOrders.PaymentTerms, SalesOrders.PlaceOfDelivery, SalesOrders.SalesCommission, SalesOrders.LatestShipDate, [SalesOrders.Quantity]*[UnitPrice] AS Amount," & _
" IIf([AdvisingBank]='GEB','GREAT EASTERN BANK',IIf([AdvisingBank]='BOC','BANK OF CHINA',IIf([AdvisingBank]='CB','CATHAY BANK',IIf([AdvisingBank]='HSBC','HSBC Bank USA',IIf([AdvisingBank]='COM','COMMERCE BANK'))))) AS [Bank Name]," & _
" IIf([CCICType]= '1','ONE ORIGINAL INSPECTION CERTIFICATE ISSUED BY CCIC NORTH AMERICA INC','ONE ORIGINAL PRESHIPMENT INSPECTION CERTIFICATE ISSUED BY ANY CCIC EUROPEAN OFFICE') AS [CCIC-Clause]," & _
" IIf([OnCarriageIncluded],'ON CARRIAGE INCLUDED','ON CARRIAGE NOT INCLUDED') AS OCIText, IIf(IsNull([PlaceOfDelivery]),[PortOfDischarge],[PlaceOfDelivery]) AS PODText, Vendors.AB1AddressLine1, Vendors.SupplierLocation AS [Swift Code], " & _
" IIf(IsNull(AdvisingBank),' ','TEL  ' & [Vendors.AB1Phone] & ', ' & 'FAX  ' & [Vendors.AB1Fax]) AS [Contact Details], IIf(IsNull(AdvisingBank),'',Vendors.AB1AddressLine1 & ', ' & [Vendors.AB1City] & ', ' & [Vendors.AB1State] & ' ' & [Vendors.AB1Zip] & ' ' & [Vendors.AB1Country]) AS AddressLine," & _
" FROM (Products INNER JOIN (Customers INNER JOIN SalesOrders ON Customers.CustomerID = SalesOrders.CustomerID) ON Products.Grade = SalesOrders.Grade) LEFT JOIN Vendors ON SalesOrders.AdvisingBank = Vendors.VendorID " & _
" WHERE (SalesOrders.SalesOrderNumber= Forms!frmPrintContracts!txtGreenSales  AND ((Customers.CustomerType)='GREEN' Or (Customers.CustomerType)='GREEN-JC' Or (Customers.CustomerType)='GREEN-DL' Or (Customers.CustomerType)='SIHU' Or (Customers.CustomerType)='PAPYRUS'))ORDER BY SalesOrders.SalesOrderNumber DESC ")

我收到错误,说我使用了保留关键字或者有标点符号错误。任何人都可以帮我弄清楚错误是什么。 任何帮助表示赞赏。谢谢

1 个答案:

答案 0 :(得分:0)

考虑将SQL语句保存为Access存储查询而不是VBA字符串,原因如下:

  1. 保存前会检查所有语法错误。您无法通过MS Access查询设计GUI保存不可编译的查询。

  2. 存储访问查询比VBA字符串查询更有效,因为数据库引擎为存储的查询保存了最佳执行计划,而在VBA中即时调用则无法实现。

  3. 您可以使用较少的代码将保存的查询设置为大多数Access对象(组合框或列表框行源,表单或报表记录源)。

    Me.cboText.RowSource = "myStoredQuery"
    Me.cboText.RowSourceType = "Table/Query"
    Me.cboText.Requery
    
    Me.Form.RecordSource = "myStoredQuery"
    Me.Form.Requery
    
  4. 您可以避免VBA字符串连接,因此您的应用程序代码更具可读性和可维护性。另外,您从应用程序层代码中抽象出SQL的特殊用途本质。

    Dim RS As Recordset
    Set RS = CurrentDb.OpenRecordset("myStoredQuery")
    
  5. 使用存储查询可以更容易地实现参数化的行业标准,这些查询可以作为预处理语句。如果您需要为动态查询传递VBA变量值,则可以parameterize stored queries使用PARAMETERS子句和querydef,同时仍然使用存储的查询。见下面的例子:

    存储查询

    PARAMETERS [myParam] Date;
    SELECT DISTINCT SalesOrders.SalesOrderNumber
    FROM SalesOrders
    WHERE SalesOrders.OrderDate = [myParam]
    

    VBA

    Dim qdef As QueryDef
    Dim RS As Recordset
    
    Set qdef = Currentdb.QueryDefs("myStoredQuery")
    qdef!myParam = Date()
    
    Set RS = qdef.OpenRecordset()