Ограничение появления новой записи в непрерывной форме MS Access

#vba #ms-access

#vba #ms-access

Вопрос:

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

Итак, у меня есть некоторые события, устанавливающие включение / выключение Me.AllowAdditions, и такого рода работы, за исключением:

При вставке третьей записи, насколько я могу судить, появление «новой» новой записи происходит перед всем, к чему я хотел бы подключиться (AfterUpdate или AfterInsert). Еще нет даже третьей записи, чтобы отключить Me.AllowAdditions, поэтому, даже если я отключу ее в BeforeInsert / BeforeUpdate, я не собираюсь завершать свою вставку. Отключение AfterUpdate работает, но это срабатывает только тогда, когда я отключаю элемент управления, что приводит к завершению вставки.

Есть ли способ остановить появление следующего нового слота записи до завершения вставки? Единственная оставшаяся тактика, о которой я могу думать, — это принудительная вставка ASAP перед обычным триггером, но, насколько я понимаю, это не очень хорошее поведение.

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

Ответ №1:

Это можно сделать с помощью этой функции, где вы настраиваете RecordsMax на 3:

 Public Sub SetFormAllowAdditions( _
    ByVal frm As Form, _
    Optional ByVal RecordCountMax As Long = 1)
  
' Limit count of records in (sub)form to that of RecordCountMax.
' 2016-10-26, Gustav Brock, Cactus Data ApS, CPH
'
' Call in (sub)form:
'
'   Private Sub LimitRecords()
'       Const RecordsMax As Long = 5
'       Call SetFormAllowAdditions(Me.Form, RecordsMax)
'   End Sub
'
'   Private Sub Form_AfterDelConfirm(Status As Integer)
'       Call LimitRecords
'   End Sub
'
'   Private Sub Form_AfterInsert()
'       Call LimitRecords
'   End Sub
'
'   Private Sub Form_Current()
'       Call LimitRecords
'   End Sub
'
'   Private Sub Form_Open(Cancel As Integer)
'       Call LimitRecords
'   End Sub
'
' If the record count of a subform is to be limited, also
' the parent form must be adjusted:
'
'   Private Sub Form_Current()
'       Call SetFormAllowAdditions(Me.Form)
'   End Sub
'

    Dim AllowAdditions  As Boolean
    
    With frm
        AllowAdditions = (.RecordsetClone.RecordCount < RecordCountMax)
        If AllowAdditions <> .AllowAdditions Then
            .AllowAdditions = AllowAdditions
        End If
    End With

End Sub
  

Пожалуйста, изучите встроенные комментарии по использованию и реализации.

Комментарии:

1. Спасибо за ответ, но это не работает. По сути, это то, что я пробовал. Во время вставки, пока у меня есть ожидающая вставка (после того, как пользователь внес запись, поэтому с точки зрения пользователя они завершили действие), после срабатывания Form_BeforeInsert() следующая новая запись уже нарисована. Это задолго до срабатывания Form_AfterInsert().

2. Да, но оно исчезает при последующей вставке. У вас не может быть формы, которая одновременно разрешает и не разрешает вставки.

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