VBA Access получает RowSource для поиска значений поиска

VBA нуб здесь (по состоянию на этот траур),

В MS Access я написал тестовую функцию, чтобы найти значение базы записей по некоторым критериям, которые вы проходите.

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

По сути, он может возвращать "19", а 19 соответствует некоторому другому табличному значению.

Кажется, что RowSource столбца - это то, что я ищу, поэтому я могу сделать второй запрос, чтобы найти истинное значение.

Может ли кто-нибудь указать мне правильное направление при поиске RowSource, если я знаю имя столбца и затем использую его, чтобы найти значение Im после?

Редактировать: Кажется, что я не объясняю себя четко, вот картина того, что я пытаюсь получить программно

2 ответа

Решение

Попробуйте это - я думаю, что я наконец понимаю, почему вы ищете RowSource - извините, я сначала не "получил" его. Поле, которое вы пытаетесь выбрать, является внешним ключом в таблице описания.

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

Он основан на вашем исходном коде, а не на изменениях, предложенных @ron, но он должен направить вас в правильном направлении. Вы должны исправить это, чтобы сделать его параметризованным, и разрешить вариантные типы данных, как предполагает Рон (+1 рон)

В сторону, используйте амперсанд (&) соединять строки в VBA, чтобы избежать таких вещей: abc = "1" + 1где abc теперь равен 2 вместо "11", как и следовало ожидать, если бы оба элемента были предназначены для строк.

Public Function lookUpColumnValue(Database As Database, column As String, table As String, lookUpColumn As String, lookUpValue As String) As String

    Dim sql As String
    Dim recordSet As DAO.recordSet
    Dim result As String

    lookUpColumnValue = "" 'Return a blank string if no result

    On Error Resume Next

    sql = "SELECT [" & table & "].[" & column & "] FROM [" & table & "] WHERE [" & table & "].[" & lookUpColumn & "] = '" & lookUpValue & "'"
    Set recordSet = Database.OpenRecordset(sql)

    If Not recordSet.EOF Then
        Dim td As DAO.TableDef

        'this gives your number - say, 19
        result = recordSet(column)

        Set td = Database.TableDefs(table)

        'Get the rowsource
        Dim p As DAO.Property
        For Each p In td.Fields(column).Properties
            If p.Name = "RowSource" Then
                RowSource = Replace(td.Fields(column).Properties("RowSource"), ";", "")
                Exit For
            End If
        Next

        If Not RowSource = "" Then
            Dim rs2 As DAO.recordSet
            Dim qd As DAO.QueryDef

            Set qd = Database.CreateQueryDef("", RowSource)
            Set rs2 = Database.OpenRecordset(RowSource)

            If rs2.EOF Then Exit Function

            PKField = rs2.Fields(0).Name

            rs2.Close
            qd.Close

            sql = "SELECT * FROM (" & RowSource & ") WHERE [" & PKField & "]=[KeyField?]"
            Set qd = Database.CreateQueryDef("", sql)
            qd.Parameters("KeyField?").Value = result

            Set rs2 = qd.OpenRecordset()

            If Not rs2.EOF Then
                'NOTE: This assumes your RowSource *always* has ID first, description 2nd.  This should usually be the case.
                lookUpColumnValue = rs2.Fields(1)
            End If
        Else
            'Return the field value if there is no RowSource
            lookUpColumnValue = recordSet.Fields(column)
        End If
    End If

End Function

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

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

Public Function lookUpColumnValue( _
    database As DAO.database, _
    column As String, _
    table As String, _
    lookUpColumn As String, _
    lookUpValue As Variant) As String

    Dim sql As String
    Dim recordSet As DAO.recordSet
    Dim result As String
    Dim qd As QueryDef
    Set qd = database.CreateQueryDef("")
    sql = "SELECT [" + table + "].[" + column + "] FROM [" + table + "] " & _
          "WHERE [" + table + "].[" + lookUpColumn + "] = [parm1];"
    qd.sql = sql
    qd.Parameters![parm1] = lookUpValue
    Set recordSet = qd.OpenRecordset()

    result = recordSet(column)

РЕДАКТИРОВАТЬ

    lookUpColumnValue = DLookup("Space Use Description", "Space Use Codes", result)


End Function
Другие вопросы по тегам