Сквозной запрос доступа работает при использовании параметров по умолчанию.При использовании в отчете Access используемые подсказки возвращают записи, основанные на параметрах по умолчанию в ptq, а не на отвеченных подсказках.Возвращаются данные по умолчанию.
У меня есть хранимая процедура на базе SQL Server, которая работает, uspWorkCentreReport
, которая использует @TheDate DATE, @WC VARCHAR(15), @Shift INT
для параметров и возвращает через оператор SELECT эти столбцы:
[JOB NUMBER], [REL #], [JOB NAME], QTY.
Вот строка ALTER кода хранимой процедуры:
ALTER PROCEDURE [dbo].[uspWorkCentreReport]
@TheDate DATE,
@WC VARCHAR(15),
@Shift INT
Сквозной запрос доступа ptq_uspWorkCentreReport передает эти параметры по умолчанию «2019-05-30», «PCOT», 1 ииспользует ODBC-соединение без DSN, которое работает для возврата данных по умолчанию.Я забыл попробовать, но думаю, что вернутся правильные данные с параметрами по умолчанию, которые я использую для замены «2019-05-30», «PCOT», 1.РЕДАКТИРОВАТЬ - Я попробовал это сегодня утром, и действительно любые соответствующие параметры замены возвращают соответствующие связанные записи.Вот одна строка ptq:
exec uspWorkCentreReport '2019-05-30','PCOT',1
Я предоставляю ptq параметры по умолчанию, основанные на SO-ответ Альберта Д. Каллала .
Я использую запрос Access select,qry_ptq_uspWorkCentreReport, чтобы получить [JOB NUMBER], [REL #], [JOB NAME], QTY и передать параметры TheDate, установить Date With Time, WC, установить Short Text и Shift, установить Integer.
qry_ptq_uspWorkCentreReport использует сквозной запрос.Параметры задаются с помощью апплета Access 'Parameters, а не внутри полей запроса.Выполнение этого запроса выбора запрашивает 3 параметра, но возвращает данные только на основе параметров по умолчанию, установленных в одной строке ptq.Я не думал смотреть на оператор Access SQL, но сделаю это, когда завтра утром доберусь до работы.РЕДАКТИРОВАТЬ - Вот оператор SQL для qry_ptq_uspWorkCentreReport:
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.Вот этот код:
exec uspMergeAandPJobs '2018-01-01','2019-01-01'
Действительно, я попытался использовать
exec uspMergeAandPJobs '',''
И отчет возвращает 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 выдает сообщение об ошибке Run-Time 3129 - Неверный оператор SQL;ожидаемые «УДАЛИТЬ», «ВСТАВИТЬ», «ПРОЦЕДУРА», «ВЫБОР» или «ОБНОВЛЕНИЕ».Никто из нас не смог определить причину ошибки.В VBA строка «qdf.SQL ...» подсвечивается желтым цветом.
EDIT - добавление хранимого кода SQL proc:
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
EDIT - готовая подпрограмма:
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