#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. Да, это моя дилемма. Поскольку я не думаю, что отображение поля, которое затем волшебным образом исчезает, хорошо выглядит, я думаю, мне придется отказаться от непрерывной формы.