【问题标题】:Access: A query that resets the autonumbering访问:重置自动编号的查询
【发布时间】:2019-01-16 07:10:09
【问题描述】:

我的数据库是为滑雪比赛而设计的。这个想法是,您可以填写人们滑雪的时间,数据库会根据首先设置时间的人、您的性别和年龄自动计算您获得的奖牌类型。我制作了一个表格,让它能够注册并给出所有结果。

我现在唯一遇到的问题是在注册某人时,必须按年​​龄订购。我这样做了,但现在自动编号都搞砸了。

我想要的是我可以输入所有竞争对手的名字,然后我想要一个我可以选择的查询来分配所有的起始号码。即使已经分配了号码,我也想重置它并在最近有人加入时再次分配它们。我不想删除自动编号字段并重新创建它,因为大多数时候我自己不会使用它,但其他人会使用它,所以我想简单地按下分配它的按钮。

提前致谢!

Example how my database and a competition looks like

【问题讨论】:

  • 在规范化环境中,tijd 将存储在单独的表中
  • 向我们展示您尝试解决此问题的示例
  • 我对访问不太熟悉,所以我用谷歌搜索了它,但没有找到很多。我尝试了什么:使用 UPDATE 进行查询,并在每个人都注册后进行分配号码的查询。但两者都没有像我希望的那样成功。

标签: ms-access autonumber


【解决方案1】:

自动编号字段仅用于识别记录。不多不少。

您需要的是一个Priority(或Rank)字段。

在显示记录的表单中,为该字段运行如下代码:

Private Sub Priority_AfterUpdate()

    Dim rst             As DAO.Recordset
    Dim lngId           As Long
    Dim lngPriorityNew  As Long
    Dim lngPriorityFix  As Long

    ' Save record.
    Me.Dirty = False

    ' Prepare form.
    DoCmd.Hourglass True
    Me.Repaint
    Me.Painting = False

    ' Current Id and priority.
    lngId = Me!Id.Value
    lngPriorityFix = Nz(Me!Priority.Value, 0)
    If lngPriorityFix <= 0 Then
        lngPriorityFix = 1
        Me!Priority.Value = lngPriorityFix
        Me.Dirty = False
    End If

    ' Rebuild priority list.
    Set rst = Me.RecordsetClone
    rst.MoveFirst
    While rst.EOF = False
        If rst!Id.Value <> lngId Then
            lngPriorityNew = lngPriorityNew + 1
            If lngPriorityNew = lngPriorityFix Then
                ' Move this record to next lower priority.
                lngPriorityNew = lngPriorityNew + 1
            End If
            If Nz(rst!Priority.Value, 0) = lngPriorityNew Then
                ' Priority hasn't changed for this record.
            Else
                ' Assign new priority.
                rst.Edit
                    rst!Priority.Value = lngPriorityNew
                rst.Update
            End If
        End If
        rst.MoveNext
    Wend

    ' Reorder form and relocate record.
    Me.Requery
    Set rst = Me.RecordsetClone
    rst.FindFirst "Id = " & lngId & ""
    Me.Bookmark = rst.Bookmark

    ' Present form.
    Me.Painting = True
    DoCmd.Hourglass False

    Set rst = Nothing

End Sub

只需为任何记录分配等级,记录将在需要时重新编号。

【讨论】:

  • 感谢您的回复!正如我上面所说,我对访问并不是很熟悉......你能更具体一点,我可以在哪里以及如何实现这段代码吗?
  • 我发现此链接上接受的答案排名相当充分。不过,不确定它会如何处理抢七局。 stackoverflow.com/questions/4463116/…
  • 它是您使用的表单的代码隐藏。将数据类型为 Integer 的名为 Priority 的字段添加到表中,将其包含在表单中,并将代码作为绑定到该字段的文本框的 AfterUpdate 事件插入。
  • @DarrenBartrup-Cook:诀窍是将ID-Rank匹配添加到集合中一次,然后无论您如何浏览表单,读取排名都非常快速。
  • 所以@Gustav,当您提到更新后,您的意思是在宏中使用它吗?至少这是我在谷歌上得到的结果......
猜你喜欢
  • 2021-02-21
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 2013-12-17
  • 2015-10-05
  • 2016-03-30
相关资源
最近更新 更多