0

基本的に、誰かがサブフォームで変更したときに、2 つのレコードの行番号の値を反転させたい

だから私が行を持っている場合:

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 でエラー update または cancelupdate なしで add new または edit で失敗しています

4

1 に答える 1

0

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

これは、私が使用する関数で、非常に似たようなことを行います。上向き矢印と下向き矢印の付いたボタンを備えたメイン フォームと、データシート サブフォーム (連続フォームも機能します) があります。サブフォームのすべての行には、1 から始まる値を持つ RowOrder フィールドがあります。これらの値は、ユーザーが新しいレコードを追加すると割り当てられます。

ユーザーがサブフォーム内のレコードの順序を変更したい場合は、メイン フォームにある矢印ボタンを使用するだけです。ここで私のコードにないことの 1 つは、新しいレコードのチェック、またはレコードが入力されていないかどうかのチェックです。私の関数が行わないもう 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
于 2013-07-23T14:58:45.057 に答える