Ms Access Сохранить запись в подчиненной - PullRequest
5 голосов
/ 13 апреля 2010

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

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

Казалось бы, идеальным решением было бы поместить что-то в событие OnChange элемента управления вкладкой, чтобы убедиться, что все данные сохранены. Это мой вопрос, как мне сохранить запись в подчиненной форме?

Ответы [ 4 ]

2 голосов
/ 14 апреля 2010

Вам вообще ничего не нужно делать, поскольку подчиненная форма сохраняется, как только теряет фокус (когда изменяется элемент управления вкладками).

Но в качестве упражнения я обрисовал код, который вы написали бы, если бы вам было нужно.

Вы можете сохранить любую форму, установив для свойства .Dirty значение False. Для чего-то такого, что будет много работать, я думаю, я бы написал подпрограмму, чтобы пройтись по подчиненным формам, проверить, нет ли в них грязных, и сохранить грязные. Как то так:

  Public Sub SaveSubFormsOnTab()
    Dim pge As Control
    Dim ctl As Control

    For Each pge In Me!ctlTab.Pages
      Debug.Print pge.Name
      For Each ctl In pge.Controls
        If ctl.ControlType = acSubform Then
           If ctl.Form.Dirty Then
              ctl.Form.Dirty = False
           End If
           Debug.Print ctl.Name
        End If
      Next ctl
    Next pge
    Set ctl = Nothing
    Set pge = Nothing
  End Sub

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

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

2 голосов
/ 13 апреля 2010

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

1 голос
/ 24 ноября 2015

У меня была похожая проблема, когда мне требовался различный код для выполнения в подчиненной форме, а значения в основной форме, основанные на значениях в подчиненной форме, для пересчета. Вот что наконец сработало:

Это пример с основной формой с именем «frmCustomers», содержащей подчиненную форму «sfmTransaction», которая, в свою очередь, имеет подчиненную форму с именем «sfmOrderLine». В формах есть кнопка «cmdSave», которая видна только тогда, когда пользователь нажимает кнопку «cmdEdit» (цель которой - заблокировать все элементы управления до тех пор, пока пользователь не нажмет кнопку «Редактировать», а затем снова заблокировать их при нажатии сохранить):

В главной форме ('frmCustomer') перейдите к событию выхода подчиненной формы и добавьте 'me.recalc' дважды , например:

Private Sub sfmTransaction_Exit(Cancel As Integer)
    If (Not Form_sfmTransaction.NewRecord And Form_sfmTransaction.cmdSave.Visible) Or (Not Form_sfmOrderLine.NewRecord And Form_sfmOrderLine.cmdSave.Visible) Then
        'To save subforms
        Me.Recalc
        Me.Recalc
    End If
End Sub

В подчиненной форме ('sfmTransaction') перейдите к событию выхода подчиненной формы подчиненной формы и добавьте 'me.recalc' дважды , например:

Private Sub sfmOrderLine_Exit(Cancel As Integer)
    If Not Form_sfmOrderLine.NewRecord And Form_sfmOrderLine.cmdSave.Visible Then
        'To save subform
        Me.Recalc
        Me.Recalc
    End If
End Sub

Надеюсь, это поможет.

0 голосов
/ 06 июля 2011

Установка для свойства dirty значения false может заставить Access сохранять данные в базе данных, но это обходит событие before_update. Это означает, что если вы использовали это событие для проверки или для других целей, теперь у вас могут быть неверные данные в вашей базе данных.

...