Recordset & VBA

soleil_levant Messages postés 426 Statut Membre -  
soleil_levant Messages postés 426 Statut Membre -
Bonjour,

Comment peux t-on comparer deux valeurs de champs d'un Recordset?
Je m'exprime, j'ai 1 recordset issu d'une requête. Je me place dans la ligne N (avec une boucle), je me place dans le champ 3 de cette meme ligne, je veux comparer sa valeur avec celle d'avant (N-1)
Quelqu'un a une idée s'il vous plaît?

Merci d'avance.
Configuration: Windows XP
Firefox 3.0.3

4 réponses

  1. arthur24 Messages postés 19 Statut Membre 1
     
    Hello,

    2 solutions à ton pb :
    - par prog :
    1°) tu ouvres ton rs et tu fais une première lecture de ton champs dans une variable temp
    2°) tu fais une nouvelle lecture et tu compares temp et son équivalent dans le rs en cours
    3°) tu sauvagardes le champs en cours dans temp
    4°) tu boucles sur 2-3 jusqu'à la fin de ton jeux de données

    - par requète, tu constitue un jeux de données contenant, sur chaque ligne N et N-1 et tu compare directement à chaque itération de ta boucle. La requète peut ressembler à ça :

    select *
    FROM Table1 LEFT OUTER JOIN Table1 Table2 ON
    Table1.clé = Table2.clé AND Table1.NumLigne = Table2.NumLigne + 1
    ORDER BY Table1.clé, Table1.NumLigne

    Dans ce cas, table1 et table2 sont identiques, la même table appelée 2 fois dans la requète. Il suffit que ces tables soient dotées d'un compteur pour la correspondance.

    Bon courage !
    1
  2. soleil_levant Messages postés 426 Statut Membre 32
     
    Merci Arthur,

    J'ai fais un code depuis tout à l'heure (ici il compare avec la valeur d'après ensuite reviens à la position d'avant car il est déja dans une boucle), il me semble bon mais il bloque :
    '****DEPLACEMENT DE CURSEUR AUTOUR ****
    '****DU RECORDSET POUR COMPARER LA REF*
    'For k = 1 To rs_source.RecordCount
    'While Not(rs_source.EOF)
    DIM compare1 AS String, compare2 As String
    compare1 = rs_source.Fields(1)
    rs_source.MoveNext
    compare2 = rs_source.Fileds(1)
    if (compare1 <> compare2) Then 'Revenir à la boucle de départ
    Else 'Ecrire dans le meme fichier
    End IF
    rs_source.MovePrevious

    'Next k

    '****FIN DE DEPLACEMENT DU CURSEUR****

    Ce code est à l'intérieur d'une autre boucle Do Until(rs_source.EOF). Je pense que c'est la d'ou vient le problème peut etre. Si tu veux jeter un coup d'oeil sur mon code entier dis moi et je le met en pièce jointe.

    Merci d'avance ;D
    1
  3. arthur24 Messages postés 19 Statut Membre 1
     
    ça ne marchera pas. Tu ne testes pas l'EOF sur ta seconde lecture et tu vas te planter en fin de rs.

    DIM compare1 AS String
    rs_source.open...
    if not rs_source.EOF then
    compare1 = rs_source.Fields(1)
    rs_source.movenext
    end if

    While Not(rs_source.EOF)
    if (compare1 <> rs_source.Fields(1)) Then
    ' ton traitement en cas de différence
    Else
    ' ton traitement en cas d'égalité
    End IF
    compare1 = rs_source.Fileds(1)
    rs_source.MoveNext
    wend

    Du coup compare2 est inutile

    A+
    0
    1. soleil_levant Messages postés 426 Statut Membre 32
       
      Salut arthur 24

      Je reviens vers toi pour te donner des nouvelles concernant La navigation dans le RecordSet.

      le code que tu m'as donné me revoie toujours l'erreur me disant que suis en fin du RecordSet :(

      If Not rs_source.EOF Then
      compare1 = rs_source.Fields(0)
      rs_source.MoveNext
      End If

      While Not (rs_source.EOF)
      If ((compare <> rs_source.Fields(0) And rs_source.AbsolutePosition = 0) Or (compare <> rs_source.Fields(0) And rs_source.AbsolutePosition <> 0)) Then
      GoTo CreateNouveauFichier
      Else
      GoTo AjouterMemeFichier
      End If

      compare1 = rs_source.Fields(0)
      rs_source.MoveNext
      Wend
      L'erreur me dis que Aucun Enregistrement trouvé :(

      Je Rappel Que le meme RecordSet est appelé dans le meme code pour traiter ses enregistrement 1 par 1.

      Merci d'avance
      0
  4. soleil_levant Messages postés 426 Statut Membre 32
     
    Merci pour ta réponse,
    En faite, mon rs_source.EOF est vérifié au début du code. C'est pour ça je reviens à l'enregistrement en cour avec MoveNext
    Ta solution est bonne, je vais la tester et te donnerais des nouvelles dès ce soir :)
    Encore merci
    0