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. 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
    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. ;-)

        A la réflexion, je verrais bien un petit IF à la place du While.... Ca me semble plus logique... ?
        1. ;-)

          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
        2. 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...