【问题标题】:Limit number of records allowed限制允许的记录数
【发布时间】:2018-03-22 09:41:55
【问题描述】:

我有一个表格“tbdetails”,用于保存学生的详细信息。简而言之,我想将表限制为最多只能容纳 10 条记录。我的表格“frmDetails”有以下 OnCurrent 事件,但它不起作用:

Private Sub Form_Current()
   Forms(Detail).MaxRecords = 10
End Sub

我在网上查了一下,发现但我可以很容易地插入 11 和 12 条记录。欢迎任何答案,不需要 VBA(如果可以不用它)可以简单地从属性菜单或其他东西中完成吗?


编辑:

现在当我保存时,我得到了

运行时错误 438:对象不支持此属性或方法

所以这里肯定有问题

【问题讨论】:

  • 不起作用是什么意思?
  • 创建一个自动编号字段。将表验证属性设置为 [field]
  • @QHarr 我的意思是它并没有阻止我输入超过 10 条记录
  • @QHarr 但是使用自动编号,如果我删除记录自动编号不会重置增量。因此,如果删除所有记录并重新开始,我将无法放入任何学生。
  • 说得好。 @AshleeDawg 这是你的舞台。

标签: database vba ms-access max record


【解决方案1】:
Private Sub Form_Current()

    Me.AllowAdditions = (Nz(DCount("[IDFieldName]","[TableName]",""),0)<10)

End Sub

基于 cmets 似乎这就足够了:

Me.AllowAdditions = (DCount("[IDFieldName]","[TableName]")<10)

【讨论】:

  • 如果您没有为 DCount 函数设置任何条件,则不需要空括号 ""
  • 也不需要NzDCount 永远不应返回 Null(如果不存在记录则返回 0)
  • @ErikvonAsmuth 是的,但看起来只是一种预防措施。我可能会删除所有记录并重新开始
  • @USERNNNNN 你看了我的评论了吗?你不需要它,即使你删除了所有记录......
  • @Eric von Asmuth 我知道如果没有基于标准的记录,如果表本身根本没有记录并且当时无法测试,我不确定它会做什么,所以我选择了安全的方式。
【解决方案2】:

“我想限制表格最多只能容纳 10 条记录。”

对表应用检查约束,使其接受的行数不超过 10。

创建一次性程序并运行一次...

Public Sub limit_rows()
    Dim strSql As String
    strSql = "ALTER TABLE tblDetails" & vbCrLf & _
        "ADD CONSTRAINT 10_rows_max" & vbCrLf & _
        "CHECK ((SELECT Count(*) FROM tblDetails) < 11);"
    Debug.Print strSql
    CurrentProject.Connection.Execute strSql
End Sub

【讨论】:

  • 这是一个有趣的方法。从未在 Access 中使用过约束;通常使用 SQL server 作为实际的 DBMS,Access 作为前端。我看到的一个潜在问题是,这种方法只会引发错误,而其他方法只会禁用 UI 以添加记录。
【解决方案3】:

还需要一点时间。

查看内嵌 cmets 的用法:

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, 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

【讨论】:

  • 那也没用;我只是额外添加了 2、3 条记录,但什么也没发生。
  • @Gustav 您没有完全加载记录集(.RecordCount 之前没有.MoveLast)。这可能会导致不一致的行为(尽管很难相信只有 10 条记录)。
  • @ErikvonAsmuth:不在我的测试中,通常 RecordsetClone 已满载。但你永远无法分辨。
【解决方案4】:

如果你想限制某种形式的表中可以添加的记录总数,可以使用以下代码:

Private Sub Form_Current()
    Dim rs As DAO.Recordset
    Set rs = Me.RecordsetClone 'Clone because we don't want to move the current record
    If Not rs.EOF Then rs.MoveLast 'Initialize recordset
    If rs.RecordCount >= 10 Then
        Me.AllowAdditions = False
    Else
        Me.AllowAdditions = True
    End If
End Sub

【讨论】:

  • 为什么是记录集?只需If Me.Recordset.RecordCount &gt;= 10 Then Me.AllowAdditions = False 即可。你用它来确保RecordCount 有效吗?
  • 当前记录集可能未完全初始化。在这种情况下,RecordCount 可能太低了。这是为了确保RecordCount 是准确的。
  • 是的,我坚持这一点。有时 RecordCount 甚至在 Recordset 对象中也会失败,我们必须做 MoveLast,MoveFirst 的事情。但可能,只有 10 条记录的表,不确定它是否值得。无论如何,您的代码工作完美! :)
  • 说是否可以使用一个整数,每次添加记录时递增,并且不允许自己的值超过10?
  • 这是一个完全不同的问题(不推荐,因为您会重复使用相同的数字)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
相关资源
最近更新 更多