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