2013-07-23 1 views
0

Fondamentalement, je veux retourner les valeurs de numéro de ligne dans les deux dossiers quand quelqu'un les changements dans le sous-formulairerecords flip dans l'accès aux sous-formulaire

donc si j'ai ligne:

12345 et je renomme 5 à 3 I voulez 5 renuméroté à 3 et 3 renuméroté à 5 donc j'aurais 12543 mais ils se remanient à 12345 mais les disques changent de place correctement Cependant j'obtiens une erreur (voir ci-dessous) et si je change d'enregistrement 1 il ne trouve aucun enregistrement

Le code que j'ai pour l'instant est:

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 

et échoue à #Ici avec la mise à jour d'erreur ou CancelUpdate sans ajouter de nouveaux ou modifier

Répondre

0

Avant de changer une valeur sur un enregistrement de DAO vous devez exécuter la méthode Edit. Et puis vous devez exécuter la méthode Update après l'avoir modifiée.

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 

Voici une fonction que j'utilise ce fait quelque chose de tout à fait similaire. J'ai une forme principale avec des boutons avec des flèches haut et bas sur eux, et une sous-forme de feuille de données (forme continue fonctionnerait aussi). Chaque ligne du sous-formulaire comporte un champ RowOrder avec une valeur commençant à 1. Ces valeurs sont affectées lorsque l'utilisateur ajoute de nouveaux enregistrements.

Lorsque l'utilisateur souhaite modifier l'ordre des enregistrements dans le sous-formulaire, il utilise simplement les boutons fléchés situés sur le formulaire principal. Une chose qui ne figure pas dans mon code ici est la vérification d'un nouvel enregistrement ou la vérification de l'absence d'enregistrements. Une autre chose que ma fonction ne fait pas est de réorganiser ou de réparer toutes les lignes. Cela n'affecte que la ligne focale et celle située au-dessus ou au-dessous. Voici le code:

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

ce qui est "FRM RowOrder!" Dans iCurRowOrder = Nz (FRM RowOrder, 0!)? – CCG121

+0

serait-il ma colonne OrderLineNumber dans le sous-formulaire de feuille de données? – CCG121

+0

Oui, tout endroit où vous voyez RowOrder dans mon code, remplacez-le simplement par OrderLineNumber. – HK1