使用未使用提示参数更新的参数访问传递查询

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,而是一个表单。