Отмените выбор нескольких полей из запроса в VBA из MS-Access - PullRequest
0 голосов
/ 13 июня 2019

Мне нужно отменить выбор некоторых конкретных значений в некоторых столбцах, например, слово «Штамп» в столбце AREA RESP , и мне нужно получить значения, которые находятся в диапазоне от сегодняшнего дня до 30 дней. позже.

Я пытался с этим:

myQuery = "SELECT ORDER, [PART NUMBER], [DEPT RESP], [AREA RESP], [START DATE]" _
            & " FROM INITIAL_PHASE" _
            & " WHERE [PLANNER NAME] = 'Homer' OR [PLANNER NAME] = 'Bart'" _
            & "    OR [PLANNER NAME] = 'Marge' AND [AREA RESP] <> 'Stamping'" _
            & "   AND [START DATE] BETWEEN " & DateToday & " AND " & DateMonth
            & "   AND [PART NUMBER] NOT LIKE '%R'" _
            & " ORDER BY [START DATE]"

Но возвращается Штамп и все найденные даты

Sub GetFromMSAccess()
    Dim conn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim WB As Excel.Workbook
    Dim SH As Excel.Worksheet
    Dim strConn As String
    Dim myQuery As String
    Dim CalcMode As Long
    Dim ViewMode As Long
    Dim DateToday As Date
    Dim DateMonth As Date

    DateToday = Format(Date, "m/d/yyyy")
    DateMonth = DateToday + 30 'One full month starting from today

    Application.StatusBar = "Extracting data from MS-Access"

    With Application
        CalcMode = .Calculation
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = False
    End With

    Sheets("DataSheet").Select

    Set WB = ThisWorkbook
    Set SH = WB.Sheets("DataSheet")

    strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=G:\Share\Control\MD\Master_data.mdb;" & "Jet OLEDB:Database Password=321pass;"

    Set conn = New ADODB.Connection

    'Here it gets the information I need
        With SH
            Set Rng = .Cells(2, "A")
        End With

        Set rst = New ADODB.Recordset

        myQuery = "SELECT ORDER, [PART NUMBER], [DEPT RESP], [AREA RESP], [START DATE] " & _
                    "FROM INITIAL_PHASE WHERE [PLANNER NAME] = 'Homer' OR [PLANNER NAME] = 'Bart' OR [PLANNER NAME] = 'Marge' " & _
                    "AND [AREA RESP] <> 'Stamping' AND [START DATE] BETWEEN " & DateToday & " AND " & DateMonth & " " & _
                    "and [PART NUMBER] not LIKE '%R' order by [START DATE]"

        rst.Open myQuery, strConn, adOpenKeyset, adLockBatchOptimistic

        Rng.CopyFromRecordset rst
        rst.Close
        Set rst = Nothing

    Application.StatusBar = ""
End Sub

Я хочу получить из диапазона, который я хочу, те, у которых нет слова «Штамп» и любую другую дату за пределами диапазона.

1 Ответ

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

По сути, ваша логика OR и AND сливаются друг с другом.Вы должны включить круглые скобки вокруг условий OR, чтобы они рассматривали одно отдельное условие включительно с другими условиями AND.

Кроме того, нет причин для объединения SQL в VBA.Date(), Time(), Now() доступны в MS Access SQL:

myQuery = "SELECT ORDER, [PART NUMBER], [DEPT RESP], [AREA RESP], [START DATE]" _
            & " FROM INITIAL_PHASE" _
            & " WHERE ([PLANNER NAME] = 'Homer' OR [PLANNER NAME] = 'Bart' OR [PLANNER NAME] = 'Marge')" _
            & "   AND [AREA RESP] <> 'Stamping'" _
            & "   AND [START DATE] BETWEEN Date() AND Date() + 30" _
            & "   AND [PART NUMBER] NOT LIKE '%R'" _
            & " ORDER BY [START DATE]"

Еще лучше, потому что это чистый запрос SQL, и вы используете предложения WHERE и ORDER BY, которые могутбыть в состоянии индексировать, сохранить ваш запрос как хранимый запрос MS Access и избегать любого SQL в VBA.Хранимые запросы более эффективны, чем строковые SQL, запускаемые на лету, поскольку механизм Access сохраняет лучший план выполнения для сохраненных запросов.

Set rst = New ADODB.Recordset
rst.Open "mySavedQuery", strConn, adOpenKeyset, adLockBatchOptimistic

ThisWorkbook.Sheets("DataSheet").Cells(2, "A").CopyFromRecordset rst

rst.Close
Set rst = Nothing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...