Изменение предложения WHERE с использованием VBA на основе элемента управления формы - PullRequest
0 голосов
/ 26 апреля 2019

Итак, будучи новичком в доступе и только используя VBA в Excel, вплоть до того, как несколько месяцев назад у меня было довольно много команд, я абсолютно не знаю, как использовать / правильно писать синтаксис.

Проблема: Iиметь сохраненный запрос (qry_ExcelExport), который на данный момент просто:

SELECT '*' FROM tbl_Contacts

Что я хочу сделать, это использовать VBA, чтобы добавить / изменить предложение WHERE на основе элемента управления пользовательской формы.

Что-то вроде:

If me.txt_Flag = "DP Delegate" then 'WHERE [DP-DEL] = True' (or = -1)
Elseif me.txt_Flag = "DP Sponsor" then 'WHERE [DP-SPON] = True' (or = -1)

и так далее.(Я понимаю, что приведенный выше синтаксис неверен на 100%, это именно то, чего я надеюсь достичь)

Используя мощь интернета, мне удалось найти этот код:

    ‘To change the Where clause in a saved query  
    Dim qdf as QueryDef
    Dim db as Database
    Set db = CurrentDB
    Set qdf = db.QueryDefs("YourQueryName")
    qdf.SQL = ReplaceWhereClause(qdf.SQL, strYourNewWhereClause)
    set qdf = Nothing
    set db = Nothing

    Public Function ReplaceWhereClause(strSQL As Variant, strNewWHERE As Variant)
    On Error GoTo Error_Handler

    ‘This subroutine accepts a valid SQL string and Where clause, and
    ‘returns the same SQL statement with the original Where clause (if any)
    ‘replaced by the passed in Where clause.
    ‘
    ‘INPUT:
    ‘ strSQL valid SQL string to change
    ‘OUTPUT:
    ‘ strNewWHERE New WHERE clause to insert into SQL statement
    ‘
        Dim strSELECT As String, strWhere As String
        Dim strOrderBy As String, strGROUPBY As String, strHAVING As String

        Call ParseSQL(strSQL, strSELECT, strWhere, strOrderBy, _
            strGROUPBY, strHAVING)

        ReplaceWhereClause = strSELECT &""& strNewWHERE &""_
            & strGROUPBY &""& strHAVING &""& strOrderBy

        Exit_Procedure:
            Exit Function

        Error_Handler:
            MsgBox (Err.Number & ": " & Err.Description)
            Resume Exit_Procedure

    End Function

И эта первая строка ... эта самая первая строка «Чтобы изменить предложение Where в сохраненном запросе» указывает, что это ТОЧНО то, что мне нужно.

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

РЕДАКТИРОВАТЬ: сохраненный запрос qry_ExcelExportиспользуется в функции экспорта данных

Call exportTable("qry_ExportExcel")

Куда я звоню

Public Sub exportTable(tName As String)
    DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, tName, saveFileAs, True
End Sub

Мне нужна возможность изменить местоположение, чтобы при экспорте оно включало это условие, как вв тот момент, когда нет предложения WHERE, поэтому экспорт просто берет все данные.

1 Ответ

3 голосов
/ 26 апреля 2019

Обычно не нужно и не нужно изменять сохраненные запросы для фильтрации.

Вместо этого вы применяете фильтр к форме:

If me.txt_Flag = "DP Delegate" then 
    strFilter = "[DP-DEL] = True"
Elseif me.txt_Flag = "DP Sponsor" then 
    strFilter = "[DP-SPON] = True"
Else
    strFilter = ""
End If

Me.Filter = strFilter
Me.FilterOn = (strFilter <> "")

Или, если вам нужен запросдля чего-то еще вы можете применить фильтр к запросу.

Set rs = DB.OpenRecordset("Select * From MySavedQuery Where " & strFilter)

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

Если запрос используется для экспорта, это фактически одна из немногих ситуаций, где изменение запроса полезно.

Если запрос так же прост, как и в вашем вопросе, вы можете просто установить полный SQL:

strSql = "SELECT * FROM tbl_Contacts WHERE " & strFilter
db.QueryDefs("qry_ExportExcel").SQL = strSql
Call exportTable("qry_ExportExcel")

или если базовый запрос более сложныйиспользуйте два запроса: постоянный (qry_ExportExcel_Base) и динамический (qry_ExportExcel)

strSql = "SELECT * FROM qry_ExportExcel_Base WHERE " & strFilter

и т. д.как указано выше

...