Remplissage MSflexgrid DAO

Résolu
Signaler
Messages postés
170
Date d'inscription
vendredi 16 janvier 2004
Statut
Membre
Dernière intervention
13 juin 2010
-
Messages postés
170
Date d'inscription
vendredi 16 janvier 2004
Statut
Membre
Dernière intervention
13 juin 2010
-
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

Messages postés
170
Date d'inscription
vendredi 16 janvier 2004
Statut
Membre
Dernière intervention
13 juin 2010

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
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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+

 
Messages postés
170
Date d'inscription
vendredi 16 janvier 2004
Statut
Membre
Dernière intervention
13 juin 2010

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
Messages postés
170
Date d'inscription
vendredi 16 janvier 2004
Statut
Membre
Dernière intervention
13 juin 2010

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
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
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+
Messages postés
1883
Date d'inscription
samedi 1 avril 2006
Statut
Membre
Dernière intervention
20 novembre 2007
2
je vois que j' ai posté trop tard !
Messages postés
170
Date d'inscription
vendredi 16 janvier 2004
Statut
Membre
Dernière intervention
13 juin 2010

Je te remercie d'avoir planché sur le problème. J'essaierais tout de même un peu plus tard ton code

@+++
marcod59