Подформа фильтра доступа MS (DataSheet) с другой подчиненной формой (список) - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть проект, который нужно выполнить в MS Access 2016, и я наткнулся на проблему, которую легко решить, однако я понятия не имею, как это сделать.

База данных, которую я разрабатываю, основана на огромной нефильтрованной таблице данных, экспортированной другой базой данных. У меня есть основная форма headview, в которой я разместил две подчиненные формы listview и detailview. listview отсортировано по списку.

Теперь о том, что «должно» произойти: если вы нажмете на запись указанного listview, detailview отобразит дополнительную информацию о нажатой записи.

Обе подчиненные формы основаны на одном листе данных. Поэтому я попытался сопоставить их с помощью записей первичного ключа. Однако это не сработало. Подформа detailview все еще пуста. Я также попытался написать макрос vba для listview с listview.click(), который тоже не работал.

Есть ли способ соединить эти две подформы в основной форме? Если да, то как мне это сделать?

Я рад за любой ответ,

Хорошего дня -Ninsa

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Учитывая, что ваше поле идентификатора источника данных равно ID, а элемент управления подчиненной формы с именем DetailSubformControl, этот пример работает.

Поместите этот код в событие Form_Current подчиненной формы просмотра списка (которое запускается для каждой записи, к которой вы перемещаетесь):

Private Sub Form_Current()
    ' Set a reference to the detail subform control
    With Me.Parent.DetailSubformControl
        ' Set the filter of its contained form to the current ID of the listview.
        ' The "'" are only necessary if it is a text and not a numeric field.
        .Form.Filter = "[ID] = '" & Me.ID.Value & "'"
        .Form.FilterOn = True
    End With
End Sub
0 голосов
/ 01 ноября 2018

Хорошо, наконец-то я получил причину ошибки 2455, это проблема синхронизации.

Когда процедура Form_Current формы списка вызывается в первый раз, подчиненная форма детали еще не привязана к элементу управления подчиненной формы детали, что вызывает ошибку.

Возможные решения

Опция 1: игнорировать ошибку 2455

Либо добавьте On Error Resume Next в начало процедуры Form_Current, либо перепишите ее, чтобы обработать эту конкретную ошибку 2455:

Private Sub Form_Current()
    On Error GoTo Catch

    With Me.Parent.DetailSubformControl.Form
        .Filter = "[ID] = '" & Me.ID.Value & "'"
        .FilterOn = True
    End With

Finally:
    Exit Sub

Catch:
    If Err.Number = 2455 Then Resume Finally
    MsgBox Err.Number & "(" & Err.Description & ") occured.", vbExclamation, "Attention"
    Resume Finally
End Sub

Option2: управление исходными объектами элементов управления подчиненной формы

Очистите свойство Source Object элементов управления подчиненной формы в форме заголовка и задайте их явным образом при загрузке формы заголовка.

Это вообще предотвращает неудачный выбор времени.

Итак, в заголовке процедуры загрузки событий добавьте это:

Private Sub Form_Load()
    Me.DetailSubformControl.SourceObject = "Table1Detail"
    Me.DatasheetSubformControl.SourceObject = "Table1Datasheet"
End Sub

Вариант 3: Использовать Мастер ссылок / Дочерние поля

Вы можете использовать свойства Link Master Fields и Link Child Fields элемента управления подчиненной детали.

Для этого вам нужно создать текстовое поле с именем ID в форме заголовка и для косметических аспектов скрыть его, установив его свойство Visible в False.

Этот новый элемент управления будет связан с элементом управления подчиненной формы: Задайте для свойства Link Master Fields и Link Child Fields элемента управления подчиненной формы детализации в форме заголовка значение ID.

Процедура Form_Current формы списка содержит только следующее:

Private Sub Form_Current()
    ' Set the value of the hidden control 'ID' on the head form,
    ' which is bound to the detail subform control, to the selected ID.
    Me.Parent.ID.Value = Me.ID.Value
End Sub
0 голосов
/ 01 ноября 2018

Вы должны обработать фильтрацию detailview для события Listview_Current. Это событие срабатывает, как только Listview меняет записи.

Вы можете либо установить обработчик события для события Listview_Current в модуле формы списка, либо использовать WithEvents в родительской форме для прослушивания этого конкретного события.

Если вы выберете последнее, обратите внимание, что требуется, чтобы Listview имел модуль формы, иначе события не сработают.

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