Как требовать подчиненную форму из другой формы?

Я борюсь с этой проблемой самостоятельно, затем с некоторой помощью, а затем ищите ее; но мне не повезло. Поэтому я решил спросить.

У меня две формы в Access 2007 позволяют называть их MainForm и EntryForm.
MainForm имеет подчиненную форму и кнопку. Кнопка открывает EntryForm в режиме добавления. То, что я хочу сделать, - это когда EntryForm сохраняет новую запись, которую он обновил (requery) подформат в MainForm.

Я попробовал этот установочный код

Private Sub cmdSaveAndClose_Click()
    DoCmd.Save

    'requery list
    Forms![MainForm]![subformName].Requery

    '' I've also tried these
    'Forms![MainForm]![subformName].Form.Requery
    'Forms.("MainForm").[subformName].Requery
    'Forms.("MainForm").[subformName].Form.Requery


    DoCmd.Close
End Sub

Ни одна из этих попыток не работает. Есть ли способ сделать это требование? Благодарим за помощь заранее.

Ответ 1

Просто комментарий о методе выполнения этого:

Вы делаете свой EntryForm постоянно привязанным к форме, из которой вы ее вызываете. Я думаю, что лучше не иметь формы, связанные с таким контекстом. Я удаляю запрос из процедуры "Сохранить/закрыть" и вместо этого открываю EntryForm с помощью переключателя acDialog:

  DoCmd.OpenForm "EntryForm", , ,"[ID]=" & Me!SubForm.Form!ID, , acDialog
  Me!SubForm.Form.Requery

Таким образом, EntryForm не привязан к использованию в одном контексте. Альтернатива заключается в том, чтобы усложнить EntryForm тем, что известно, с какой формой его открыли и что нужно требовать. Я думаю, что лучше сохранить такую ​​вещь, как близко к контексту, в котором она использовалась, и сохранить код вызываемой формы как можно более простым.

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

Ответ 2

Вы должны использовать имя элемента управления подформы, а не название подформы, хотя они часто одинаковы:

 Forms![MainForm]![subform control name Name].Form.Requery

Или, если вы находитесь на главной форме:

 Me.[subform control name Name].Form.Requery

Дополнительная информация: http://www.mvps.org/access/forms/frm0031.htm

Ответ 3

Я попробовал несколько решений выше, но никто не решил мою проблему. Решение об обновлении подформы в форме после сохранения данных в базе данных:

Me.subformname.Requery

Это сработало для меня. Удачи.

Ответ 4

Закрывая и открывая, основная форма обычно выполняет все связанные запросы (включая связанные с подчиненными). У меня была аналогичная проблема и разрешил ее, добавив следующую кнопку Save Command в событие click.

DoCmd.Close acForm, "formname", acSaveYes
DoCmd.OpenForm "formname"

Ответ 5

У меня была похожая проблема, но с некоторыми отличиями...

В моем случае моя основная форма имеет элемент управления (поставщик), значение которого я использовал для обновления запроса в моей БД, используя следующий код:

Sub Set_Qry_PedidosRealizadosImportados_frm(Vd As Long)
Dim temp_qry As DAO.QueryDef

'Procedimento para ajustar o codigo do cliente na Qry_Pedidos realizados e importados
'Procedure to adjust the code of the client on Qry_Pedidos realizados e importados
Set temp_qry = CurrentDb.QueryDefs("Qry_Pedidos realizados e importados")
temp_qry.SQL = "SELECT DISTINCT " & _
            "[Qry_Pedidos distintos].[Codigo], " & _
            "[Qry_Pedidos distintos].[Razao social], " & _
            "COUNT([Qry_Pedidos distintos].[Pedido Avante]) As [Pedidos realizados], " & _
            "SUM(IIf(NZ([Qry_Pedidos distintos].[Pedido Flexx], 0) > 1, 1, 0)) As [Pedidos Importados] " & _
            "FROM [Qry_Pedidos distintos] " & _
            "WHERE [Qry_Pedidos distintos].Vd = " & Vd & _
            " Group BY " & _
            "[Qry_Pedidos distintos].[Razao social], " & _
            "[Qry_Pedidos distintos].[Codigo];"
End Sub

С самого начала моим источником записей подчиненной формы был запрос с именем "Qry_Pedidos realizados e importados".

Но единственный способ, которым я мог обновить данные подчиненной формы в основном контексте формы, - это обновить источник данных подчиненной формы до самого себя, как показано ниже:

Private Sub cmb_vendedor_v1_Exit(Cancel As Integer)
'Codigo para atualizar o comando SQL da query
'Code to update the SQL statement of the query 
    Call Set_Qry_Pedidosrealizadosimportados_frm(Me.cmb_vendedor_v1.Value)

'Codigo para forçar o Access a aceitar o novo comando SQL
'Code to force de Access to accept the new sql statement
    Me!Frm_Pedidos_realizados_importados.Form.RecordSource = "Qry_Pedidos realizados e importados"
End Sub

В конце концов, никаких обновлений, повторных вызовов, запросов и т.д. не требовалось...

Ответ 6

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

В моем случае я добавил несколько записей с помощью dbconn.execute "sql" и подумал, почему команда require в vba не работает. Когда я отлаживал, запрос работал. Добавлено 2-3-секундное ожидание в коде, прежде чем запрос только для проверки внес изменения.

Но изменение на 'currentdb.execute "sql"' решило проблему немедленно.

Ответ 7

Все ваши элементы управления принадлежат нам!

Фионнуала ответила правильно, но таким скиммерам, как я, было бы легко упустить момент.

Вы не обновляете подчиненную форму, вы обновляете подчиненную форму УПРАВЛЕНИЕ. На самом деле, если вы проверяете с помощью allforms(), subForm даже не загружается в отношении доступа.

В основной форме посмотрите на метку, предоставленную мастером подчиненной формы, или выберите подчиненную форму, щелкнув один раз или на границе вокруг нее, и посмотрите на "подпись" на вкладке "Другие" в свойствах. Это имя, которое вы используете для запроса, а не имя формы, отображаемой на панели навигации.

В моем случае у меня была подчиненная форма frmInvProdSub, и я много часов пытался выяснить, почему Access не думал, что она существует. Я сдался, удалил форму и заново создал ее. Самый последний шаг - сказать, как вы хотите назвать элемент управления, поэтому я назвал его frmInvProdSub и завершил работу мастера. Тогда я попробовал и вуаля, это сработало!

Когда я посмотрел на название формы в окне навигации, я понял, что забыл поставить "Sub" в названии! Это когда это щелкнуло. CONTROL называется frmInvProdSub, а не форма, и использование имени элемента управления работает.

Конечно, если оба имени идентичны, у вас не было этой проблемы.