使用未使用提示参数更新的参数访问传递查询
Access pass-through query with parameters not updating with prompted parameters
Access 传递查询在使用默认参数时有效。在 Access 报告中使用时,使用 returns 的提示基于 ptq 中的默认参数而不是已回答的提示进行记录。正在 return 编辑默认数据。
我有一个基于 SQL 服务器的存储过程 uspWorkCentreReport
,它使用 @TheDate DATE, @WC VARCHAR(15), @Shift INT
作为参数和 returns,通过 SELECT语句,这些列:
[JOB NUMBER], [REL #], [JOB NAME], QTY.
这是存储过程代码的 ALTER 行:
ALTER PROCEDURE [dbo].[uspWorkCentreReport]
@TheDate DATE,
@WC VARCHAR(15),
@Shift INT
Access 传递查询 ptq_uspWorkCentreReport 传递这些默认参数“2019-05-30”,'PCOT',1 并使用适用于 return 默认数据。我忘了尝试,但我认为它会 return 使用我用来替换 '2019-05-30','PCOT',1 的任何默认参数来更正数据。编辑 - 我今天早上试过了,确实有任何适当的替换参数 return 适当的关联记录。这是 ptq 的一行:
exec uspWorkCentreReport '2019-05-30','PCOT',1
我根据Albert D. Kallal's SO reply.
为ptq提供默认参数
我使用 Access select 查询 qry_ptq_uspWorkCentreReport 来接收 [JOB NUMBER]、[REL #]、[JOB NAME]、QTY 并传递参数 TheDate,设置为 Date将 Time、WC 设置为 Short Text,将 Shift 设置为 Integer。
qry_ptq_uspWorkCentreReport 使用传递查询。这些参数是使用 Access 的参数小程序设置的,而不是在查询字段中设置的。 运行宁此 select 查询提示输入 3 个参数,但只有 returns 数据基于 ptq 一行中设置的默认参数。我没想过要查看 Access SQL 语句,但我会在明天早上上班时查看。编辑 - 这是 qry_ptq_uspWorkCentreReport:
的 SQL 语句
PARAMETERS TheDate DateTime, WC Text ( 255 ), Shift Short;
SELECT ptq_uspWorkCentreReport.[JOB NUMBER], ptq_uspWorkCentreReport.[REL #], ptq_uspWorkCentreReport.[JOB NAME], ptq_uspWorkCentreReport.QTY
FROM ptq_uspWorkCentreReport;
当然,以上三个功能最终形成了 Access 报告,rpt_qry_ptq_WorkCentreReport 使记录易于阅读。
我在另一份报告中使用了相同的场景,将起始日期和截止日期作为参数。当该报告运行时,提示会根据这些日期而不是 ptq 中的日期获取日期和 return 记录。这是 ptq:
exec uspMergeAandPJobs '2018-01-01','2019-01-01'
的确,我试过使用
exec uspMergeAandPJobs '',''
并且报告returns 0条记录!
不确定我遗漏了什么,希望得到任何反馈。 TIA.
我在导师的帮助下尝试了以下方法:
Sub Report_Load()
Dim strFromDate As String
Dim strToDate As String
Dim strWC As String
Dim intShift As Integer
Dim strSQL As String
strFromDate = InputBox("From Date and Time: ")
strToDate = InputBox("Enter To Date and Time: ")
strWC = InputBox("Enter Work Center: ")
intShift = InputBox("Enter Shift: ")
Dim qdf As DAO.QueryDef, rst As DAO.Recordset
Set qdf = CurrentDb.CreateQueryDef("")
qdf.SQL = "exec dbo.uspWorkCentreReport " & "'" & strFromDate & "', " & "'" & strToDate & "', " & "'" & strWC & "', " & intShift & ";"
qdf.Connect = "ODBC;DRIVER=ODBC Driver 13 for SQL Server;SERVER=OURS\NTSQL;Trusted_Connection=Yes;DATABASE=TablesCoE;ApplicationIntent=READONLY;"
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset
rst.Close
Set rst = Nothing
Set qdf = Nothing
End Sub
提示VBA后吐出一个运行-Time error 3129 - Invalid SQL statement;预期 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT' 或 'UPDATE'。我们都无法确定导致错误的原因。在 VBA 中,"qdf.SQL..." 行以黄色突出显示。
编辑 - 添加存储过程的 SQL 代码:
ALTER PROCEDURE [dbo].[uspWorkCentreReport_TEST] @FromDate DATETIME,@ToDate DATETIME,@WC VARCHAR(15),@Shift INT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Build table variable SumTable structure
DECLARE @SumTable TABLE(matl_nbr VARCHAR(60),QTY DECIMAL(4,0),matl_dsc VARCHAR(50))
-- P jobs and their summed WorkCentre traversals using crosstab - each traversal is added up
INSERT INTO @SumTable(matl_nbr,matl_dsc,QTY)
SELECT SRC1.matl_nbr,SRC1.matl_dsc,
SUM(CASE WHEN SRC1.locn_to = @WC THEN 1 ELSE 0 END) AS QTY
FROM
(
SELECT matl_nbr,matl_dsc,locn_to
FROM mtrk_CompanyE.dbo.trxn_hstd th
WHERE (last_upd >= @FromDate AND last_upd <= @ToDate) AND
locn_to = @WC
)SRC1
GROUP BY matl_nbr,matl_dsc
-- These updates take all the summed WorkCentre (locn_to) columns and turn each into "1" for later summing
UPDATE @SumTable
SET QTY = 1
WHERE QTY >1
-- Shortening the material number from 123456_00_00_R1_00 to 1234560
UPDATE @SumTable
SET matl_nbr = LEFT(matl_nbr,6) + right(LEFT(matl_nbr,9),1)
SELECT LEFT(A.matl_nbr,6)[JOB NUMBER],SUBSTRING(A.matl_nbr,7,1)[REL #],matl_dsc AS [JOB NAME],QTY
FROM (SELECT matl_nbr,matl_dsc,
SUM(CASE WHEN QTY = 1 THEN 1 ELSE NULL END) AS QTY
FROM @SumTable
GROUP BY matl_nbr,matl_dsc)A
ORDER BY QTY DESC;
END
编辑 - 完成子:
Private Sub Report_Open(Cancel As Integer)
Dim strFromDate As String
Dim strToDate As String
Dim strWC As String
Dim intShift As Integer
Dim strSQL As String
strFromDate = InputBox("Enter From Date and Time: ")
strToDate = InputBox("Enter To Date and Time: ")
strWC = InputBox("Enter Work Center: ")
intShift = InputBox("Enter Shift: ")
strSQL = "exec dbo.uspWorkCentreReport_TEST " & "'" & strFromDate & "', " & "'" & strToDate & "', " & "'" & strWC & "', " & intShift & ";"
CurrentDb.QueryDefs("ptq_uspWorkCentreReport").SQL = strSQL
DoCmd.OpenReport "rpt_qry_ptq_uspWorkCentreReport", acViewReport
Me.lblFromDate.Caption = strFromDate
Me.lblToDate.Caption = strToDate
Me.lblWC.Caption = strWC
Me.lblShift.Caption = intShift
End Sub
您的 Access 查询有参数:
PARAMETERS TheDate DateTime, WC Text ( 255 ), Shift Short;
并且由于它们是在查询定义中定义的,Access 会在 opening/running 查询时询问它们。
但是这些参数从来没有用过!
Access 无法将这些参数传递到作为 Access 查询基础的 pass-through 查询中。同样,PT 查询只不过是一个连接字符串和一个常量 SQL 字符串。
所以当你运行Access查询时,它总是运行保存PT查询的内容,即
exec uspWorkCentreReport '2019-05-30','PCOT',1
您输入的参数将被忽略。
您需要做什么(如您所指的 answer 中所述):
- 创建一个表单来收集参数值
- 使用 VBA
为 PT 查询动态创建 SQL 字符串
- 将 SQL 分配给 PT 查询:
CurrentDb.QueryDefs("ptq_uspWorkCentreReport").SQL = strSql
(自动保存)
- 然后您可以 运行 基于 Access 查询的报表 - 或者更好:直接使用 PT 查询作为报表的记录源。
从 Access 查询中删除参数,它们对您的情况没有用。或者完全删除该查询,除非您需要它与其他内容连接 PT 查询。
编辑 以上编辑:
如果您收到 运行 时间错误,则可能是您的 .Sql
中存在语法错误。在变量中构建 SQL 字符串,在 SSMS 中执行 Debug.Print strSql
和 运行 该字符串。您可能需要更改日期格式(取决于您的区域设置)。
另请参阅我的第 3 个项目符号。定义一个临时的 querydef 并打开一个记录集对报表不起作用。您必须分配 现有查询 的 .Sql
作为报表的记录源。
补充:如果需要新建查询,先设置.Connect
,然后然后.Sql
,因此 Access 知道这是一个 Pass-Through 查询。
访问 SQL 不知道 exec
.
编辑 2
您有一个现有的有效 PT 查询 ptq_uspWorkCentreReport
,其中 returns 记录了一组参数,例如
exec uspWorkCentreReport '2019-05-30','PCOT',1
使用此查询作为报告的记录源。
要运行具有不同参数的报表,您必须修改查询的SQL。您可以在查询设计视图中或使用 VBA.
手动执行此操作
我认为 Report_Load()
修改其记录源(PT 查询)为时已晚。 运行下面的子,然后打开报表。
Sub SetUspParameters()
Dim strFromDate As String
Dim strToDate As String
Dim strWC As String
Dim intShift As Integer
Dim strSQL As String
strFromDate = InputBox("From Date and Time: ")
strToDate = InputBox("Enter To Date and Time: ")
strWC = InputBox("Enter Work Center: ")
intShift = InputBox("Enter Shift: ")
strSQL = "exec dbo.uspWorkCentreReport " & "'" & strFromDate & "', " & "'" & strToDate & "', " & "'" & strWC & "', " & intShift & ";"
Debug.Print strSQL
' This line is all that's needed to modify the PT query
CurrentDb.QueryDefs("ptq_uspWorkCentreReport").SQL = strSQL
End Sub
实际上,您不想使用 4 x InputBox,而是一个表单。
Access 传递查询在使用默认参数时有效。在 Access 报告中使用时,使用 returns 的提示基于 ptq 中的默认参数而不是已回答的提示进行记录。正在 return 编辑默认数据。
我有一个基于 SQL 服务器的存储过程 uspWorkCentreReport
,它使用 @TheDate DATE, @WC VARCHAR(15), @Shift INT
作为参数和 returns,通过 SELECT语句,这些列:
[JOB NUMBER], [REL #], [JOB NAME], QTY.
这是存储过程代码的 ALTER 行:
ALTER PROCEDURE [dbo].[uspWorkCentreReport]
@TheDate DATE,
@WC VARCHAR(15),
@Shift INT
Access 传递查询 ptq_uspWorkCentreReport 传递这些默认参数“2019-05-30”,'PCOT',1 并使用适用于 return 默认数据。我忘了尝试,但我认为它会 return 使用我用来替换 '2019-05-30','PCOT',1 的任何默认参数来更正数据。编辑 - 我今天早上试过了,确实有任何适当的替换参数 return 适当的关联记录。这是 ptq 的一行:
exec uspWorkCentreReport '2019-05-30','PCOT',1
我根据Albert D. Kallal's SO reply.
为ptq提供默认参数我使用 Access select 查询 qry_ptq_uspWorkCentreReport 来接收 [JOB NUMBER]、[REL #]、[JOB NAME]、QTY 并传递参数 TheDate,设置为 Date将 Time、WC 设置为 Short Text,将 Shift 设置为 Integer。
qry_ptq_uspWorkCentreReport 使用传递查询。这些参数是使用 Access 的参数小程序设置的,而不是在查询字段中设置的。 运行宁此 select 查询提示输入 3 个参数,但只有 returns 数据基于 ptq 一行中设置的默认参数。我没想过要查看 Access SQL 语句,但我会在明天早上上班时查看。编辑 - 这是 qry_ptq_uspWorkCentreReport:
的 SQL 语句PARAMETERS TheDate DateTime, WC Text ( 255 ), Shift Short;
SELECT ptq_uspWorkCentreReport.[JOB NUMBER], ptq_uspWorkCentreReport.[REL #], ptq_uspWorkCentreReport.[JOB NAME], ptq_uspWorkCentreReport.QTY
FROM ptq_uspWorkCentreReport;
当然,以上三个功能最终形成了 Access 报告,rpt_qry_ptq_WorkCentreReport 使记录易于阅读。
我在另一份报告中使用了相同的场景,将起始日期和截止日期作为参数。当该报告运行时,提示会根据这些日期而不是 ptq 中的日期获取日期和 return 记录。这是 ptq:
exec uspMergeAandPJobs '2018-01-01','2019-01-01'
的确,我试过使用
exec uspMergeAandPJobs '',''
并且报告returns 0条记录!
不确定我遗漏了什么,希望得到任何反馈。 TIA.
我在导师的帮助下尝试了以下方法:
Sub Report_Load()
Dim strFromDate As String
Dim strToDate As String
Dim strWC As String
Dim intShift As Integer
Dim strSQL As String
strFromDate = InputBox("From Date and Time: ")
strToDate = InputBox("Enter To Date and Time: ")
strWC = InputBox("Enter Work Center: ")
intShift = InputBox("Enter Shift: ")
Dim qdf As DAO.QueryDef, rst As DAO.Recordset
Set qdf = CurrentDb.CreateQueryDef("")
qdf.SQL = "exec dbo.uspWorkCentreReport " & "'" & strFromDate & "', " & "'" & strToDate & "', " & "'" & strWC & "', " & intShift & ";"
qdf.Connect = "ODBC;DRIVER=ODBC Driver 13 for SQL Server;SERVER=OURS\NTSQL;Trusted_Connection=Yes;DATABASE=TablesCoE;ApplicationIntent=READONLY;"
qdf.ReturnsRecords = True
Set rst = qdf.OpenRecordset
rst.Close
Set rst = Nothing
Set qdf = Nothing
End Sub
提示VBA后吐出一个运行-Time error 3129 - Invalid SQL statement;预期 'DELETE'、'INSERT'、'PROCEDURE'、'SELECT' 或 'UPDATE'。我们都无法确定导致错误的原因。在 VBA 中,"qdf.SQL..." 行以黄色突出显示。
编辑 - 添加存储过程的 SQL 代码:
ALTER PROCEDURE [dbo].[uspWorkCentreReport_TEST] @FromDate DATETIME,@ToDate DATETIME,@WC VARCHAR(15),@Shift INT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Build table variable SumTable structure
DECLARE @SumTable TABLE(matl_nbr VARCHAR(60),QTY DECIMAL(4,0),matl_dsc VARCHAR(50))
-- P jobs and their summed WorkCentre traversals using crosstab - each traversal is added up
INSERT INTO @SumTable(matl_nbr,matl_dsc,QTY)
SELECT SRC1.matl_nbr,SRC1.matl_dsc,
SUM(CASE WHEN SRC1.locn_to = @WC THEN 1 ELSE 0 END) AS QTY
FROM
(
SELECT matl_nbr,matl_dsc,locn_to
FROM mtrk_CompanyE.dbo.trxn_hstd th
WHERE (last_upd >= @FromDate AND last_upd <= @ToDate) AND
locn_to = @WC
)SRC1
GROUP BY matl_nbr,matl_dsc
-- These updates take all the summed WorkCentre (locn_to) columns and turn each into "1" for later summing
UPDATE @SumTable
SET QTY = 1
WHERE QTY >1
-- Shortening the material number from 123456_00_00_R1_00 to 1234560
UPDATE @SumTable
SET matl_nbr = LEFT(matl_nbr,6) + right(LEFT(matl_nbr,9),1)
SELECT LEFT(A.matl_nbr,6)[JOB NUMBER],SUBSTRING(A.matl_nbr,7,1)[REL #],matl_dsc AS [JOB NAME],QTY
FROM (SELECT matl_nbr,matl_dsc,
SUM(CASE WHEN QTY = 1 THEN 1 ELSE NULL END) AS QTY
FROM @SumTable
GROUP BY matl_nbr,matl_dsc)A
ORDER BY QTY DESC;
END
编辑 - 完成子:
Private Sub Report_Open(Cancel As Integer)
Dim strFromDate As String
Dim strToDate As String
Dim strWC As String
Dim intShift As Integer
Dim strSQL As String
strFromDate = InputBox("Enter From Date and Time: ")
strToDate = InputBox("Enter To Date and Time: ")
strWC = InputBox("Enter Work Center: ")
intShift = InputBox("Enter Shift: ")
strSQL = "exec dbo.uspWorkCentreReport_TEST " & "'" & strFromDate & "', " & "'" & strToDate & "', " & "'" & strWC & "', " & intShift & ";"
CurrentDb.QueryDefs("ptq_uspWorkCentreReport").SQL = strSQL
DoCmd.OpenReport "rpt_qry_ptq_uspWorkCentreReport", acViewReport
Me.lblFromDate.Caption = strFromDate
Me.lblToDate.Caption = strToDate
Me.lblWC.Caption = strWC
Me.lblShift.Caption = intShift
End Sub
您的 Access 查询有参数:
PARAMETERS TheDate DateTime, WC Text ( 255 ), Shift Short;
并且由于它们是在查询定义中定义的,Access 会在 opening/running 查询时询问它们。
但是这些参数从来没有用过!
Access 无法将这些参数传递到作为 Access 查询基础的 pass-through 查询中。同样,PT 查询只不过是一个连接字符串和一个常量 SQL 字符串。
所以当你运行Access查询时,它总是运行保存PT查询的内容,即
exec uspWorkCentreReport '2019-05-30','PCOT',1
您输入的参数将被忽略。
您需要做什么(如您所指的 answer 中所述):
- 创建一个表单来收集参数值
- 使用 VBA 为 PT 查询动态创建 SQL 字符串
- 将 SQL 分配给 PT 查询:
CurrentDb.QueryDefs("ptq_uspWorkCentreReport").SQL = strSql
(自动保存) - 然后您可以 运行 基于 Access 查询的报表 - 或者更好:直接使用 PT 查询作为报表的记录源。
从 Access 查询中删除参数,它们对您的情况没有用。或者完全删除该查询,除非您需要它与其他内容连接 PT 查询。
编辑 以上编辑:
如果您收到 运行 时间错误,则可能是您的 .Sql
中存在语法错误。在变量中构建 SQL 字符串,在 SSMS 中执行 Debug.Print strSql
和 运行 该字符串。您可能需要更改日期格式(取决于您的区域设置)。
另请参阅我的第 3 个项目符号。定义一个临时的 querydef 并打开一个记录集对报表不起作用。您必须分配 现有查询 的 .Sql
作为报表的记录源。
补充:如果需要新建查询,先设置.Connect
,然后然后.Sql
,因此 Access 知道这是一个 Pass-Through 查询。
访问 SQL 不知道 exec
.
编辑 2
您有一个现有的有效 PT 查询 ptq_uspWorkCentreReport
,其中 returns 记录了一组参数,例如
exec uspWorkCentreReport '2019-05-30','PCOT',1
使用此查询作为报告的记录源。
要运行具有不同参数的报表,您必须修改查询的SQL。您可以在查询设计视图中或使用 VBA.
手动执行此操作我认为 Report_Load()
修改其记录源(PT 查询)为时已晚。 运行下面的子,然后打开报表。
Sub SetUspParameters()
Dim strFromDate As String
Dim strToDate As String
Dim strWC As String
Dim intShift As Integer
Dim strSQL As String
strFromDate = InputBox("From Date and Time: ")
strToDate = InputBox("Enter To Date and Time: ")
strWC = InputBox("Enter Work Center: ")
intShift = InputBox("Enter Shift: ")
strSQL = "exec dbo.uspWorkCentreReport " & "'" & strFromDate & "', " & "'" & strToDate & "', " & "'" & strWC & "', " & intShift & ";"
Debug.Print strSQL
' This line is all that's needed to modify the PT query
CurrentDb.QueryDefs("ptq_uspWorkCentreReport").SQL = strSQL
End Sub
实际上,您不想使用 4 x InputBox,而是一个表单。