ACCESS Fonction VBA
ChBro
Messages postés
17
Statut
Membre
-
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.
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
-
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...
-
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...
-
-
;-)
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 ?-
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...
- 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
-
-
;-)
A la réflexion, je verrais bien un petit IF à la place du While.... Ca me semble plus logique... ? -
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
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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