【问题标题】:flip records in subform access在子表单访问中翻转记录
【发布时间】:2013-07-22 17:21:52
【问题描述】:

基本上,当有人在子表单中更改它们时,我想翻转两条记录中的行号值

所以如果我有行:

12345 并且我将 5 重命名为 3 我希望将 5 重新编号为 3 并将 3 重新编号为 5,因此我将拥有 12543 但它们重新排列为 12345 但记录正确切换位置 但是我收到一个错误(见下文),如果我更改记录 1,它找不到任何记录

我目前的代码是:

Private Sub OrderLineNumber_AfterUpdate()
Dim rst As DAO.Recordset
Set rst = Me.Recordset
Dim recNum As Integer
Dim recVal As Double
Dim move As Integer
Dim i As Integer
recNum = Me.CurrentRecord
Me.Requery
DoCmd.GoToRecord , , acGoTo, recNum
recVal = rst!OrderLineNumber.Value
rst.MoveFirst
Do Until rst.EOF
    i = rst!OrderLineNumber.Value
    If i = recVal Then
        move = Me.CurrentRecord
    End If
    rst!OrderLineNumber.Value = recVal #Here
    DoCmd.GoToRecord , , acGoTo, recNum
    rst!OrderLineNumber.Value = i
rst.MoveNext
Loop
End Sub

并且在#Here 失败,错误更新或取消更新而没有添加新的或编辑

【问题讨论】:

    标签: ms-access vba ms-access-2007 recordset subform


    【解决方案1】:

    在更改 DAO 记录的值之前,您需要运行 Edit 方法。然后你需要在更改后运行Update方法。

    Private Sub OrderLineNumber_AfterUpdate()
        Dim rst As DAO.Recordset
        Set rst = Me.Recordset
        Dim recNum As Integer
        Dim recVal As Double
        Dim move As Integer
        Dim i As Integer
        recNum = Me.CurrentRecord
        Me.Requery
        DoCmd.GoToRecord , , acGoTo, recNum
        recVal = rst!OrderLineNumber.Value
        rst.MoveFirst
        Do Until rst.EOF
            i = rst!OrderLineNumber.Value
            If i = recVal Then
                move = Me.CurrentRecord
            End If
            rst.Edit
            rst!OrderLineNumber.Value = recVal #Here
            rst.Update
            DoCmd.GoToRecord , , acGoTo, recNum
            rst.Edit
            rst!OrderLineNumber.Value = i
            rst.Update
            rst.MoveNext
        Loop
    End Sub
    

    这是我使用的功能非常相似的功能。我有一个带有向上和向下箭头按钮的主表单,还有一个数据表子表单(连续表单也可以)。子表单中的每一行都有一个 RowOrder 字段,其中的值从 1 开始。这些值在用户添加新记录时被分配。

    当用户想要更改子表单中记录的顺序时,他们只需使用位于主表单上的箭头按钮即可。我的代码中没有的一件事是检查新记录,或者检查他们是否没有输入记录。我的函数不做的另一件事是重新排序或修复所有行。它只影响焦点所在的行以及它上面或下面的行。代码如下:

    Private Sub cmdUp_Click()
        'Put an "Up" button on one of your forms and pass the function a correct form object
        Call MoveCurrentRecordUpOrDown("Up", Me.subform1.Form)
    End Sub
    
    Private Sub cmdDown_Click()
    'Put a "Down" button on one of your forms and pass the function a correct form object
        Call MoveCurrentRecordUpOrDown("Down", Me.subform1.Form)
    End Sub 
    
    Public Function MoveCurrentRecordUpOrDown(sDirection As String, frm As Form)
        Dim lPos As Integer
        Dim iCurRowOrder As Integer
        iCurRowOrder = Nz(frm!RowOrder, 0)
    
        'Check to see if the record is already up against one of the ends
        Dim iChange As Integer
        Select Case sDirection
            Case "Up"
                If iCurRowOrder = 1 Then Exit Function 'Cannot move record up
                iChange = -1
            Case "Down"
                If iCurRowOrder = frm.Recordset.RecordCount Then Exit Function 'Cannot move record down
                iChange = 1
        End Select
    
        lPos = frm.Recordset.AbsolutePosition + iChange
        Dim rs As DAO.Recordset
        Set rs = frm.RecordsetClone
        If Not (rs.EOF And rs.BOF) Then
            rs.MoveFirst
            Do Until rs.EOF = True
                If rs!RowOrder = iCurRowOrder Then
                    rs.Edit
                    rs!RowOrder = iCurRowOrder + iChange
                    rs.Update
                ElseIf rs!RowOrder = (iCurRowOrder + iChange) Then
                    rs.Edit
                    rs!RowOrder = iCurRowOrder
                    rs.Update
                End If
                rs.MoveNext
            Loop
            frm.Requery
            If lPos > (frm.Recordset.RecordCount - 1) Then
                lPos = (frm.Recordset.RecordCount - 1)
            End If
            frm.Recordset.AbsolutePosition = lPos
        End If
        rs.Close
        Set rs = Nothing
    
    End Function
    

    【讨论】:

    • iCurRowOrder = Nz(frm!RowOrder, 0) 中的“frm!RowOrder”是什么?
    • 它会是我在数据表子表单中的 OrderLineNumber 列吗?
    • 是的,您在我的代码中看到 RowOrder 的任何地方,只需将其替换为 OrderLineNumber。
    • 太好了,它在循环中的第一个失败,我没有仔细阅读
    • 顺便说一句,我什至没有在表单中显示我的 RowOrder 字段。用户不知道是什么魔法使行以正确的顺序显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多