MS Access OpenRecordset 和参数太少的问题
MS Access OpenRecordset and too few parameters issue
这是 的后续问题。我确信我有足够的参数、字段声明来将值传递给 OpenRecordSet
方法,但我仍然卡住了。
一般解释:
- 用户在过滤我的查询的表单上输入开始日期和结束日期2_Total(单值)My query
- 运行 将查询导出到 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 子句设置为 BeginDate
和 EndDate
:
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
这是 OpenRecordSet
方法,但我仍然卡住了。
一般解释:
- 用户在过滤我的查询的表单上输入开始日期和结束日期2_Total(单值)My query
- 运行 将查询导出到 excel 文件的 VBA 函数
问题:
参数太少。 Set rst = qry.OpenRecordset(dbOpenDynaset)
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 子句设置为 BeginDate
和 EndDate
:
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