Remplissage MSflexgrid DAO

Résolu
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010 - 13 août 2006 à 14:22
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010 - 13 août 2006 à 21:28
Bonjour,

J'ai une base de données ACCES qui remplit un contrôle MSFlexgrid. Je voudrais que seuls les 50 derniers enregistrements soient visibles dans ce contrôle. Voici le code que j'ai essayé, mais qui ne fonctionne pas, j'ai l'erreur 3265  Elémént non trouvé dans cette collection. Quelqu'un voit-il où se situe l'erreur et comment y remédier ? Voici le code que j'utilise :

Set db = OpenDatabase(App.Path & "\base.mdb")
sql = "select * from suivi" ' On séléctionne tous les champs de la table suivi
Set rs = db.OpenRecordset(sql, dbOpenSnapshot) '
s$ = "N° |> N° OP                    |>Type                  |> reg  |>Date & Heure                       |>Libellé                                                                                                                                   "
Grid1.FormatString = s$
'a = Data1.Recordset.RecordCount
rs.MoveLast
a = rs.RecordCount
rs.MoveFirst
If a > 10 Then
b = a - 10
b = CLng(b)


    rs.Move (b)
Do While Not b = a
    Grid1.AddItem rs.Fields(b)
    b = b + 1
Loop
rs.Close
End If

Merci d'avance
@+++

marcod59

7 réponses

marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
13 août 2006 à 20:51
Plus la peine de chercher, j'ai trouvé un code qui me convient que voici :


Set db = OpenDatabase(App.Path & "\base.mdb")
sql = "select * from suivi" ' On séléctionne tous les champs de la table suivi
Set rs = db.OpenRecordset(sql, dbOpenSnapshot) '
s$ = "N° |> N° OP                    |>Type                  |> reg  |>Date & Heure                       |>Libellé                                                                                                                                   "
Grid1.FormatString = s$
rs.MoveLast
a = rs.RecordCount
rs.MoveFirst
If a > 10 Then
b = CLng(a - 10)


    rs.Move (b)
Do While Not b = a
   un=rs.Fields(0)
   de=rs.Fields(1)
   tr=rs.Fields(2)
   qu=rs.Fields(3)
   ci=rs.Fields(4)
tou = "" & Chr(9) & un & Chr(9) & de & Chr(9) & tr & Chr(9) & qu & Chr(9) & ci
    Grid1.AddItem tou
    b = b + 1
    rs.MoveNext
Loop
rs.Close
End If

Merci tout de même
@+++

marcod59
3
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
13 août 2006 à 17:37
Bonjour,
>Elémént non trouvé dans cette collection...
signifie que le champ référencé  (Fields(b) en l' occurence)  n' existe pas dans la collection
des champs de ta table.

causes :
 -b dépasse le nombre de champs de la table
- b est négatif
- b non déclarée

D' autre part je n' ai pas compris ton raisonnement dans Do While...
Peux-tu m' en dire plus ?

a+

 
0
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
13 août 2006 à 19:45
Tout d'abord, je rectifie un peu ma question du départ. J'ai mis 50 derniers enregistrements et dans mon code je table sur 10, ceci a été fait pour essayer. Pour la boucle Do While et bien je débute avec (b) qui est le dernier enregistrement moins 10 et je sors de la boucle une fois que j'atteins la fin des enregistrements (a).

Merci d'avoir répondu.
marcod59
0
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
13 août 2006 à 20:32
Dans mon code, il doit y avoir une autre erreur. Grid1.AddItem rs.Fields(b) ne fait référence qu'à un champ de la base, alors qu'il faut que je remplisse 5 colonnes du MSFlexGrid (dans la base il y a également 5 colonnes)

marcod59
0

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

Posez votre question
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
13 août 2006 à 21:11
Oui c' est ce que je vois.
En fait tu confonds n° d' enregistrement et index du champ.
Dans Fields(b), b doit faire référence à une colonne de la table (index du champ)
Essaies plutôt ceci

On error resume next ' au cas ou ta table serait vide, sinon
                                        '   sans ça cela MoveLast et MoveFirst
                                         'provoque  une erreur
With rs
 'remplir le recordset
.MoveLast
.MoveFirst 
if .Bof and .Eof Then Exit Sub    'tu peux ajouter MsgBox "Table vide "
a = .RecordCount
Dim i as integer
If a >= 10 Then 
  i=10 ' puisque tu table sur 10
Else
   i=a   'moins de 10
End if

Dim y as integer
y=0  'ligne du Grid

  .MoveLast
Do While Not .Bof And i>1
    y=y+1
   Grid1.TextMatrix(y,1).Text  rs.Fields(1)
   Grid1.TextMatrix(y,2).Text   rs.Fields(2)
   Grid1.TextMatrix(y,3).Text  rs.Fields(3)
   Grid1.TextMatrix(y,4).Text rs.Fields(4)
   Grid1.TextMatrix(y,5).Text rs.Fields(5)
     '1,2,3,4,5 représentent les index des champs
     'tu peux remplacer rs.Fields(1)....PAR rs![NomDuChamp]
   i=i-1
   if Not .Bof then .MovePreview
Loop
.Close
End With

J' espère que ça marchera pour toi..
a+
0
chaibat05 Messages postés 1883 Date d'inscription samedi 1 avril 2006 Statut Membre Dernière intervention 20 novembre 2007 2
13 août 2006 à 21:12
je vois que j' ai posté trop tard !
0
marcod59 Messages postés 170 Date d'inscription vendredi 16 janvier 2004 Statut Membre Dernière intervention 13 juin 2010
13 août 2006 à 21:28
Je te remercie d'avoir planché sur le problème. J'essaierais tout de même un peu plus tard ton code

@+++
marcod59
0
Rejoignez-nous