2013-07-23 79 views
0

基本上我想翻轉的兩個記錄行數的值,當有人在子窗體改變他們翻轉記錄

所以,如果我有一行:

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錯誤更新或cancelupdate失敗沒有添加新的或編輯

回答

0

你需要運行的編輯方法的DAO記錄變化值之前。然後,您需要在更改後運行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 
+0

什麼是 「FRM RowOrder!」 在iCurRowOrder = NZ(FRM RowOrder,0!)? – CCG121

+0

它是數據表子表單中的我的OrderLineNumber列嗎? – CCG121

+0

是的,任何你在我的代碼中看到RowOrder的地方,只需用OrderLineNumber替換它即可。 – HK1