Как установить источник управления текстовым полем из SQL

У меня есть подчиненная форма, связанная с оператором SQL. Внутри подчиненной формы у меня есть несколько текстовых полей, привязанных к полям этого SQL. Однако у меня есть еще одно текстовое поле, которое нужно привязать к полю из другого оператора SQL с критериями из первого. Мой код выглядит следующим образом:

Dim subform As Object
Dim formFilter As String

formFilter = "SELECT * FROM my_table_1"
Set subform = Me!my_subform.Form    
subform.RecordSource = formFilter

subform.field1.ControlSource = "tb1f1"
subform.field2.ControlSource = "tb1f2"
...
subform.f3.ControlSource = "= SELECT TOP 1 tb2f3 FROM my_table_2 WHERE tb2f1 = '" & [tb1f1] & "' AND tb2f2 = '" & [tb1f2] "' ORDER BY tb2f4"

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

Заранее спасибо за вашу помощь.


person got2nosth    schedule 14.01.2014    source источник
comment
Это subform.f3 просто поле отображения?   -  person HelloW    schedule 15.01.2014
comment
@HelloW Да, это только для отображения. Я не намерен позволять пользователю редактировать эту форму напрямую.   -  person got2nosth    schedule 15.01.2014


Ответы (2)


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

subform.f3 = fGet_tb2f3([tb1f1], [tb1f2])

Затем код функции (поместите свою собственную обработку ошибок)

Public Function fGet_tb2f3(tblf1 as String,tblf2 as String) as String  
    Dim rst as dao.recordset
    Dim db as database
    set db = currentdb
    set rst = db.openrecordset("SELECT TOP 1 tb2f3 FROM my_table_2 WHERE tb2f1 = '" & tb1f1 & "' AND tb2f2 = '" & tb1f2 "' ORDER BY tb2f4",dbopensnapshot
    if not rst is nothing then
        if not rst.eof then fGet_tb2f3 = rst!tb2f3
        rst.close
        set rst = nothing
    end if
    db.close
    set db = nothing
end Function
person HelloW    schedule 15.01.2014
comment
@HellowW Спасибо за совет. Я попробовал ваш метод. Но доступ снова выдал ошибку 2465. Поле [tb1f1] и [tb1f2] не могут быть найдены в операторе subform.f3 = fGet_tb2f3([tb1f1], [tb1f2]). [tb1f1] и [tb1f2] — это всего лишь два поля из источника записи моей подчиненной формы. что я пропустил здесь? - person got2nosth; 16.01.2014
comment
@ got2nosth Поля, на которые вы ссылаетесь, находятся в подчиненной форме. Мой код этого не отражал. Является ли эта подформа каскадной формой или отдельной записью за раз? Если подчиненная форма представляет собой одну запись за раз, может быть лучше запустить этот код в подчиненной форме в событии on current. - person HelloW; 16.01.2014
comment
моя подчиненная форма - это таблица данных. Я попытался вызвать это в текущем событии. Я все равно получаю ошибку 2465, если делаю так Me.field4 = getLatestRemark([tb1f1], [tb1f2]). но, похоже, это сработает, если я установлю источник управления напрямую, как Me.field4.ControlSource = "=getLatestRemark([tb1f1], [tb1f2])". Однако теперь проблема заключается в том, что всякий раз, когда я щелкаю в любом месте подчиненной формы, столбец field4 обновляется. Есть ли способ отключить это действие обновления? - person got2nosth; 17.01.2014
comment
Мне удалось заставить это работать, когда я установил источник управления в форме события onLoad. Это правильный путь? - person got2nosth; 17.01.2014
comment
Трудно понять, если я не понимаю больше о контексте данных и о том, какую проблему вы пытаетесь решить. Возможно, было бы лучше сделать мысленную пометку, чтобы проверить и убедиться, что такое поведение желательно. - person HelloW; 17.01.2014
comment
Спасибо. Я уже вполне доволен этим результатом. Он работает так, как я ожидал. - person got2nosth; 17.01.2014

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

Для этого вам нужно будет создать второй набор записей и получить в нем это значение. Что-то вроде:

Dim db as Database
Dim rec as Recordset

Set db = CurrentDB
Set rec = db.OpenRecordset("SELECT TOP 1 tb2f3 FROM my_table_2 WHERE tb2f1 = '" & [tb1f1] & "' AND tb2f2 = '" & [tb1f2] "' ORDER BY tb2f4")

Me.MyControlName = rec(0)
person Johnny Bones    schedule 14.01.2014
comment
Спасибо, что поделились. Но я получил ошибку времени выполнения 2465 здесь. Кажется, Access не может правильно ссылаться на мои поля [tb1f1] и [tb1f2] в операторе OpenRecordset. Вот мой код Set db = CurrentDb Set rs = db.OpenRecordset("SELECT TOP 1 root_cause FROM Shipment_Remark " _ & "WHERE plant = '" & [plant] & "' AND shipment_no = '" & [shipment_no] & "' ORDER BY update_time DESC") subform.text_root_cause_field.ControlSource = rs(0) [завод] и [shipment_no] — два поля из источника записей моей подчиненной формы. - person got2nosth; 15.01.2014