ACCESS Fonction VBA

A partir d'une requête SQL ordonné sur un champ défini, je désire , à partir d'une fonction, attribué un N° d'ordre pour chacun des enregistrements. Cela fonctionne mais....sur une jambe.
Exemple: La requête me donne pour réponse dans un champ JEAN , ARTHUR, puis PHILIPPE .... dans l'autre champ le N° d'ordre à attribuer . La fonction balaie tous les records (il y en a 200000) et vient incrémenter de 1 l'autre champs de la requête.
Le problème est que la fonction omet certaines lignes d'enregistrement sans aucune raison apparente et de manière aléatoire. Curieux ???
Le problème vient -il du fait que je travaille sur base d'une requête et non d'une table ?
Merci d'avance pour une réponse éventuelle.

5 réponses

  1. Modérateur
    Salut,

    dans access (comme dans beaucoup de SGBD) les données renvoyées par des tables, requêtes (voire snapshots) sont traitées de la même façon -> le problème ne vient pas de là...

    Peux-tu nous éclairer sur ta fonction ?
    On ne sait pas ce qu'elle fait, comment tu l'appelles...

    Bref, tous les renseignements possibles...
    1. Ci-dessous la fct utilisée.

      Function Test()

      Dim Bds As DAO.Database
      Dim rdst As DAO.Recordset
      Dim val As String

      On Error GoTo Champ5_error

      SQEL = "SELECT Table.Champ1, Table.Champ2, Table.Champ3, Table.Champ4, Table.Champ5 FROM Table " & _
      "ORDER BY Table.Champ1, Table.Champ2 DESC , Table.Champ3, Table.Champ4;"

      Set Bds = CurrentDb
      Set rdst = Bds.OpenRecordset(SQEL)

      rdst.MoveFirst
      While Not (rdst.EOF)
      val = rdst.Fields("Champ1").Value & rdst.Fields("Champ4").Value
      i = 1
      While rdst.Fields("Champ1").Value & rdst.Fields("Champ4").Value = val
      With rdst
      .Edit
      ![Champ5] = i
      .Update
      End With
      i = i + 1
      rdst.MoveNext
      If rdst.EOF = True Then Exit Function
      Wend
      Wend
      Space 1048576
      rdst.Close
      Set Bds = Nothing

      Test_Exit:
      Exit Function

      Encore merci...
  2. ;-)

    Moi, j'aurais écrit ça comme ça :
    Function Test()
    
    Dim Bds, Rdst
    Dim Val, X
    
    On Error GoTo Test_Exit
    
    SQEL = "SELECT Table.Champ1, Table.Champ2, Table.Champ3, Table.Champ4, Table.Champ5 FROM Table " & _
    "ORDER BY Table.Champ1, Table.Champ2 DESC , Table.Champ3, Table.Champ4;"
    
    Set Bds = CurrentDb
    Set Rdst = Bds.OpenRecordset(SQEL)
    
    Rdst.Movelast
    Rdst.MoveFirst
    
    For X = 1 To Rdst.RecordCount
      Val = Rdst("Champ1") & Rdst("Champ4")
      i = 1
      While Rdst("Champ1") & Rdst("Champ4") = Val
          Rdst.Edit
          Rdst("Champ5") = i
          Rdst.Update
          i = i + 1
          Rdst.MoveNext
          Wend
      Next
    Space 1048576
    Rdst.Close
    Set Bds = Nothing
    
    Test_Exit:
    Exit Function
    


    Mais je me rends compte qu'il y a un truc bizarre : Pourquoi 2 boucles ?
    1. Modérateur
      Tant qu'ils s'appellent JEAN DUPONT on incrémente le compteur de doublon :

      JEAN DUPONT 1
      JEAN DUPONT 2
      JEAN DUPONT 3
      ...

      Mais je n'arrive pas à comprendre pourquoi il perd des clients en route, et de manière aléatoire...
    2. @blux;-) Bin moi, je ne comprends pas pourquoi une fonction, ou alors, j'aurais uniquement passé le While en fonction puisque que le MoveNext est dedans, mais bon, j'attends des éclaircissements...
      ;-)
    3. @WhiteFangEn tous cas, merci à tous pour votre aide
      Ci dessous vous trouverez un exemple
      Table de départ:
      A B C D Sequence
      ------------------------------
      A 1 450 z ?
      A 2 400 a
      A 1 100 a
      A 1 200 a
      B 2 100 z
      B 2 300 a
      B 3 200 z
      B 3 500 a
      C 1 200 a
      B 2 200 a
      A 2 100 z
      C 1 100 z

      Résultat à obtenir

      A B D C Séquence
      ------------------------------
      A 1 z 450 1
      A 1 a 100 2
      A 1 a 200 3
      A 2 z 100 1
      A 2 a 400 2
      B 2 z 100 1
      B 2 a 200 2
      B 2 a 300 3
      B 3 z 200 1
      B 3 a 500 2
      C 1 z 100 1
      C 1 a 200 2

      Bien à vous
  3. ;-)

    A la réflexion, je verrais bien un petit IF à la place du While.... Ca me semble plus logique... ?
    1. le truc.movenext semble devoir se loger entre les deux wend
      et non audessus du premier
      tu aurais pu faire
      index=0
      nom=""
      while not truc.eof
      if truc![nom]=nom
      then index=index+1
      truc![index]=index
      else
      index=0
      nom=truc![nom]
      end if
      truc.movenext

      1. En tous cas, merci à tous pour votre aide
        Ci dessous vous trouverez un exemple
        Table de départ:
        A B C D Sequence
        ------------------------------
        A 1 450 z ?
        A 2 400 a
        A 1 100 a
        A 1 200 a
        B 2 100 z
        B 2 300 a
        B 3 200 z
        B 3 500 a
        C 1 200 a
        B 2 200 a
        A 2 100 z
        C 1 100 z

        Résultat à obtenir

        A B D C Séquence
        ------------------------------
        A 1 z 450 1
        A 1 a 100 2
        A 1 a 200 3
        A 2 z 100 1
        A 2 a 400 2
        B 2 z 100 1
        B 2 a 200 2
        B 2 a 300 3
        B 3 z 200 1
        B 3 a 500 2
        C 1 z 100 1
        C 1 a 200 2

        Bien à vous