ACCESS Fonction VBA

Fermé
ChBro Messages postés 17 Date d'inscription mardi 22 juin 2004 Statut Membre Dernière intervention 24 août 2006 - 25 oct. 2005 à 20:19
ChBro Messages postés 17 Date d'inscription mardi 22 juin 2004 Statut Membre Dernière intervention 24 août 2006 - 30 oct. 2005 à 11:06
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 26000 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
26 oct. 2005 à 08:48
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 mardi 22 juin 2004 Statut Membre Dernière intervention 24 août 2006
27 oct. 2005 à 08:54
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 2056 Date d'inscription dimanche 1 septembre 2002 Statut Membre Dernière intervention 15 février 2008 204
27 oct. 2005 à 14:39
;-)

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 26000 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024 3 289
27 oct. 2005 à 16:03
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 2056 Date d'inscription dimanche 1 septembre 2002 Statut Membre Dernière intervention 15 février 2008 204 > blux Messages postés 26000 Date d'inscription dimanche 26 août 2001 Statut Modérateur Dernière intervention 24 avril 2024
27 oct. 2005 à 16:12
;-) 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 mardi 22 juin 2004 Statut Membre Dernière intervention 24 août 2006 > WhiteFang Messages postés 2056 Date d'inscription dimanche 1 septembre 2002 Statut Membre Dernière intervention 15 février 2008
30 oct. 2005 à 11:06
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 2056 Date d'inscription dimanche 1 septembre 2002 Statut Membre Dernière intervention 15 février 2008 204
27 oct. 2005 à 14:41
;-)

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 vendredi 26 novembre 2004 Statut Membre Dernière intervention 30 mars 2006 155
27 oct. 2005 à 17:40
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 mardi 22 juin 2004 Statut Membre Dernière intervention 24 août 2006
28 oct. 2005 à 09:40
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