Пара Form / Query перестает работать, как только встроена в другую форму - PullRequest
1 голос
/ 04 мая 2020

[Работа в MS Access 2019 Professional Plus 2019. Однако это не имеет значения.]
Мои настройки можно сузить до этой иерархии, которая сама по себе прекрасно работает:

'------> Hierarchy of objects :

"myMainForm" contains :
    "select_client" (ComboBox based on "client" table)
    "select_status" (ComboBox based on "status" table)
    ' and some multi-select checkboxes that forbid use of Master/Child feature
    "mySubForm" 
        "Source Object" : "myQuery" ' "mySubForm" not saved with an explicit name, local to "myMainForm"

"mQuery" filters the table "course" :
    "client_ID" criteria : [Forms]![myMainForm]![select_client]
    "status_ID" criteria : [Forms]![myMainForm]![select_status]

'------> "myMainForm" VBA to requery on change (could be performed with Macros) :

Private Sub select_client_Change()
    Me!mySubForm.Requery
End Sub

Private Sub select_status_Change()
    Me!mySubForm.Requery
End Sub

Затем я пытаюсь встроить «myMainForm» в форму более высокого уровня (скажем, «myNavForm»):

"myNavForm" contains :
    "myMainForm" contains :
        ' same as above from there
        "mySubForm"

Когда я пытаюсь запустить "myNavForm", меня просят ввести [Forms]![myMainForm]![select_client] и [Forms]![myMainForm]![select_status] и "myMainForm" перестает работать полностью.

Сначала я подумал, что проблема связана с тем, что значения ComboBox еще не загружаются при запуске "myQuery", поэтому я добавил следующий VBA в "myMainForm":

Private Sub Form_Load()
    Me!mySubForm.SourceObject = "Query.myQuery"
    Me!mySubForm.Requery
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Me!mySubForm.SourceObject = ""
End Sub

Но проблема остается той же. Я предполагаю, что это происходит из-за ошибки в области / пути на моей стороне, но я не могу понять это. Я пробовал абсолютные пути в "myQuery", как вы можете видеть выше. Я также пытался использовать относительные пути с .Parent, но не мог заставить "myMainForm" работать с ним (даже без встраивания в "myNavForm").

Поэтому я застрял и облажался и отчаялся, и я хочу моя среда Node / MongoDB вернулась, но я должен сделать это в Access (не спрашивайте!).

Есть идеи, как заставить это работать с встраиванием? В максимально возможной степени я предпочел бы придерживаться этой настройки и избегать ввода более сложных VBA (синтаксис вызывает у меня головную боль), но я открыт для этого, если необходимо; -)

Thx для любого вида помогите освободить меня от этого кошмара!


[РЕД. Решение работает безупречно:

'------> Hierarchy of objects :

"myMainForm" contains :
    "select_client" '(ComboBox based on "client" table)
    "select_status" '(ComboBox based on "status" table)
    "mySubForm" 
        "Source Object" : "myQuery" 'remove all criteria from the query !

' ------> Handle the rest in VBA :

'Lets write this only once...
Private Sub updateResult()
    mySubForm.Form.Filter = "client_ID=" & select_client & " AND status_ID=" & select_status
    mySubForm.Form.FilterOn = True
End Sub

'Apply filter with default values upon loading
Private Sub mySubForm_Current()
    updateResult
End Sub

'Update filter whenever a control is updated
Private Sub select_client_AfterUpdate()
    updateResult
End Sub
Private Sub select_status_AfterUpdate()
    updateResult
End Sub

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

1 Ответ

2 голосов
/ 04 мая 2020

Это потому, что тогда у вашего select_client есть другой путь. Теперь это

[Forms]![myNavForm]![myMainForm].Form![select_status]

, где myMainForm теперь является подчиненным элементом управления. У него может быть другое имя, чем у содержащейся формы.

Вместо включения таких путей в запрос, попробуйте отфильтровать подчиненную форму следующим образом:

mySubForm.Form.Filter = "client_ID=" & select_client & " AND status_ID=" & select_status
mySubForm.Form.FilterOn = True

Это можно сделать в последующем обновлении. события этих двух полей и в форме события OnCurrent.

...