Ms access 插入记录并重新排列主键-Access 2013 VBA

Ms access 插入记录并重新排列主键-Access 2013 VBA,ms-access,vba,Ms Access,Vba,我是一个非常棒的Visual Basic noob。。。我正在尝试在我的访问表单上创建一个按钮,该按钮可以创建一条记录,并对非自动递增主键重新排序,以便将该记录插入记录列表中我想要的位置 目前,要执行此操作,我1)打开表,2)使用自动热键键盘宏手动编辑从最后一条记录到要插入新记录的位置的主键号,3)在列表底部创建一条新记录(主键列中有适当的值),然后4)右键单击该列并“从最小到最大排序”,最后5)使用第二个AutoHotKey宏将主键从新记录重新排序到列表末尾 我想要一个命令按钮,它允许我只需单

我是一个非常棒的Visual Basic noob。。。我正在尝试在我的访问表单上创建一个按钮,该按钮可以创建一条记录,并对非自动递增主键重新排序,以便将该记录插入记录列表中我想要的位置

目前,要执行此操作,我1)打开表,2)使用自动热键键盘宏手动编辑从最后一条记录到要插入新记录的位置的主键号,3)在列表底部创建一条新记录(主键列中有适当的值),然后4)右键单击该列并“从最小到最大排序”,最后5)使用第二个AutoHotKey宏将主键从新记录重新排序到列表末尾

我想要一个命令按钮,它允许我只需单击一下就可以完成同样的操作

该数据库目前有897条记录-使用我目前使用的方法在#185处添加一条新记录似乎很乏味,而VBA中的FOR/NEXT(Step-1)循环似乎效率更高

我使用的一些名称:

  • 表单名称:[动画输入表单]
  • 表名:[DVD和蓝光]
  • 主键名称:[AIN#]

您可以这样做-其中字段名为Priority,并且您正在使用此字段的AfterUpdate事件:

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
Private次优先级\u AfterUpdate()
将rst设置为DAO.Recordset
暗淡的长
暗lngPriorityNew尽可能长
变暗lngPriorityFix,长度为
'保存记录。
我,肮脏=虚假
“准备表格。
沙漏真的吗
我,重新油漆
我,画=假
'当前Id和优先级。
lngId=Me!Id.Value
lngPriorityFix=Nz(Me!Priority.Value,0)

如果lngPriorityFix那么,尽管有抗议,我还是想出了一个解决方案。这是一种不好的做法吗?可能吧-但我的数据库是我的,我会按照我想要的方式设置它

也许在某个时候,如果集合变得如此之大以致于此方法变得效率低下,我总是可以添加一个新列,使其自动递增,并将其设置为主键,然后从那里开始

在那之前

Private Sub Command101_Click()

    Dim CurrentRecord As Integer
    Dim LastRecord As Integer
    Dim NewRecord As Integer

'Pause screen and show it's busy
        DoCmd.Hourglass True
        Me.Painting = False

'just create new record at end of list if that's where you are
    If AIN = DMax("AIN", "DVDs and Blu Rays") Then
        CurrentRecord = AIN
        DoCmd.GoToRecord , , acNewRec
        AIN = CurrentRecord + 1
        DoCmd.RunCommand acCmdSaveRecord

    Else
'Save the current record value
        CurrentRecord = AIN

'Create new record at the end of list and give it a new record number
        DoCmd.RunCommand acCmdRecordsGoToLast
        LastRecord = AIN
        DoCmd.GoToRecord , , acNewRec
        AIN = LastRecord + 1
        DoCmd.RunCommand acCmdSaveRecord

'Increment all records by one working backwards from end to current record
        While AIN <> CurrentRecord
            AIN = AIN + 1
            DoCmd.RunCommand acCmdSaveRecord
            DoCmd.GoToRecord , , acPrevious
        Wend

'Return to last record and insert it after the current record
        DoCmd.RunCommand acCmdRecordsGoToLast
        AIN = CurrentRecord + 1
        DoCmd.RunCommand acCmdSaveRecord

'Unpause screen
        Me.Painting = True
        DoCmd.Hourglass False

'Refresh the form so new record is in correct location and open it
        Me.Requery
        DoCmd.GoToRecord , , acGoTo, CurrentRecord + 1
    End If
End Sub
Private子命令101_Click()
将CurrentRecord设置为整数
将LastRecord设置为整数
将NewRecord设置为整数
'暂停屏幕并显示它正忙
沙漏真的吗
我,画=假
'只要在列表的末尾创建新记录就行了,若你们在那个里的话
如果AIN=DMax(“AIN”、“DVD和蓝光”),则
CurrentRecord=AIN
文件编号:GoToRecord,acNewRec
AIN=当前记录+1
DoCmd.RunCommand acCmdSaveRecord
其他的
'保存当前记录值
CurrentRecord=AIN
'在列表末尾创建新记录,并给它一个新记录编号
DoCmd.RunCommand AccmdRecordsGatolast
LastRecord=AIN
文件编号:GoToRecord,acNewRec
AIN=LastRecord+1
DoCmd.RunCommand acCmdSaveRecord
'将所有记录从结束向后增加一个到当前记录
而不是现在的记录
AIN=AIN+1
DoCmd.RunCommand acCmdSaveRecord
DoCmd.GoToRecord,ACP
温德
'返回到最后一条记录并将其插入当前记录之后
DoCmd.RunCommand AccmdRecordsGatolast
AIN=当前记录+1
DoCmd.RunCommand acCmdSaveRecord
'取消暂停屏幕
我。绘画=真实
沙漏假文件
'刷新表单,使新记录位于正确位置并打开它
我,再询问
DoCmd.GoToRecord,acGoTo,CurrentRecord+1
如果结束
端接头

\u AfterUpdate()而不是_Click()?我想要一个“新记录”按钮,因此如果我有897条记录并且想在#205之后插入一条记录,我想我需要它:1)创建新的空白记录898,2)增加所有记录206-898到207-899 3)将记录899更改为206。实际上,我有一个“新记录”按钮-我想要一个“插入记录”“按钮。不,要简单得多。没有点击或按钮。您只需编写分配给它的新记录。它将自动排序。稍后,将任何记录更改为(比如)334,它将自动重新定位。我讨厌迂腐,但您的建议对我希望数据库的运行方式以及与数据库的交互方式进行了根本性的更改。我只需要表单上的一个按钮,在表单中当前选中的记录之后创建一个新记录。