ACCESS Fonction VBA

ChBro Messages postés 17 Statut Membre -  
ChBro Messages postés 17 Statut Membre -
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. blux Messages postés 5043 Date d'inscription   Statut Modérateur Dernière intervention   3 455
     
    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...
    0
    1. ChBro Messages postés 17 Statut Membre
       
      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...
      0
  2. WhiteFang Messages postés 2063 Statut Membre 204
     
    ;-)

    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 ?
    0
    1. blux Messages postés 5043 Date d'inscription   Statut Modérateur Dernière intervention   3 455
       
      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...
      0
      1. WhiteFang Messages postés 2063 Statut Membre 204 > blux Messages postés 5043 Date d'inscription   Statut Modérateur Dernière intervention  
         
        ;-) 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...
        ;-)
        0
      2. ChBro Messages postés 17 Statut Membre > WhiteFang Messages postés 2063 Statut Membre
         
        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
        0
  3. WhiteFang Messages postés 2063 Statut Membre 204
     
    ;-)

    A la réflexion, je verrais bien un petit IF à la place du While.... Ca me semble plus logique... ?
    0
  4. random Messages postés 1612 Statut Membre 155
     
    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

    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ChBro Messages postés 17 Statut Membre
     
    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
    0