Как запросить подчиненную форму из другой формы? - PullRequest
11 голосов
/ 18 декабря 2009

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

У меня есть две формы в Access 2007 давайте назовем их MainForm и EntryForm.
MainForm имеет подчиненную форму и кнопку. Кнопка открывает EntryForm в режиме добавления. Я хочу, чтобы EntryForm сохранил новую запись, он обновил бы (запросил) подчиненную форму в 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

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

Ответы [ 6 ]

14 голосов
/ 18 декабря 2009

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

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

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

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

Подробнее: http://www.mvps.org/access/forms/frm0031.htm

9 голосов
/ 19 декабря 2009

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

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

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

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

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

2 голосов
/ 18 апреля 2013

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

Me.subformname.Requery

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

0 голосов
/ 13 октября 2018

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

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

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

0 голосов
/ 25 июня 2018

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

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

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

Нет необходимости в обновлении, повторном вызове, запросе и т. Д. ...

0 голосов
/ 21 февраля 2013

При закрытии и открытии основная форма обычно выполняет все связанные запросы (включая связанные с подчиненной формой). У меня была похожая проблема, и я решил ее, добавив следующее к кнопке «Сохранить команду» при событии щелчка.

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