MS Access OpenRecordset 和参数太少的问题

MS Access OpenRecordset and too few parameters issue

这是 的后续问题。我确信我有足够的参数、字段声明来将值传递给 OpenRecordSet 方法,但我仍然卡住了。

一般解释:

  1. 用户在过滤我的查询的表单上输入开始日期和结束日期2_Total(单值)My query
  2. 运行 将查询导出到 excel 文件的 VBA 函数

问题: 参数太少。 Set rst = qry.OpenRecordset(dbOpenDynaset)

上的预期 4 错误

SQL Design View

PARAMETERS [BeginDate] DateTime, [EndDate] DateTime;
SELECT Sum(dbo_SO_SalesHistory.DollarsSold) AS SumOfDollarsSold
FROM dbo_SO_SalesHistory
WHERE (((dbo_SO_SalesHistory.InvoiceDate) Between [Forms]![RUN]![textBeginOrderDate] And [Forms]![RUN]![textendorderdate]));

VBA

Option Compare Database

Option Explicit
Public Function Trans2()

    Dim xlApp As Excel.Application
    Dim xlWB As Excel.Workbook
    Dim xlWS As Excel.Worksheet
    Dim acRng As Variant
    Dim xlRow As Integer

    Dim db As DAO.Database
    Dim qry As QueryDef
    Dim rst As Recordset
    Dim prm As DAO.Parameter
    Dim strSQL As String

    Set db = CurrentDb
    Set xlApp = New Excel.Application
    Set xlWB = xlApp.Workbooks.Open("C:\Users\J\Desktop\August 2017.xlsx")
    Set xlWS = xlWB.Worksheets("Totals")

    xlRow = (xlWS.Columns("K").End(xlDown).Row)

    Set qry = db.QueryDefs("2_Total")

    qry![BeginDate] = [Forms]![Run]![textBeginOrderDate]
    qry![EndDate] = [Forms]![Run]![textendorderdate]

    Set rst = qry.OpenRecordset(dbOpenDynaset)

    Dim c As Integer
    c = 11   'C is the one that stores column number, in which c=1 means column A, 11 is for column K, 12 for Column L
    xlRow = xlRow + 11

     Do Until rst.EOF
        For Each acRng In rst.Fields
            xlWS.Cells(xlRow, c).Formula = acRng
            c = c + 1
        Next acRng
        xlRow = xlRow + 1
        c = 1
        rst.MoveNext
        If xlRow > 25 Then GoTo rq_Exit
    Loop


rq_Exit:
    rst.Close
    Set rst = Nothing
    Set xlWS = Nothing
    xlWB.Close acSaveYes
    Set xlWB = Nothing
    xlApp.Quit
    Set xlApp = Nothing
    Exit Function

End Function

以下未解决问题。我的参数仍然太少。预期 4 错误。

qry.Parameters("BeginDate").Value = [Forms]![Run]![textBeginOrderDate]
qry.Parameters("EndDate").Value = [Forms]![Run]![textendorderdate] 

尝试语法:qry.Parameters("BeginDate").Value = Forms![Run]![textBeginOrderDate]

您还可以添加一行 debug.print Forms![Run]![textBeginOrderDate] 以确保它是您期望的值。

另一种可能性是修改查询并使用例如
[Forms]![Run]![textBeginOrderDate] 作为标准

在 SQL 中将 Where 子句设置为 BeginDateEndDate :

PARAMETERS [BeginDate] DateTime, [EndDate] DateTime;
SELECT Sum(dbo_SO_SalesHistory.DollarsSold) AS SumOfDollarsSold
FROM dbo_SO_SalesHistory
WHERE dbo_SO_SalesHistory.InvoiceDate Between [BeginDate] And [EndDate];

试试这个:

PARAMETERS 
    [Forms]![RUN]![textBeginOrderDate] DateTime, 
    [Forms]![RUN]![textendorderdate] DateTime;
SELECT 
    Sum(dbo_SO_SalesHistory.DollarsSold) AS SumOfDollarsSold
FROM 
    dbo_SO_SalesHistory
WHERE 
    (((dbo_SO_SalesHistory.InvoiceDate) 
    Between [Forms]![RUN]![textBeginOrderDate] 
    And [Forms]![RUN]![textendorderdate]));

在您的查询中试试这个 SQL:

    SELECT 
      Sum(dbo_so_salesHistory.DollarsSold) AS SumOforderamt,
      Min(dbo_so_salesHistory.InvoiceDate) AS MinOforderdate,
      Max(dbo_so_salesHistory.InvoiceDate) AS MaxOforderdate,
      Count(dbo_so_salesHistory.InvoiceDate) AS CountOforderdate, 
      forms!run![textBeginOrderDate] AS tbegin, 
      forms!run![textendorderdate] AS tend
    FROM dbo_so_salesHistory
    WHERE 
      (((dbo_so_salesHistory.InvoiceDate) Between 
      [forms]![run]![textBeginOrderDate] And 
      [forms]![run]![textendorderdate]))
    GROUP BY 
      forms!run![textBeginOrderDate], 
      forms!run![textendorderdate];

和这个 VBA 代码:

Private Sub cmdRun_Click()
    Dim db As DAO.Database
    Dim qry As QueryDef
    Dim rst As Recordset

    Set db = CurrentDb

    Set qry = db.QueryDefs("2_Total")
    qry.Parameters(0).Value = Forms!Run![textBeginOrderDate]
    qry.Parameters(1).Value = Forms!Run![textendorderdate]

    Set rst = qry.OpenRecordset(dbOpenDynaset)

End Sub