Доступ к сквозному запросу с параметрами, которые не обновляются, с запрошенными параметрами - PullRequest
1 голос
/ 31 мая 2019

Сквозной запрос доступа работает при использовании параметров по умолчанию.При использовании в отчете 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

1 Ответ

1 голос
/ 31 мая 2019

Ваш запрос доступа имеет параметры:

PARAMETERS TheDate DateTime, WC Text ( 255 ), Shift Short;

и поскольку они определены в определении запроса, Access запрашивает их при открытии / выполнении запроса.

Но эти параметры никогда не используются!

У Access нет способа передать эти параметры в сквозной запрос, который является основой запроса Access. Опять же, PT-запрос - это не что иное, как строка Connect и постоянная строка SQL.

Таким образом, когда вы запускаете запрос на доступ, он всегда запускает сохраненное содержимое запроса PT, т.е.
exec uspWorkCentreReport '2019-05-30','PCOT',1
Введенные вами параметры игнорируются.

Что вам нужно сделать (как указано в ответе , на который вы ссылаетесь):

  • создать форму для сбора значений параметров
  • динамически создавать строку SQL для запроса PT с помощью VBA
  • назначить этот SQL для запроса PT:
    CurrentDb.QueryDefs("ptq_uspWorkCentreReport").SQL = strSql
    (автоматически сохраняется)
  • и затем вы можете запустить отчет на основе запроса Access - или лучше: напрямую используйте запрос PT в качестве источника записи для отчета.

Удалите параметры из запроса Access, они бесполезны для вашей ситуации. Или полностью удалите запрос, если он не нужен для соединения запроса PT с чем-то другим.


Редактировать для вышеупомянутого редактирования:

Если вы получили ошибку во время выполнения, возможно, в вашем .Sql есть синтаксическая ошибка. Создайте строку SQL в переменной, выполните Debug.Print strSql и запустите эту строку в SSMS. Возможно, вам придется изменить форматирование даты (в зависимости от настроек локали).

Также: см. Мою третью пулю. Определение временного запроса и открытие набора записей не работает для отчета. Вы должны назначить .Sql из существующего запроса , который является источником записи отчета.

Приложение: если вам нужно создать новый запрос, сначала установите .Connect и , затем .Sql, так что Access знает, что это сквозной запрос.
Access SQL не знает exec.

Редактировать 2

У вас есть работающий PT-запрос ptq_uspWorkCentreReport, который возвращает записи для одного набора параметров, например,

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, но форму.

...