ACCESS Fonction VBA

ChBro Messages postés 17 Date d'inscription   Statut Membre Dernière intervention   -  
ChBro Messages postés 17 Date d'inscription   Statut Membre Dernière intervention   -
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

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

A la réflexion, je verrais bien un petit IF à la place du While.... Ca me semble plus logique... ?
0
random Messages postés 1612 Date d'inscription   Statut Membre Dernière intervention   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

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

Posez votre question
ChBro Messages postés 17 Date d'inscription   Statut Membre Dernière intervention  
 
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