Оператор SQL не добавляется во временную таблицу - PullRequest
1 голос
/ 25 июня 2019

Для экспорта отображаемых пользовательских данных из формы в Excel я создаю временную таблицу и экспортирую эту таблицу.Обычно это работает, однако, в случае, когда мне нужно запросить две разные таблицы и экспортировать их вместе, ничего не будет выводиться, только структура таблицы, ничего больше.

Я пытался вручную запрашивать таблицы, в дополнение к прямому извлечению из источника записей форм, ручному выполнению запросов в коде и использованию стандартного вывода.

Код для всех других формперечисляется так:

sheetName = [Forms]![frmOutputPickering]![TabCtl3].Pages(page).Name
lenSQL = InStr(1, selectedPageName(page).Form.RecordSource, "FROM") - 2
strSQL = Left(selectedPageName(page).Form.RecordSource, lenSQL) & "INTO [" & sheetName & "] " _
& Mid(selectedPageName(page).Form.RecordSource, lenSQL)
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True

Код из двух частей выглядит следующим образом:

sheetName = [Forms]![frmOutputPickering]![TabCtl3].Pages(page).Name
lenSQL = InStr(1, selectedPageName(page).Form.RecordSource, "FROM") - 2
strSQL = Left(selectedPageName(page).Form.RecordSource, lenSQL) & " INTO [" & sheetName & "] " & Mid(selectedPageName(page).Form.RecordSource, _
lenSQL, InStr(1, selectedPageName(page).Form.RecordSource, "UNION") - lenSQL - 2) & ");"
strSQL = "SELECT qryOUTAGE_NEW_WOs_PA.* INTO [" & sheetName & "] FROM [qryOUTAGE_NEW_WOs_PA];"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True
lenSQL = InStr(lenSQL, selectedPageName(page).Form.RecordSource, "UNION") + 5
strSQL = "INSERT INTO [" & sheetName & "] SELECT [qryOUTAGE_NEW_WOs_PB].*;"
DoCmd.SetWarnings False
DoCmd.RunSQL strSQL
DoCmd.SetWarnings True

Он должен экспортировать оба запроса во временную таблицу, но выводит только структуру таблицы.

Редактировать: в соответствии с запросом исходного источника записи для вывода формы

SELECT tbl_OMSPA_v_SCOPED_WORK.WORK_ORDER_NBR AS [WO #], tbl_OMSPA_v_SCOPED_WORK.WO_REQ_NUMBER AS [WR #], tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE AS System, tbl_OMSPA_v_SCOPED_WORK.ADD_DATE AS [Add Date], tbl_OMSPA_v_SCOPED_WORK.SW_TITLE AS Description, tbl_OMSPA_v_SCOPED_WORK.SW_UNIT AS Unit, [tbl_OMSPA_v_SCOPED_WORK].[SW_UNIT]+"-"+[tbl_OMSPA_v_SCOPED_WORK].[SW_SYSTEM_CODE]+"-"+[tbl_OMSPA_v_SCOPED_WORK].[SW_EQUIPMENT_NUMBER] AS Equipment_Tag, tbl_OMSPA_v_SCOPED_WORK.SW_CRITICAL_EQUIPMENT AS Criticality, tbl_OMSPA_v_SCOPED_WORK.SCOPE_STATUS AS [Scope Status], tbl_OMSPA_v_SCOPED_WORK.SW_SHUTDOWN_NBR AS [Shutdown Number], tbl_OMSPA_v_SCOPED_WORK.I2P_Score AS [I2P Score]
FROM tbl_OMSPA_v_SCOPED_WORK
WHERE (((tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='42100' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='42110' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='42111' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='42120' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='42121' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='42122' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='42123' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='42130' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='42140' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43100' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43110' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43120' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43130' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43140' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43150' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43200' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43210' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43220' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43230' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='43240' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='45100' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='45110' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='45200' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='45210' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='45220' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='45230' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='45300' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='45310' OR (tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)='42000') AND ((tbl_OMSPA_v_SCOPED_WORK.ADD_DATE)>=[Forms]![frmOutputPickering]![TextStartDate] And (tbl_OMSPA_v_SCOPED_WORK.ADD_DATE)<=([Forms]![frmOutputPickering]![TextEndDate]+1))) UNION SELECT tbl_OMSPB_v_SCOPED_WORK.WORK_ORDER_NBR AS [WO #], tbl_OMSPB_v_SCOPED_WORK.WO_REQ_NUMBER AS [WR #], tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE AS System, tbl_OMSPB_v_SCOPED_WORK.ADD_DATE AS [Add Date], tbl_OMSPB_v_SCOPED_WORK.SW_TITLE AS Description, tbl_OMSPB_v_SCOPED_WORK.SW_UNIT AS Unit, [tbl_OMSPB_v_SCOPED_WORK].[SW_UNIT]+"-"+[tbl_OMSPB_v_SCOPED_WORK].[SW_SYSTEM_CODE]+"-"+[tbl_OMSPB_v_SCOPED_WORK].[SW_EQUIPMENT_NUMBER] AS Equipment_Tag, tbl_OMSPB_v_SCOPED_WORK.SW_CRITICAL_EQUIPMENT AS Criticality, tbl_OMSPB_v_SCOPED_WORK.SCOPE_STATUS AS [Scope Status], tbl_OMSPB_v_SCOPED_WORK.SW_SHUTDOWN_NBR AS [Shutdown Number], tbl_OMSPB_v_SCOPED_WORK.I2P_Score AS [I2P Score]
FROM tbl_OMSPB_v_SCOPED_WORK
WHERE (((tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='42100' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='42110' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='42111' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='42120' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='42121' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='42122' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='42123' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='42130' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='42140' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43100' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43110' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43120' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43130' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43140' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43150' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43200' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43210' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43220' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43230' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='43240' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='45100' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='45110' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='45200' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='45210' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='45220' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='45230' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='45300' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='45310' OR (tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)='42000') AND ((tbl_OMSPB_v_SCOPED_WORK.ADD_DATE)>=[Forms]![frmOutputPickering]![TextStartDate] And (tbl_OMSPB_v_SCOPED_WORK.ADD_DATE)<=([Forms]![frmOutputPickering]![TextEndDate]+1)));

Редактировать 2: запросы, которые вызываются кодом

qryOUTAGE_NEW_WOs_PA:

SELECT tbl_OMSPA_v_SCOPED_WORK.WORK_ORDER_NBR AS [WO #], tbl_OMSPA_v_SCOPED_WORK.WO_REQ_NUMBER AS [WR #], tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE AS System, tbl_OMSPA_v_SCOPED_WORK.ADD_DATE AS [Add Date], tbl_OMSPA_v_SCOPED_WORK.SW_TITLE AS Description, tbl_OMSPA_v_SCOPED_WORK.SW_UNIT AS Unit, [tbl_OMSPA_v_SCOPED_WORK].[SW_UNIT]+"-"+[tbl_OMSPA_v_SCOPED_WORK].[SW_SYSTEM_CODE]+"-"+[tbl_OMSPA_v_SCOPED_WORK].[SW_EQUIPMENT_NUMBER] AS Equipment_Tag, tbl_OMSPA_v_SCOPED_WORK.SW_CRITICAL_EQUIPMENT AS Criticality, tbl_OMSPA_v_SCOPED_WORK.SCOPE_STATUS AS [Scope Status], tbl_OMSPA_v_SCOPED_WORK.SW_SHUTDOWN_NBR AS [Shutdown Number], tbl_OMSPA_v_SCOPED_WORK.I2P_Score AS [I2P Score]
FROM tbl_OMSPA_v_SCOPED_WORK
WHERE (((tbl_OMSPA_v_SCOPED_WORK.SW_SYSTEM_CODE)=[Forms]![frmOutputPickering]![ListSelectedSystem]) AND ((tbl_OMSPA_v_SCOPED_WORK.ADD_DATE)>=[Forms]![frmOutputPickering]![TextStartDate] And (tbl_OMSPA_v_SCOPED_WORK.ADD_DATE)<=([Forms]![frmOutputPickering]![TextEndDate]+1)));

qryOUTAGE_NEW_WOs_PB:

SELECT tbl_OMSPB_v_SCOPED_WORK.WORK_ORDER_NBR AS [WO #], tbl_OMSPB_v_SCOPED_WORK.WO_REQ_NUMBER AS [WR #], tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE AS System, tbl_OMSPB_v_SCOPED_WORK.ADD_DATE AS [Add Date], tbl_OMSPB_v_SCOPED_WORK.SW_TITLE AS Description, tbl_OMSPB_v_SCOPED_WORK.SW_UNIT AS Unit, [tbl_OMSPB_v_SCOPED_WORK].[SW_UNIT]+"-"+[tbl_OMSPB_v_SCOPED_WORK].[SW_SYSTEM_CODE]+"-"+[tbl_OMSPB_v_SCOPED_WORK].[SW_EQUIPMENT_NUMBER] AS Equipment_Tag, tbl_OMSPB_v_SCOPED_WORK.SW_CRITICAL_EQUIPMENT AS Criticality, tbl_OMSPB_v_SCOPED_WORK.SCOPE_STATUS AS [Scope Status], tbl_OMSPB_v_SCOPED_WORK.SW_SHUTDOWN_NBR AS [Shutdown Number], tbl_OMSPB_v_SCOPED_WORK.I2P_Score AS [I2P Score]
FROM tbl_OMSPB_v_SCOPED_WORK
WHERE (((tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)=[Forms]![frmOutputPickering]![ListSelectedSystem]) AND ((tbl_OMSPB_v_SCOPED_WORK.ADD_DATE)>=[Forms]![frmOutputPickering]![TextStartDate] And (tbl_OMSPB_v_SCOPED_WORK.ADD_DATE)<=([Forms]![frmOutputPickering]![TextEndDate]+1)));

1 Ответ

0 голосов
/ 25 июня 2019

По сути, вы пытаетесь выполнить запрос действия (make-table) на основе параметризованного запроса выбора набора записей. Однако при выполнении запросов VBA SQL с DoCmd.RunSQL ваши параметры никогда не оцениваются. В результате ваше WHERE предложение:

WHERE (((tbl_OMSPB_v_SCOPED_WORK.SW_SYSTEM_CODE)=[Forms]![frmOutputPickering]![ListSelectedSystem])

получает значение параметра NULL и не оценивается как TRUE, поэтому записи не возвращаются.

Существует несколько решений, которые можно реализовать для оценки параметров в параметризованном запросе.

  • Доступ ' DoCmd.OpenQuery

    Сохраните ваш запрос на создание таблицы как собственный сохраненный запрос и вызовите действие. Примечание: нет необходимости закрывать запросы действий:

    DoCmd.SetWarnings False
    DoCmd.OpenQuery "myMakeTableQuery"
    DoCmd.SetWarnings True
    

    Этот метод запуска GUI обнаружит элемент управления [Forms]![frmOutputPickering]![ListSelectedSystem] в открытых формах и соответственно свяжет его значение. Если форма не открыта, запрос не возвращает записей.

  • Доступ ' QueryDefs

    Сохраните запрос таблицы составления по своему хранимому запросу и в коде, инициализируйте querydef и оцените параметр буквально.

    Dim qdef As QueryDef, prm As Parameter
    
    ' INITIALIZE QUERYDEF
    Set qdef = CurrentDb.QueryDefs("myMakeTableQuery")
    
    ' EVALUATE EACH FORM PARAMETER
    For Each prm In qdef.Parameters
        prm.value = Eval(prm.name)
    Next prm
    
    ' RUN ACTION 
    qdef.Execute dbFailOnError
    
  • Excel CopyFromRecordset

    Еще лучше - обойти любые потребности во временных таблицах и использовать querydefs и наборы записей для вывода данных, чтобы открыть книгу с помощью объекта приложения Excel. Ниже показано, как экспортировать один параметризованный запрос.

    Public Sub ExportQueryToExcel()
    On Error GoTo ErrHandle
        Dim qdef As QueryDef, rs As Recordset, prm As Parameter
        Dim xlApp As Object, xlWb As Object
        Dim i As Long
    
        Set xlApp = CreateObject("Excel.Application")
        Set xlWb = xlApp.Workbooks.Add
    
        Set qdef = CurrentDb.QueryDefs("mySelectQuery")            
        For Each prm In qdef.Parameters
            prm.value = Eval(prm.name)
        Next prm    
        Set rs = qdef.OpenRecordset()
    
        xlWb.Sheets(1).Range("A2").CopyFromRecordset rs            ' DATA ROWS
    
        For i = 1 To rs.Fields.Count
            xlWb.Sheets(1).Cells(1, i) = rs.Fields(i - 1).name     ' HEADER ROW
        Next i
    
        xlApp.Visible = True
    
    ExitHandle:
        rs.Close: qdef.Close
        Set rs = Nothing: Set qdef = Nothing
        Set xlWb = Nothing: Set xlApp = Nothing
        Exit Sub
    
    ErrHandle:
        MsgBox Err.Number & ": " & Err.Description, vbCritical, "RUNTIME ERROR"
        Resume ExitHandle
    End Sub
    
...